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}