use actix_session::Session; use actix_web::{ HttpRequest, HttpResponse, Responder, post, web::{self, ServiceConfig}, }; use log::debug; use serde::Deserialize; use crate::{Database, error::ApiError}; #[derive(Deserialize)] struct LoginRequest { username: String, password: String, } pub fn setup(cfg: &mut ServiceConfig) { cfg.service(login).service(logout); } #[post("/login")] async fn login( db: web::Data, login_request: web::Json, session: Session, ) -> Result { let login_request = login_request.into_inner(); let user_id = db .verify_local_user(&login_request.username, &login_request.password) .await?; if session.get::("user").is_ok() { return Err(ApiError::AlreadyLoggedIn); } session.insert("user", user_id)?; Ok(HttpResponse::Ok()) } #[post("/logout")] async fn logout(session: Session, request: HttpRequest) -> Result { debug!("request cookies: {:?}", request.cookies()); debug!("Session entries: {:?}", session.entries()); session.purge(); debug!("Session entries after purge: {:?}", session.entries()); Ok(HttpResponse::Ok().body("Logged out successfully")) }