this repo has no description
1use sqlx::PgPool;
2use super::super::{AuthorizationRequestParameters, ClientAuth, OAuthError, RequestData};
3use super::helpers::{from_json, to_json};
4pub async fn create_authorization_request(
5 pool: &PgPool,
6 request_id: &str,
7 data: &RequestData,
8) -> Result<(), OAuthError> {
9 let client_auth_json = match &data.client_auth {
10 Some(ca) => Some(to_json(ca)?),
11 None => None,
12 };
13 let parameters_json = to_json(&data.parameters)?;
14 sqlx::query!(
15 r#"
16 INSERT INTO oauth_authorization_request
17 (id, did, device_id, client_id, client_auth, parameters, expires_at, code)
18 VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
19 "#,
20 request_id,
21 data.did,
22 data.device_id,
23 data.client_id,
24 client_auth_json,
25 parameters_json,
26 data.expires_at,
27 data.code,
28 )
29 .execute(pool)
30 .await?;
31 Ok(())
32}
33pub async fn get_authorization_request(
34 pool: &PgPool,
35 request_id: &str,
36) -> Result<Option<RequestData>, OAuthError> {
37 let row = sqlx::query!(
38 r#"
39 SELECT did, device_id, client_id, client_auth, parameters, expires_at, code
40 FROM oauth_authorization_request
41 WHERE id = $1
42 "#,
43 request_id
44 )
45 .fetch_optional(pool)
46 .await?;
47 match row {
48 Some(r) => {
49 let client_auth: Option<ClientAuth> = match r.client_auth {
50 Some(v) => Some(from_json(v)?),
51 None => None,
52 };
53 let parameters: AuthorizationRequestParameters = from_json(r.parameters)?;
54 Ok(Some(RequestData {
55 client_id: r.client_id,
56 client_auth,
57 parameters,
58 expires_at: r.expires_at,
59 did: r.did,
60 device_id: r.device_id,
61 code: r.code,
62 }))
63 }
64 None => Ok(None),
65 }
66}
67pub async fn update_authorization_request(
68 pool: &PgPool,
69 request_id: &str,
70 did: &str,
71 device_id: Option<&str>,
72 code: &str,
73) -> Result<(), OAuthError> {
74 sqlx::query!(
75 r#"
76 UPDATE oauth_authorization_request
77 SET did = $2, device_id = $3, code = $4
78 WHERE id = $1
79 "#,
80 request_id,
81 did,
82 device_id,
83 code
84 )
85 .execute(pool)
86 .await?;
87 Ok(())
88}
89pub async fn consume_authorization_request_by_code(
90 pool: &PgPool,
91 code: &str,
92) -> Result<Option<RequestData>, OAuthError> {
93 let row = sqlx::query!(
94 r#"
95 DELETE FROM oauth_authorization_request
96 WHERE code = $1
97 RETURNING did, device_id, client_id, client_auth, parameters, expires_at, code
98 "#,
99 code
100 )
101 .fetch_optional(pool)
102 .await?;
103 match row {
104 Some(r) => {
105 let client_auth: Option<ClientAuth> = match r.client_auth {
106 Some(v) => Some(from_json(v)?),
107 None => None,
108 };
109 let parameters: AuthorizationRequestParameters = from_json(r.parameters)?;
110 Ok(Some(RequestData {
111 client_id: r.client_id,
112 client_auth,
113 parameters,
114 expires_at: r.expires_at,
115 did: r.did,
116 device_id: r.device_id,
117 code: r.code,
118 }))
119 }
120 None => Ok(None),
121 }
122}
123pub async fn delete_authorization_request(
124 pool: &PgPool,
125 request_id: &str,
126) -> Result<(), OAuthError> {
127 sqlx::query!(
128 r#"
129 DELETE FROM oauth_authorization_request WHERE id = $1
130 "#,
131 request_id
132 )
133 .execute(pool)
134 .await?;
135 Ok(())
136}
137pub async fn delete_expired_authorization_requests(pool: &PgPool) -> Result<u64, OAuthError> {
138 let result = sqlx::query!(
139 r#"
140 DELETE FROM oauth_authorization_request
141 WHERE expires_at < NOW()
142 "#
143 )
144 .execute(pool)
145 .await?;
146 Ok(result.rows_affected())
147}