Skip to main content

alibi_sqlx/store/entities/
oauth_access_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 = "oauthAccessToken")]
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: Option<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 = "refreshId")]
32    #[serde(rename = "refreshId")]
33    pub refresh_id: Option<String>,
34    #[sqlx(rename = "expiresAt")]
35    #[serde(rename = "expiresAt")]
36    pub expires_at: DateTime<Utc>,
37    #[sqlx(rename = "createdAt")]
38    #[serde(rename = "createdAt")]
39    pub created_at: DateTime<Utc>,
40    #[serde(rename = "revoked")]
41    pub revoked: Option<DateTime<Utc>>,
42    #[serde(rename = "confirmation")]
43    pub confirmation: Option<JsonMetadata>,
44    #[serde(rename = "scopes")]
45    pub scopes: JsonMetadata,
46}
47
48impl TryFrom<Model> for alibi_core::store::OAuthToken {
49    type Error = alibi_core::AuthError;
50    fn try_from(model: Model) -> Result<Self, Self::Error> {
51        let mut metadata = serde_json::to_value(&model)?;
52        let object = metadata
53            .as_object_mut()
54            .ok_or_else(|| alibi_core::AuthError::internal("OAuth token must be an object"))?;
55        for name in [
56            "id",
57            "token",
58            "clientId",
59            "sessionId",
60            "userId",
61            "authorizationCodeId",
62            "createdAt",
63            "expiresAt",
64        ] {
65            _ = object.remove(name);
66        }
67        Ok(Self {
68            id: model.id,
69            token: model.token,
70            client_id: model.client_id,
71            user_id: model.user_id.clone(),
72            session_id: model.session_id,
73            authorization_code_id: model.authorization_code_id,
74            metadata,
75            created_at: model.created_at,
76            expires_at: model.expires_at,
77        })
78    }
79}
80impl Model {
81    pub(crate) fn columns_from_metadata(
82        mut fields: serde_json::Value,
83    ) -> alibi_core::AuthResult<Self> {
84        let object = fields.as_object_mut().ok_or_else(|| {
85            alibi_core::AuthError::bad_request("OAuth token metadata must be an object")
86        })?;
87        for name in ["id", "token", "clientId", "userId"] {
88            _ = object.insert(name.into(), serde_json::Value::String(String::new()));
89        }
90        for name in ["createdAt", "expiresAt"] {
91            _ = object.insert(
92                name.into(),
93                serde_json::Value::String("1970-01-01T00:00:00Z".into()),
94            );
95        }
96        Ok(serde_json::from_value(fields)?)
97    }
98}