this repo has no description
1use super::super::{AuthorizationRequestParameters, ClientAuth, OAuthError, RequestData};
2use super::helpers::{from_json, to_json};
3use sqlx::PgPool;
4
5pub async fn create_authorization_request(
6 pool: &PgPool,
7 request_id: &str,
8 data: &RequestData,
9) -> Result<(), OAuthError> {
10 let client_auth_json = match &data.client_auth {
11 Some(ca) => Some(to_json(ca)?),
12 None => None,
13 };
14 let parameters_json = to_json(&data.parameters)?;
15 sqlx::query!(
16 r#"
17 INSERT INTO oauth_authorization_request
18 (id, did, device_id, client_id, client_auth, parameters, expires_at, code)
19 VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
20 "#,
21 request_id,
22 data.did,
23 data.device_id,
24 data.client_id,
25 client_auth_json,
26 parameters_json,
27 data.expires_at,
28 data.code,
29 )
30 .execute(pool)
31 .await?;
32 Ok(())
33}
34
35pub async fn get_authorization_request(
36 pool: &PgPool,
37 request_id: &str,
38) -> Result<Option<RequestData>, OAuthError> {
39 let row = sqlx::query!(
40 r#"
41 SELECT did, device_id, client_id, client_auth, parameters, expires_at, code, controller_did
42 FROM oauth_authorization_request
43 WHERE id = $1
44 "#,
45 request_id
46 )
47 .fetch_optional(pool)
48 .await?;
49 match row {
50 Some(r) => {
51 let client_auth: Option<ClientAuth> = match r.client_auth {
52 Some(v) => Some(from_json(v)?),
53 None => None,
54 };
55 let parameters: AuthorizationRequestParameters = from_json(r.parameters)?;
56 Ok(Some(RequestData {
57 client_id: r.client_id,
58 client_auth,
59 parameters,
60 expires_at: r.expires_at,
61 did: r.did,
62 device_id: r.device_id,
63 code: r.code,
64 controller_did: r.controller_did,
65 }))
66 }
67 None => Ok(None),
68 }
69}
70
71pub async fn set_authorization_did(
72 pool: &PgPool,
73 request_id: &str,
74 did: &str,
75 device_id: Option<&str>,
76) -> Result<(), OAuthError> {
77 sqlx::query!(
78 r#"
79 UPDATE oauth_authorization_request
80 SET did = $2, device_id = $3
81 WHERE id = $1
82 "#,
83 request_id,
84 did,
85 device_id
86 )
87 .execute(pool)
88 .await?;
89 Ok(())
90}
91
92pub async fn update_authorization_request(
93 pool: &PgPool,
94 request_id: &str,
95 did: &str,
96 device_id: Option<&str>,
97 code: &str,
98) -> Result<(), OAuthError> {
99 sqlx::query!(
100 r#"
101 UPDATE oauth_authorization_request
102 SET did = $2, device_id = $3, code = $4
103 WHERE id = $1
104 "#,
105 request_id,
106 did,
107 device_id,
108 code
109 )
110 .execute(pool)
111 .await?;
112 Ok(())
113}
114
115pub async fn consume_authorization_request_by_code(
116 pool: &PgPool,
117 code: &str,
118) -> Result<Option<RequestData>, OAuthError> {
119 let row = sqlx::query!(
120 r#"
121 DELETE FROM oauth_authorization_request
122 WHERE code = $1
123 RETURNING did, device_id, client_id, client_auth, parameters, expires_at, code, controller_did
124 "#,
125 code
126 )
127 .fetch_optional(pool)
128 .await?;
129 match row {
130 Some(r) => {
131 let client_auth: Option<ClientAuth> = match r.client_auth {
132 Some(v) => Some(from_json(v)?),
133 None => None,
134 };
135 let parameters: AuthorizationRequestParameters = from_json(r.parameters)?;
136 Ok(Some(RequestData {
137 client_id: r.client_id,
138 client_auth,
139 parameters,
140 expires_at: r.expires_at,
141 did: r.did,
142 device_id: r.device_id,
143 code: r.code,
144 controller_did: r.controller_did,
145 }))
146 }
147 None => Ok(None),
148 }
149}
150
151pub async fn delete_authorization_request(
152 pool: &PgPool,
153 request_id: &str,
154) -> Result<(), OAuthError> {
155 sqlx::query!(
156 r#"
157 DELETE FROM oauth_authorization_request WHERE id = $1
158 "#,
159 request_id
160 )
161 .execute(pool)
162 .await?;
163 Ok(())
164}
165
166pub async fn delete_expired_authorization_requests(pool: &PgPool) -> Result<u64, OAuthError> {
167 let result = sqlx::query!(
168 r#"
169 DELETE FROM oauth_authorization_request
170 WHERE expires_at < NOW()
171 "#
172 )
173 .execute(pool)
174 .await?;
175 Ok(result.rows_affected())
176}
177
178pub async fn mark_request_authenticated(
179 pool: &PgPool,
180 request_id: &str,
181 did: &str,
182 device_id: Option<&str>,
183) -> Result<(), OAuthError> {
184 sqlx::query!(
185 r#"
186 UPDATE oauth_authorization_request
187 SET did = $2, device_id = $3
188 WHERE id = $1
189 "#,
190 request_id,
191 did,
192 device_id
193 )
194 .execute(pool)
195 .await?;
196 Ok(())
197}
198
199pub async fn update_request_scope(
200 pool: &PgPool,
201 request_id: &str,
202 scope: &str,
203) -> Result<(), OAuthError> {
204 sqlx::query!(
205 r#"
206 UPDATE oauth_authorization_request
207 SET parameters = jsonb_set(parameters, '{scope}', to_jsonb($2::text))
208 WHERE id = $1
209 "#,
210 request_id,
211 scope
212 )
213 .execute(pool)
214 .await?;
215 Ok(())
216}
217
218pub async fn set_controller_did(
219 pool: &PgPool,
220 request_id: &str,
221 controller_did: &str,
222) -> Result<(), OAuthError> {
223 sqlx::query!(
224 r#"
225 UPDATE oauth_authorization_request
226 SET controller_did = $2
227 WHERE id = $1
228 "#,
229 request_id,
230 controller_did
231 )
232 .execute(pool)
233 .await?;
234 Ok(())
235}
236
237pub async fn set_request_did(pool: &PgPool, request_id: &str, did: &str) -> Result<(), OAuthError> {
238 sqlx::query!(
239 r#"
240 UPDATE oauth_authorization_request
241 SET did = $2
242 WHERE id = $1
243 "#,
244 request_id,
245 did
246 )
247 .execute(pool)
248 .await?;
249 Ok(())
250}