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