Skip to main content

alibi_sqlx/store/entities/
oauth_resource.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 = "oauthResource")]
7pub struct Model {
8    pub id: String,
9    #[serde(rename = "identifier")]
10    pub identifier: String,
11    #[serde(rename = "name")]
12    pub name: String,
13    #[sqlx(rename = "accessTokenTtl")]
14    #[serde(rename = "accessTokenTtl")]
15    pub access_token_ttl: Option<i32>,
16    #[sqlx(rename = "refreshTokenTtl")]
17    #[serde(rename = "refreshTokenTtl")]
18    pub refresh_token_ttl: Option<i32>,
19    #[sqlx(rename = "signingAlgorithm")]
20    #[serde(rename = "signingAlgorithm")]
21    pub signing_algorithm: Option<String>,
22    #[sqlx(rename = "signingKeyId")]
23    #[serde(rename = "signingKeyId")]
24    pub signing_key_id: Option<String>,
25    #[sqlx(rename = "allowedScopes")]
26    #[serde(rename = "allowedScopes")]
27    pub allowed_scopes: Option<JsonMetadata>,
28    #[sqlx(rename = "customClaims")]
29    #[serde(rename = "customClaims")]
30    pub custom_claims: Option<JsonMetadata>,
31    #[sqlx(rename = "dpopBoundAccessTokensRequired")]
32    #[serde(rename = "dpopBoundAccessTokensRequired")]
33    pub dpop_bound_access_tokens_required: Option<bool>,
34    #[serde(rename = "disabled")]
35    pub disabled: Option<bool>,
36    #[sqlx(rename = "createdAt")]
37    #[serde(rename = "createdAt")]
38    pub created_at: Option<DateTime<Utc>>,
39    #[sqlx(rename = "updatedAt")]
40    #[serde(rename = "updatedAt")]
41    pub updated_at: Option<DateTime<Utc>>,
42    #[sqlx(rename = "policyVersion")]
43    #[serde(rename = "policyVersion")]
44    pub policy_version: Option<i32>,
45    #[serde(rename = "metadata")]
46    pub metadata: Option<JsonMetadata>,
47}
48
49impl TryFrom<Model> for alibi_core::store::OAuthResource {
50    type Error = alibi_core::AuthError;
51    fn try_from(model: Model) -> Result<Self, Self::Error> {
52        let mut metadata = serde_json::to_value(&model)?;
53        let object = metadata
54            .as_object_mut()
55            .ok_or_else(|| alibi_core::AuthError::internal("OAuth fields must be an object"))?;
56        for name in ["id", "identifier", "createdAt", "updatedAt"] {
57            _ = object.remove(name);
58        }
59        Ok(Self {
60            id: model.id,
61            identifier: model.identifier.clone(),
62            metadata,
63            created_at: model.created_at,
64            updated_at: model.updated_at,
65        })
66    }
67}
68impl Model {
69    pub(crate) fn columns_from_metadata(
70        mut fields: serde_json::Value,
71    ) -> alibi_core::AuthResult<Self> {
72        let object = fields
73            .as_object_mut()
74            .ok_or_else(|| alibi_core::AuthError::bad_request("OAuth fields must be an object"))?;
75        for (key, value) in [("id", ""), ("identifier", "")] {
76            _ = object.insert(key.into(), serde_json::Value::String(value.into()));
77        }
78        Ok(serde_json::from_value(fields)?)
79    }
80}