systemprompt-oauth 0.9.2

OAuth 2.0 / OIDC with PKCE, token introspection, and audience/issuer validation for systemprompt.io AI governance infrastructure. WebAuthn and JWT auth for the MCP governance pipeline.
Documentation
//! OAuth client repository: queries, mutations, relations, cleanup.

mod cleanup;
mod inserts;
mod mutations;
mod queries;
mod relations;

use chrono::Utc;
use sqlx::PgPool;
use std::sync::Arc;
use systemprompt_database::DbPool;
use systemprompt_identifiers::ClientId;

#[derive(Clone, Debug)]
pub struct ClientRepository {
    pool: Arc<PgPool>,
    write_pool: Arc<PgPool>,
}

impl ClientRepository {
    pub fn new(db: &DbPool) -> crate::error::OauthResult<Self> {
        let pool = db.pool_arc()?;
        let write_pool = db.write_pool_arc()?;
        Ok(Self { pool, write_pool })
    }
}

#[derive(Debug, Clone)]
pub struct CreateClientParams {
    pub client_id: ClientId,
    pub client_secret_hash: String,
    pub client_name: String,
    pub redirect_uris: Vec<String>,
    pub grant_types: Option<Vec<String>>,
    pub response_types: Option<Vec<String>>,
    pub scopes: Vec<String>,
    pub token_endpoint_auth_method: Option<String>,
    pub client_uri: Option<String>,
    pub logo_uri: Option<String>,
    pub contacts: Option<Vec<String>>,
}

#[derive(Debug, Clone)]
pub struct UpdateClientParams {
    pub client_id: ClientId,
    pub client_name: String,
    pub redirect_uris: Vec<String>,
    pub grant_types: Option<Vec<String>>,
    pub response_types: Option<Vec<String>>,
    pub scopes: Vec<String>,
    pub token_endpoint_auth_method: Option<String>,
    pub client_uri: Option<String>,
    pub logo_uri: Option<String>,
    pub contacts: Option<Vec<String>>,
}

#[derive(Debug, Clone, sqlx::FromRow)]
pub struct ClientSummary {
    pub client_id: ClientId,
    pub client_name: String,
    pub created_at: chrono::DateTime<Utc>,
    pub updated_at: chrono::DateTime<Utc>,
}

#[derive(Debug, Clone, sqlx::FromRow)]
pub struct ClientUsageSummary {
    pub client_id: ClientId,
    pub client_name: String,
    pub created_at: chrono::DateTime<Utc>,
    pub updated_at: chrono::DateTime<Utc>,
    pub last_used_at: Option<chrono::DateTime<Utc>>,
}