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 set_authorization_did( 71 pool: &PgPool, 72 request_id: &str, 73 did: &str, 74 device_id: Option<&str>, 75) -> Result<(), OAuthError> { 76 sqlx::query!( 77 r#" 78 UPDATE oauth_authorization_request 79 SET did = $2, device_id = $3 80 WHERE id = $1 81 "#, 82 request_id, 83 did, 84 device_id 85 ) 86 .execute(pool) 87 .await?; 88 Ok(()) 89} 90 91pub async fn update_authorization_request( 92 pool: &PgPool, 93 request_id: &str, 94 did: &str, 95 device_id: Option<&str>, 96 code: &str, 97) -> Result<(), OAuthError> { 98 sqlx::query!( 99 r#" 100 UPDATE oauth_authorization_request 101 SET did = $2, device_id = $3, code = $4 102 WHERE id = $1 103 "#, 104 request_id, 105 did, 106 device_id, 107 code 108 ) 109 .execute(pool) 110 .await?; 111 Ok(()) 112} 113 114pub async fn consume_authorization_request_by_code( 115 pool: &PgPool, 116 code: &str, 117) -> Result<Option<RequestData>, OAuthError> { 118 let row = sqlx::query!( 119 r#" 120 DELETE FROM oauth_authorization_request 121 WHERE code = $1 122 RETURNING did, device_id, client_id, client_auth, parameters, expires_at, code 123 "#, 124 code 125 ) 126 .fetch_optional(pool) 127 .await?; 128 match row { 129 Some(r) => { 130 let client_auth: Option<ClientAuth> = match r.client_auth { 131 Some(v) => Some(from_json(v)?), 132 None => None, 133 }; 134 let parameters: AuthorizationRequestParameters = from_json(r.parameters)?; 135 Ok(Some(RequestData { 136 client_id: r.client_id, 137 client_auth, 138 parameters, 139 expires_at: r.expires_at, 140 did: r.did, 141 device_id: r.device_id, 142 code: r.code, 143 })) 144 } 145 None => Ok(None), 146 } 147} 148 149pub async fn delete_authorization_request( 150 pool: &PgPool, 151 request_id: &str, 152) -> Result<(), OAuthError> { 153 sqlx::query!( 154 r#" 155 DELETE FROM oauth_authorization_request WHERE id = $1 156 "#, 157 request_id 158 ) 159 .execute(pool) 160 .await?; 161 Ok(()) 162} 163 164pub async fn delete_expired_authorization_requests(pool: &PgPool) -> Result<u64, OAuthError> { 165 let result = sqlx::query!( 166 r#" 167 DELETE FROM oauth_authorization_request 168 WHERE expires_at < NOW() 169 "# 170 ) 171 .execute(pool) 172 .await?; 173 Ok(result.rows_affected()) 174} 175 176pub async fn mark_request_authenticated( 177 pool: &PgPool, 178 request_id: &str, 179 did: &str, 180 device_id: Option<&str>, 181) -> Result<(), OAuthError> { 182 sqlx::query!( 183 r#" 184 UPDATE oauth_authorization_request 185 SET did = $2, device_id = $3 186 WHERE id = $1 187 "#, 188 request_id, 189 did, 190 device_id 191 ) 192 .execute(pool) 193 .await?; 194 Ok(()) 195} 196 197pub async fn update_request_scope( 198 pool: &PgPool, 199 request_id: &str, 200 scope: &str, 201) -> Result<(), OAuthError> { 202 sqlx::query!( 203 r#" 204 UPDATE oauth_authorization_request 205 SET parameters = jsonb_set(parameters, '{scope}', to_jsonb($2::text)) 206 WHERE id = $1 207 "#, 208 request_id, 209 scope 210 ) 211 .execute(pool) 212 .await?; 213 Ok(()) 214}