this repo has no description
1use sqlx::PgPool; 2use super::super::{AuthorizationRequestParameters, ClientAuth, OAuthError, RequestData}; 3use super::helpers::{from_json, to_json}; 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}