Skip to main content

alibi_sqlx/store/entities/
oauth_consent.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 = "oauthConsent")]
7pub struct Model {
8    pub id: String,
9    #[sqlx(rename = "clientId")]
10    #[serde(rename = "clientId")]
11    pub client_id: String,
12    #[sqlx(rename = "userId")]
13    #[serde(rename = "userId")]
14    pub user_id: Option<String>,
15    #[sqlx(rename = "referenceId")]
16    #[serde(rename = "referenceId")]
17    pub reference_id: Option<String>,
18    #[serde(rename = "resources")]
19    pub resources: Option<JsonMetadata>,
20    #[sqlx(rename = "requestedUserInfoClaims")]
21    #[serde(rename = "requestedUserInfoClaims")]
22    pub requested_user_info_claims: Option<JsonMetadata>,
23    #[serde(rename = "scopes")]
24    pub scopes: JsonMetadata,
25    #[sqlx(rename = "createdAt")]
26    #[serde(rename = "createdAt")]
27    pub created_at: DateTime<Utc>,
28    #[sqlx(rename = "updatedAt")]
29    #[serde(rename = "updatedAt")]
30    pub updated_at: DateTime<Utc>,
31}
32
33impl TryFrom<Model> for alibi_core::store::OAuthConsent {
34    type Error = alibi_core::AuthError;
35    fn try_from(model: Model) -> Result<Self, Self::Error> {
36        let mut metadata = serde_json::to_value(&model)?;
37        let object = metadata
38            .as_object_mut()
39            .ok_or_else(|| alibi_core::AuthError::internal("OAuth fields must be an object"))?;
40        for name in ["id", "clientId", "userId", "createdAt", "updatedAt"] {
41            _ = object.remove(name);
42        }
43        Ok(Self {
44            id: model.id,
45            client_id: model.client_id.clone(),
46            user_id: model.user_id.clone(),
47            metadata,
48            created_at: model.created_at,
49            updated_at: model.updated_at,
50        })
51    }
52}
53impl Model {
54    pub(crate) fn columns_from_metadata(
55        mut fields: serde_json::Value,
56    ) -> alibi_core::AuthResult<Self> {
57        let object = fields
58            .as_object_mut()
59            .ok_or_else(|| alibi_core::AuthError::bad_request("OAuth fields must be an object"))?;
60        for (key, value) in [
61            ("id", ""),
62            ("clientId", ""),
63            ("createdAt", "1970-01-01T00:00:00Z"),
64            ("updatedAt", "1970-01-01T00:00:00Z"),
65        ] {
66            _ = object.insert(key.into(), serde_json::Value::String(value.into()));
67        }
68        Ok(serde_json::from_value(fields)?)
69    }
70}