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