From f2f820370efbd5c6d0f304f781284a9f68990e21 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Wed, 11 Sep 2024 22:43:14 -0400 Subject: Wrap the database pool in an App struct. This is a jumping-off point for adding logic that needs more than just the DB for state, such as chat message handling. The name sucks, but it's the best I've got. --- src/login/extract/login.rs | 13 +++++-------- src/login/routes.rs | 13 ++++++------- 2 files changed, 11 insertions(+), 15 deletions(-) (limited to 'src/login') diff --git a/src/login/extract/login.rs b/src/login/extract/login.rs index da0a90e..4155ec2 100644 --- a/src/login/extract/login.rs +++ b/src/login/extract/login.rs @@ -3,9 +3,9 @@ use axum::{ http::{request::Parts, StatusCode}, response::{IntoResponse, Response}, }; -use sqlx::sqlite::SqlitePool; use crate::{ + app::App, clock::RequestedAt, error::InternalError, login::{ @@ -15,13 +15,10 @@ use crate::{ }; #[async_trait::async_trait] -impl FromRequestParts for Login { +impl FromRequestParts for Login { type Rejection = LoginError; - async fn from_request_parts( - parts: &mut Parts, - state: &SqlitePool, - ) -> Result { + async fn from_request_parts(parts: &mut Parts, state: &App) -> Result { // After Rust 1.82 (and #[feature(min_exhaustive_patterns)] lands on // stable), the following can be replaced: // @@ -31,8 +28,8 @@ impl FromRequestParts for Login { let secret = identity_token.secret().ok_or(LoginError::Forbidden)?; - let db = State::::from_request_parts(parts, state).await?; - let mut tx = db.begin().await?; + let app = State::::from_request_parts(parts, state).await?; + let mut tx = app.db.begin().await?; tx.tokens().expire(requested_at).await?; let login = tx.tokens().validate(secret, requested_at).await?; tx.commit().await?; diff --git a/src/login/routes.rs b/src/login/routes.rs index c30bcb1..9cefe38 100644 --- a/src/login/routes.rs +++ b/src/login/routes.rs @@ -5,16 +5,15 @@ use axum::{ routing::post, Router, }; -use sqlx::sqlite::SqlitePool; -use crate::{clock::RequestedAt, error::InternalError}; +use crate::{app::App, clock::RequestedAt, error::InternalError}; use super::{ extract::IdentityToken, repo::{logins::Provider as _, tokens::Provider as _}, }; -pub fn router() -> Router { +pub fn router() -> Router { Router::new() .route("/login", post(on_login)) .route("/logout", post(on_logout)) @@ -27,12 +26,12 @@ struct LoginRequest { } async fn on_login( - State(db): State, + State(app): State, RequestedAt(now): RequestedAt, identity: IdentityToken, Form(form): Form, ) -> Result { - let mut tx = db.begin().await?; + let mut tx = app.db.begin().await?; // Spelling the following in the more conventional form, // if let Some(…) = create().await? {} @@ -88,11 +87,11 @@ impl IntoResponse for LoginResponse { } async fn on_logout( - State(db): State, + State(app): State, identity: IdentityToken, ) -> Result { if let Some(secret) = identity.secret() { - let mut tx = db.begin().await?; + let mut tx = app.db.begin().await?; tx.tokens().revoke(secret).await?; tx.commit().await?; } -- cgit v1.2.3