alibi_sqlx/store/entities/
oauth_client.rs1use 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}