Skip to main content

alibi_sqlx/store/entities/
oauth_refresh_token.rs

1use crate::{JsonMetadata, SqlxModel};
2use chrono::{DateTime, Utc};
3#[derive(
4    Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize, sqlx::FromRow, SqlxModel,
5)]
6#[auth(table = "oauthRefreshToken")]
7pub struct Model {
8    pub id: String,
9    #[serde(rename = "token")]
10    pub token: String,
11    #[sqlx(rename = "clientId")]
12    #[serde(rename = "clientId")]
13    pub client_id: String,
14    #[sqlx(rename = "sessionId")]
15    #[serde(rename = "sessionId")]
16    pub session_id: Option<String>,
17    #[sqlx(rename = "userId")]
18    #[serde(rename = "userId")]
19    pub user_id: String,
20    #[sqlx(rename = "referenceId")]
21    #[serde(rename = "referenceId")]
22    pub reference_id: Option<String>,
23    #[sqlx(rename = "authorizationCodeId")]
24    #[serde(rename = "authorizationCodeId")]
25    pub authorization_code_id: Option<String>,
26    #[serde(rename = "resources")]
27    pub resources: Option<JsonMetadata>,
28    #[sqlx(rename = "requestedUserInfoClaims")]
29    #[serde(rename = "requestedUserInfoClaims")]
30    pub requested_user_info_claims: Option<JsonMetadata>,
31    #[sqlx(rename = "expiresAt")]
32    #[serde(rename = "expiresAt")]
33    pub expires_at: DateTime<Utc>,
34    #[sqlx(rename = "createdAt")]
35    #[serde(rename = "createdAt")]
36    pub created_at: DateTime<Utc>,
37    #[serde(rename = "revoked")]
38    pub revoked: Option<DateTime<Utc>>,
39    #[sqlx(rename = "rotatedAt")]
40    #[serde(rename = "rotatedAt")]
41    pub rotated_at: Option<DateTime<Utc>>,
42    #[sqlx(rename = "rotationReplayResponse")]
43    #[serde(rename = "rotationReplayResponse")]
44    pub rotation_replay_response: Option<String>,
45    #[sqlx(rename = "rotationReplayExpiresAt")]
46    #[serde(rename = "rotationReplayExpiresAt")]
47    pub rotation_replay_expires_at: Option<DateTime<Utc>>,
48    #[sqlx(rename = "authTime")]
49    #[serde(rename = "authTime")]
50    pub auth_time: Option<DateTime<Utc>>,
51    #[serde(rename = "confirmation")]
52    pub confirmation: Option<JsonMetadata>,
53    #[serde(rename = "scopes")]
54    pub scopes: JsonMetadata,
55}
56
57impl TryFrom<Model> for alibi_core::store::OAuthToken {
58    type Error = alibi_core::AuthError;
59    fn try_from(model: Model) -> Result<Self, Self::Error> {
60        let mut metadata = serde_json::to_value(&model)?;
61        let object = metadata
62            .as_object_mut()
63            .ok_or_else(|| alibi_core::AuthError::internal("OAuth token must be an object"))?;
64        for name in [
65            "id",
66            "token",
67            "clientId",
68            "sessionId",
69            "userId",
70            "authorizationCodeId",
71            "createdAt",
72            "expiresAt",
73        ] {
74            _ = object.remove(name);
75        }
76        Ok(Self {
77            id: model.id,
78            token: model.token,
79            client_id: model.client_id,
80            user_id: Some(model.user_id.clone()),
81            session_id: model.session_id,
82            authorization_code_id: model.authorization_code_id,
83            metadata,
84            created_at: model.created_at,
85            expires_at: model.expires_at,
86        })
87    }
88}
89impl Model {
90    pub(crate) fn columns_from_metadata(
91        mut fields: serde_json::Value,
92    ) -> alibi_core::AuthResult<Self> {
93        let object = fields.as_object_mut().ok_or_else(|| {
94            alibi_core::AuthError::bad_request("OAuth token metadata must be an object")
95        })?;
96        for name in ["id", "token", "clientId", "userId"] {
97            _ = object.insert(name.into(), serde_json::Value::String(String::new()));
98        }
99        for name in ["createdAt", "expiresAt"] {
100            _ = object.insert(
101                name.into(),
102                serde_json::Value::String("1970-01-01T00:00:00Z".into()),
103            );
104        }
105        Ok(serde_json::from_value(fields)?)
106    }
107}