Skip to main content

alibi_sqlx/store/entities/
oauth_client.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 = "oauthClient")]
7pub struct Model {
8    pub id: String,
9    #[sqlx(rename = "clientId")]
10    #[serde(rename = "clientId")]
11    pub client_id: String,
12    #[sqlx(rename = "clientSecret")]
13    #[serde(rename = "clientSecret")]
14    pub client_secret: Option<String>,
15    #[sqlx(rename = "clientDiscoveryId")]
16    #[serde(rename = "clientDiscoveryId")]
17    pub client_discovery_id: Option<String>,
18    #[serde(rename = "disabled")]
19    pub disabled: Option<bool>,
20    #[sqlx(rename = "skipConsent")]
21    #[serde(rename = "skipConsent")]
22    pub skip_consent: Option<bool>,
23    #[sqlx(rename = "enableEndSession")]
24    #[serde(rename = "enableEndSession")]
25    pub enable_end_session: Option<bool>,
26    #[sqlx(rename = "subjectType")]
27    #[serde(rename = "subjectType")]
28    pub subject_type: Option<String>,
29    #[serde(rename = "scopes")]
30    pub scopes: Option<JsonMetadata>,
31    #[sqlx(rename = "clientCredentialsScopes")]
32    #[serde(rename = "clientCredentialsScopes")]
33    pub client_credentials_scopes: Option<JsonMetadata>,
34    #[sqlx(rename = "userId")]
35    #[serde(rename = "userId")]
36    pub user_id: Option<String>,
37    #[sqlx(rename = "createdAt")]
38    #[serde(rename = "createdAt")]
39    pub created_at: Option<DateTime<Utc>>,
40    #[sqlx(rename = "updatedAt")]
41    #[serde(rename = "updatedAt")]
42    pub updated_at: Option<DateTime<Utc>>,
43    #[serde(rename = "name")]
44    pub name: Option<String>,
45    #[serde(rename = "uri")]
46    pub uri: Option<String>,
47    #[serde(rename = "icon")]
48    pub icon: Option<String>,
49    #[serde(rename = "contacts")]
50    pub contacts: Option<JsonMetadata>,
51    #[serde(rename = "tos")]
52    pub tos: Option<String>,
53    #[serde(rename = "policy")]
54    pub policy: Option<String>,
55    #[sqlx(rename = "softwareId")]
56    #[serde(rename = "softwareId")]
57    pub software_id: Option<String>,
58    #[sqlx(rename = "softwareVersion")]
59    #[serde(rename = "softwareVersion")]
60    pub software_version: Option<String>,
61    #[sqlx(rename = "softwareStatement")]
62    #[serde(rename = "softwareStatement")]
63    pub software_statement: Option<String>,
64    #[sqlx(rename = "redirectUris")]
65    #[serde(rename = "redirectUris")]
66    pub redirect_uris: JsonMetadata,
67    #[sqlx(rename = "postLogoutRedirectUris")]
68    #[serde(rename = "postLogoutRedirectUris")]
69    pub post_logout_redirect_uris: Option<JsonMetadata>,
70    #[sqlx(rename = "backchannelLogoutUri")]
71    #[serde(rename = "backchannelLogoutUri")]
72    pub backchannel_logout_uri: Option<String>,
73    #[sqlx(rename = "backchannelLogoutSessionRequired")]
74    #[serde(rename = "backchannelLogoutSessionRequired")]
75    pub backchannel_logout_session_required: Option<bool>,
76    #[sqlx(rename = "tokenEndpointAuthMethod")]
77    #[serde(rename = "tokenEndpointAuthMethod")]
78    pub token_endpoint_auth_method: Option<String>,
79    #[sqlx(rename = "applicationType")]
80    #[serde(rename = "applicationType")]
81    pub application_type: Option<String>,
82    #[serde(rename = "jwks")]
83    pub jwks: Option<String>,
84    #[sqlx(rename = "jwksUri")]
85    #[serde(rename = "jwksUri")]
86    pub jwks_uri: Option<String>,
87    #[sqlx(rename = "grantTypes")]
88    #[serde(rename = "grantTypes")]
89    pub grant_types: Option<JsonMetadata>,
90    #[sqlx(rename = "responseTypes")]
91    #[serde(rename = "responseTypes")]
92    pub response_types: Option<JsonMetadata>,
93    #[sqlx(rename = "requirePKCE")]
94    #[serde(rename = "requirePKCE")]
95    pub require_pkce: Option<bool>,
96    #[sqlx(rename = "dpopBoundAccessTokens")]
97    #[serde(rename = "dpopBoundAccessTokens")]
98    pub dpop_bound_access_tokens: Option<bool>,
99    #[sqlx(rename = "referenceId")]
100    #[serde(rename = "referenceId")]
101    pub reference_id: Option<String>,
102    #[serde(rename = "metadata")]
103    pub metadata: Option<JsonMetadata>,
104}
105
106impl TryFrom<Model> for alibi_core::store::OAuthClient {
107    type Error = alibi_core::AuthError;
108    fn try_from(model: Model) -> Result<Self, Self::Error> {
109        let metadata = alibi_core::store::oauth_clients::metadata_from_columns(
110            &serde_json::to_value(&model)?,
111        )?;
112        Ok(Self {
113            id: model.id,
114            client_id: model.client_id,
115            user_id: model.user_id,
116            client_secret: model.client_secret,
117            metadata,
118            created_at: model.created_at,
119            updated_at: model.updated_at,
120        })
121    }
122}
123impl Model {
124    pub(crate) fn columns_from_metadata(
125        metadata: serde_json::Value,
126    ) -> alibi_core::AuthResult<Self> {
127        let mut fields = alibi_core::store::oauth_clients::metadata_to_columns(metadata)?;
128        let object = fields.as_object_mut().ok_or_else(|| {
129            alibi_core::AuthError::internal("OAuth client fields must be an object")
130        })?;
131        _ = object.insert("id".into(), serde_json::Value::String(String::new()));
132        _ = object.insert("clientId".into(), serde_json::Value::String(String::new()));
133        Ok(serde_json::from_value(fields)?)
134    }
135}