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
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 }))
65 }
66 None => Ok(None),
67 }
68}
69
70pub async fn update_authorization_request(
71 pool: &PgPool,
72 request_id: &str,
73 did: &str,
74 device_id: Option<&str>,
75 code: &str,
76) -> Result<(), OAuthError> {
77 sqlx::query!(
78 r#"
79 UPDATE oauth_authorization_request
80 SET did = $2, device_id = $3, code = $4
81 WHERE id = $1
82 "#,
83 request_id,
84 did,
85 device_id,
86 code
87 )
88 .execute(pool)
89 .await?;
90 Ok(())
91}
92
93pub async fn consume_authorization_request_by_code(
94 pool: &PgPool,
95 code: &str,
96) -> Result<Option<RequestData>, OAuthError> {
97 let row = sqlx::query!(
98 r#"
99 DELETE FROM oauth_authorization_request
100 WHERE code = $1
101 RETURNING did, device_id, client_id, client_auth, parameters, expires_at, code
102 "#,
103 code
104 )
105 .fetch_optional(pool)
106 .await?;
107 match row {
108 Some(r) => {
109 let client_auth: Option<ClientAuth> = match r.client_auth {
110 Some(v) => Some(from_json(v)?),
111 None => None,
112 };
113 let parameters: AuthorizationRequestParameters = from_json(r.parameters)?;
114 Ok(Some(RequestData {
115 client_id: r.client_id,
116 client_auth,
117 parameters,
118 expires_at: r.expires_at,
119 did: r.did,
120 device_id: r.device_id,
121 code: r.code,
122 }))
123 }
124 None => Ok(None),
125 }
126}
127
128pub async fn delete_authorization_request(
129 pool: &PgPool,
130 request_id: &str,
131) -> Result<(), OAuthError> {
132 sqlx::query!(
133 r#"
134 DELETE FROM oauth_authorization_request WHERE id = $1
135 "#,
136 request_id
137 )
138 .execute(pool)
139 .await?;
140 Ok(())
141}
142
143pub async fn delete_expired_authorization_requests(pool: &PgPool) -> Result<u64, OAuthError> {
144 let result = sqlx::query!(
145 r#"
146 DELETE FROM oauth_authorization_request
147 WHERE expires_at < NOW()
148 "#
149 )
150 .execute(pool)
151 .await?;
152 Ok(result.rows_affected())
153}