diff options
author | Kjetil Orbekk <kj@orbekk.com> | 2022-10-13 08:12:59 -0400 |
---|---|---|
committer | Kjetil Orbekk <kj@orbekk.com> | 2022-10-13 08:12:59 -0400 |
commit | accb9032b9abe595020a27dd2f7b666cb7028f67 (patch) | |
tree | 4c92937ad368e93e9bb9ddf9a0ebb31e8288c04b /server/src/main.rs | |
parent | 8b5d16152ffb7d55811a7a558f67620a94e4cbf0 (diff) |
Add AuthenticatedSession request extractor
Diffstat (limited to 'server/src/main.rs')
-rw-r--r-- | server/src/main.rs | 46 |
1 files changed, 15 insertions, 31 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index fd28789..b961c17 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,6 +1,6 @@ use std::{collections::HashMap, env, str::FromStr, sync::Arc}; -use auth::{AuthenticatedSession, LoggedInUser}; +use auth::AuthenticatedSession; use axum::{ extract::{Extension, Query}, response::Redirect, @@ -8,23 +8,21 @@ use axum::{ Json, Router, }; use protocol::{Table, UserInfo}; +use server::ContextExtension; use tower_cookies::{Cookie, CookieManagerLayer, Cookies}; use tower_http::trace::TraceLayer; use tracing::info; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; mod auth; mod error; -use crate::auth::{Authenticator, SessionId}; +mod server; use crate::error::BridgeError; +use crate::{ + auth::{Authenticator, SessionId}, + server::ServerContext, +}; use sqlx::{postgres::PgPoolOptions, PgPool}; -pub struct ServerContext { - pub app_url: String, - pub authenticator: Authenticator, - pub db: PgPool, -} -type ContextExtension = Extension<Arc<ServerContext>>; - #[tokio::main] async fn main() { dotenv::dotenv().ok(); @@ -60,6 +58,7 @@ async fn main() { let app = Router::new() .route("/api/user/info", get(user_info)) + // .route("/api/user/table", get(user_table)) .route("/api/login", get(login)) .route(auth::LOGIN_CALLBACK, get(login_callback)) .layer(CookieManagerLayer::new()) @@ -73,36 +72,21 @@ async fn main() { } async fn user_info( - _user: LoggedInUser, - cookies: Cookies, + session: Option<AuthenticatedSession>, extension: ContextExtension, ) -> Result<Json<Option<UserInfo>>, BridgeError> { - let cookie = match cookies.get("user-id") { + let mut session = match session { None => return Ok(Json(None)), - Some(v) => v, + Some(s) => s, }; - - let session_id: SessionId = match SessionId::from_str(cookie.value()) { - Err(e) => { - info!("Clearing cookie that failed to parse {cookie:?}: {e}"); - cookies.remove(cookie.into_owned()); - return Ok(Json(None)); - } - Ok(s) => s, - }; - let mut session = - match crate::auth::fetch_authenticated_session(&extension.db, &session_id).await? { - None => return Ok(Json(None)), - Some(v) => v, - }; Ok(Json(Some(UserInfo { username: extension.authenticator.user_info(&mut session).await?, - table: get_table(&extension.db, &session).await?, + table: user_table(extension, &session).await?, }))) } -async fn get_table( - db: &PgPool, +async fn user_table( + extension: ContextExtension, session: &AuthenticatedSession, ) -> Result<Option<Table>, BridgeError> { Ok(sqlx::query_as!( @@ -115,7 +99,7 @@ async fn get_table( "#, session.player_id ) - .fetch_optional(db) + .fetch_optional(&extension.db) .await?) } |