use crate::error::{handle_error, Error}; use sqlx::sqlite::SqliteQueryResult; use sqlx::types::chrono::{DateTime, Utc}; use sqlx::{FromRow, SqliteExecutor}; #[derive(FromRow)] pub struct AuthorizationCodes { // Info pub code: String, pub app: String, pub user: String, // Timings pub created_at: DateTime, pub expires_at: DateTime, pub used_at: Option>, } impl AuthorizationCodes { pub async fn get_all(conn: impl SqliteExecutor<'_>) -> Result, Error> { sqlx::query_file_as!(Self, "queries/authorization_codes/get_all.sql") .fetch_all(conn) .await .map_err(handle_error) } pub async fn insert( conn: impl SqliteExecutor<'_>, code: &str, app: &str, user: &str, expires_at: i64, ) -> Result, Error> { let query: SqliteQueryResult = sqlx::query_file!( "queries/authorization_codes/insert.sql", code, app, user, expires_at ) .execute(conn) .await .map_err(handle_error)?; Ok((query.rows_affected() == 1).then_some(())) } pub async fn get_one(conn: impl SqliteExecutor<'_>, code: &str) -> Result, Error> { sqlx::query_file_as!(Self, "queries/authorization_codes/get_one.sql", code) .fetch_optional(conn) .await .map_err(handle_error) } pub async fn use_code(conn: impl SqliteExecutor<'_>, code: &str) -> Result, Error> { let query: SqliteQueryResult = sqlx::query_file!("queries/authorization_codes/use_code.sql", code) .execute(conn) .await .map_err(handle_error)?; Ok((query.rows_affected() == 1).then_some(())) } pub async fn use_all_for_user( conn: impl SqliteExecutor<'_>, user: &str, ) -> Result, Error> { let query: SqliteQueryResult = sqlx::query_file!("queries/authorization_codes/use_all_for_user.sql", user) .execute(conn) .await .map_err(handle_error)?; Ok((query.rows_affected() >= 1).then_some(())) } }