storage: introduce find_active_for_session for PATs

This commit is contained in:
Olivier 'reivilibre
2025-10-16 12:07:58 +01:00
parent 95f4c9a8e5
commit 46045d44bc
4 changed files with 105 additions and 1 deletions

View 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"
}

View File

@@ -23,7 +23,7 @@
"Left": []
},
"nullable": [
false,
true,
true,
null
]

View File

@@ -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,

View File

@@ -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),