alibi-sqlx 0.10.0

SQLx integration for Alibi
Documentation
use crate::{JsonMetadata, SqlxModel};
use chrono::{DateTime, Utc};
#[derive(
    Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize, sqlx::FromRow, SqlxModel,
)]
#[auth(table = "oauthRefreshToken")]
pub struct Model {
    pub id: String,
    #[serde(rename = "token")]
    pub token: String,
    #[sqlx(rename = "clientId")]
    #[serde(rename = "clientId")]
    pub client_id: String,
    #[sqlx(rename = "sessionId")]
    #[serde(rename = "sessionId")]
    pub session_id: Option<String>,
    #[sqlx(rename = "userId")]
    #[serde(rename = "userId")]
    pub user_id: String,
    #[sqlx(rename = "referenceId")]
    #[serde(rename = "referenceId")]
    pub reference_id: Option<String>,
    #[sqlx(rename = "authorizationCodeId")]
    #[serde(rename = "authorizationCodeId")]
    pub authorization_code_id: Option<String>,
    #[serde(rename = "resources")]
    pub resources: Option<JsonMetadata>,
    #[sqlx(rename = "requestedUserInfoClaims")]
    #[serde(rename = "requestedUserInfoClaims")]
    pub requested_user_info_claims: Option<JsonMetadata>,
    #[sqlx(rename = "expiresAt")]
    #[serde(rename = "expiresAt")]
    pub expires_at: DateTime<Utc>,
    #[sqlx(rename = "createdAt")]
    #[serde(rename = "createdAt")]
    pub created_at: DateTime<Utc>,
    #[serde(rename = "revoked")]
    pub revoked: Option<DateTime<Utc>>,
    #[sqlx(rename = "rotatedAt")]
    #[serde(rename = "rotatedAt")]
    pub rotated_at: Option<DateTime<Utc>>,
    #[sqlx(rename = "rotationReplayResponse")]
    #[serde(rename = "rotationReplayResponse")]
    pub rotation_replay_response: Option<String>,
    #[sqlx(rename = "rotationReplayExpiresAt")]
    #[serde(rename = "rotationReplayExpiresAt")]
    pub rotation_replay_expires_at: Option<DateTime<Utc>>,
    #[sqlx(rename = "authTime")]
    #[serde(rename = "authTime")]
    pub auth_time: Option<DateTime<Utc>>,
    #[serde(rename = "confirmation")]
    pub confirmation: Option<JsonMetadata>,
    #[serde(rename = "scopes")]
    pub scopes: JsonMetadata,
}

impl TryFrom<Model> for alibi_core::store::OAuthToken {
    type Error = alibi_core::AuthError;
    fn try_from(model: Model) -> Result<Self, Self::Error> {
        let mut metadata = serde_json::to_value(&model)?;
        let object = metadata
            .as_object_mut()
            .ok_or_else(|| alibi_core::AuthError::internal("OAuth token must be an object"))?;
        for name in [
            "id",
            "token",
            "clientId",
            "sessionId",
            "userId",
            "authorizationCodeId",
            "createdAt",
            "expiresAt",
        ] {
            _ = object.remove(name);
        }
        Ok(Self {
            id: model.id,
            token: model.token,
            client_id: model.client_id,
            user_id: Some(model.user_id.clone()),
            session_id: model.session_id,
            authorization_code_id: model.authorization_code_id,
            metadata,
            created_at: model.created_at,
            expires_at: model.expires_at,
        })
    }
}
impl Model {
    pub(crate) fn columns_from_metadata(
        mut fields: serde_json::Value,
    ) -> alibi_core::AuthResult<Self> {
        let object = fields.as_object_mut().ok_or_else(|| {
            alibi_core::AuthError::bad_request("OAuth token metadata must be an object")
        })?;
        for name in ["id", "token", "clientId", "userId"] {
            _ = object.insert(name.into(), serde_json::Value::String(String::new()));
        }
        for name in ["createdAt", "expiresAt"] {
            _ = object.insert(
                name.into(),
                serde_json::Value::String("1970-01-01T00:00:00Z".into()),
            );
        }
        Ok(serde_json::from_value(fields)?)
    }
}