storage: introduce find_active_for_session for PATs
This commit is contained in:
46
crates/storage-pg/.sqlx/query-d02248136aa6b27636814dee4e0bc38395ab6c6fdf979616fa16fc490897cee3.json
generated
Normal file
46
crates/storage-pg/.sqlx/query-d02248136aa6b27636814dee4e0bc38395ab6c6fdf979616fa16fc490897cee3.json
generated
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"db_name": "PostgreSQL",
|
||||
"query": "\n SELECT personal_access_token_id\n , personal_session_id\n , created_at\n , expires_at\n , revoked_at\n\n FROM personal_access_tokens\n\n WHERE personal_session_id = $1\n AND revoked_at IS NULL\n ",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"ordinal": 0,
|
||||
"name": "personal_access_token_id",
|
||||
"type_info": "Uuid"
|
||||
},
|
||||
{
|
||||
"ordinal": 1,
|
||||
"name": "personal_session_id",
|
||||
"type_info": "Uuid"
|
||||
},
|
||||
{
|
||||
"ordinal": 2,
|
||||
"name": "created_at",
|
||||
"type_info": "Timestamptz"
|
||||
},
|
||||
{
|
||||
"ordinal": 3,
|
||||
"name": "expires_at",
|
||||
"type_info": "Timestamptz"
|
||||
},
|
||||
{
|
||||
"ordinal": 4,
|
||||
"name": "revoked_at",
|
||||
"type_info": "Timestamptz"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Left": [
|
||||
"Uuid"
|
||||
]
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
true
|
||||
]
|
||||
},
|
||||
"hash": "d02248136aa6b27636814dee4e0bc38395ab6c6fdf979616fa16fc490897cee3"
|
||||
}
|
||||
@@ -23,7 +23,7 @@
|
||||
"Left": []
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
true,
|
||||
true,
|
||||
null
|
||||
]
|
||||
|
||||
@@ -128,6 +128,43 @@ impl PersonalAccessTokenRepository for PgPersonalAccessTokenRepository<'_> {
|
||||
Ok(Some(res.into()))
|
||||
}
|
||||
|
||||
#[tracing::instrument(
|
||||
name = "db.personal_access_token.find_active_for_session",
|
||||
skip_all,
|
||||
fields(
|
||||
db.query.text,
|
||||
),
|
||||
err,
|
||||
)]
|
||||
async fn find_active_for_session(
|
||||
&mut self,
|
||||
session_id: Ulid,
|
||||
) -> Result<Option<PersonalAccessToken>, Self::Error> {
|
||||
let res: Option<PersonalAccessTokenLookup> = sqlx::query_as!(
|
||||
PersonalAccessTokenLookup,
|
||||
r#"
|
||||
SELECT personal_access_token_id
|
||||
, personal_session_id
|
||||
, created_at
|
||||
, expires_at
|
||||
, revoked_at
|
||||
|
||||
FROM personal_access_tokens
|
||||
|
||||
WHERE personal_session_id = $1
|
||||
AND revoked_at IS NULL
|
||||
"#,
|
||||
Uuid::from(session_id),
|
||||
)
|
||||
.traced()
|
||||
.fetch_optional(&mut *self.conn)
|
||||
.await?;
|
||||
|
||||
let Some(res) = res else { return Ok(None) };
|
||||
|
||||
Ok(Some(res.into()))
|
||||
}
|
||||
|
||||
#[tracing::instrument(
|
||||
name = "db.personal_access_token.add",
|
||||
skip_all,
|
||||
|
||||
@@ -50,6 +50,22 @@ pub trait PersonalAccessTokenRepository: Send + Sync {
|
||||
access_token: &str,
|
||||
) -> Result<Option<PersonalAccessToken>, Self::Error>;
|
||||
|
||||
/// Find the active access token belonging to a given session.
|
||||
///
|
||||
/// Returns the active access token if it exists, `None` otherwise
|
||||
///
|
||||
/// # Parameters
|
||||
///
|
||||
/// * `session_id`: The ID of the session to lookup
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// Returns [`Self::Error`] if the underlying repository fails
|
||||
async fn find_active_for_session(
|
||||
&mut self,
|
||||
session_id: Ulid,
|
||||
) -> Result<Option<PersonalAccessToken>, Self::Error>;
|
||||
|
||||
/// Add a new access token to the database
|
||||
///
|
||||
/// Returns the newly created access token
|
||||
@@ -102,6 +118,11 @@ repository_impl!(PersonalAccessTokenRepository:
|
||||
access_token: &str,
|
||||
) -> Result<Option<PersonalAccessToken>, Self::Error>;
|
||||
|
||||
async fn find_active_for_session(
|
||||
&mut self,
|
||||
session_id: Ulid,
|
||||
) -> Result<Option<PersonalAccessToken>, Self::Error>;
|
||||
|
||||
async fn add(
|
||||
&mut self,
|
||||
rng: &mut (dyn RngCore + Send),
|
||||
|
||||
Reference in New Issue
Block a user