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}