Skip to main content

systemprompt_users/repository/
api_key_session.rs

1//! The gateway session bound to each API key (`api_key_sessions`).
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use systemprompt_identifiers::{ApiKeyId, SessionId};
7
8use crate::error::Result;
9use crate::repository::UserRepository;
10
11impl UserRepository {
12    pub async fn find_api_key_session(&self, api_key_id: &ApiKeyId) -> Result<Option<SessionId>> {
13        let row = sqlx::query_scalar!(
14            "SELECT session_id FROM api_key_sessions WHERE api_key_id = $1",
15            api_key_id.as_str(),
16        )
17        .fetch_optional(&*self.write_pool)
18        .await?;
19        Ok(row.map(SessionId::new))
20    }
21
22    pub async fn set_api_key_session(
23        &self,
24        api_key_id: &ApiKeyId,
25        session_id: &SessionId,
26    ) -> Result<()> {
27        sqlx::query!(
28            r#"
29            INSERT INTO api_key_sessions (api_key_id, session_id)
30            VALUES ($1, $2)
31            ON CONFLICT (api_key_id)
32            DO UPDATE SET session_id = EXCLUDED.session_id, bound_at = CURRENT_TIMESTAMP
33            "#,
34            api_key_id.as_str(),
35            session_id.as_str(),
36        )
37        .execute(&*self.write_pool)
38        .await?;
39        Ok(())
40    }
41}