refactor: replace LoginResponse and LogoutResponse with MessageResponse unified response instead of a struct for each response

This commit is contained in:
Mika 2025-06-15 11:59:54 +02:00
parent f9c724f53c
commit 50c17393e2
3 changed files with 28 additions and 28 deletions

View file

@ -4,10 +4,13 @@ use actix_web::{
web::{self, ServiceConfig},
};
use log::debug;
use serde::{Deserialize, Serialize};
use serde::Deserialize;
use utoipa::ToSchema;
use crate::{Database, error::ApiError};
use crate::{
Database,
error::{ApiError, MessageResponse},
};
#[derive(Deserialize, ToSchema)]
pub struct LoginRequest {
@ -17,20 +20,6 @@ pub struct LoginRequest {
pub password: String,
}
#[derive(Serialize, ToSchema)]
pub struct LoginResponse {
/// Success message
pub message: String,
}
#[derive(Serialize, ToSchema)]
pub struct LogoutResponse {
/// Logout confirmation message
pub message: String,
}
// TODO: Implement generic ApiResponse<T> type to reduce boilerplate
pub fn setup(cfg: &mut ServiceConfig) {
cfg.service(login).service(logout);
}
@ -43,7 +32,7 @@ pub fn setup(cfg: &mut ServiceConfig) {
description = "Authenticate a user with username and password",
request_body = LoginRequest,
responses(
(status = 200, description = "Login successful", body = LoginResponse),
(status = 200, description = "Login successful", body = MessageResponse),
(status = 400, description = "Invalid credentials"),
(status = 409, description = "User already logged in"),
(status = 500, description = "Internal server error")
@ -67,9 +56,7 @@ pub async fn login(
session.insert("user", user_id)?;
Ok(HttpResponse::Ok().json(LoginResponse {
message: "Login successful".to_string(),
}))
Ok(HttpResponse::Ok().json(MessageResponse::new("Login successful")))
}
#[utoipa::path(
@ -79,7 +66,7 @@ pub async fn login(
summary = "User logout",
description = "Log out the currently authenticated user and clear session",
responses(
(status = 200, description = "Logout successful", body = LogoutResponse),
(status = 200, description = "Logout successful", body = MessageResponse),
(status = 500, description = "Internal server error")
)
)]
@ -89,7 +76,5 @@ pub async fn logout(session: Session, request: HttpRequest) -> Result<impl Respo
debug!("Session entries: {:?}", session.entries());
session.purge();
debug!("Session entries after purge: {:?}", session.entries());
Ok(HttpResponse::Ok().json(LogoutResponse {
message: "Logged out successfully".to_string(),
}))
Ok(HttpResponse::Ok().json(MessageResponse::new("Logged out successfully")))
}

View file

@ -1,6 +1,8 @@
use actix_web::{HttpResponse, ResponseError, cookie::time::error, http::StatusCode};
use actix_web::{HttpResponse, ResponseError, http::StatusCode};
use sea_orm::TransactionError;
use serde::Serialize;
use thiserror::Error;
use utoipa::ToSchema;
#[derive(Error, Debug)]
pub enum ApiError {
@ -49,3 +51,18 @@ impl From<TransactionError<sea_orm::DbErr>> for ApiError {
})
}
}
#[derive(Serialize, ToSchema)]
pub struct MessageResponse {
/// Response message
pub message: String,
}
impl MessageResponse {
/// Create a new message response
pub fn new(message: impl Into<String>) -> Self {
Self {
message: message.into(),
}
}
}

View file

@ -1,4 +1,3 @@
use actix_files::NamedFile;
use actix_session::{SessionMiddleware, storage::RedisSessionStore};
use actix_web::cookie::SameSite;
use actix_web::{App, HttpServer, cookie::Key, middleware::Logger, web};
@ -34,8 +33,7 @@ struct AppConfig {
),
components(schemas(
controller::auth::LoginRequest,
controller::auth::LoginResponse,
controller::auth::LogoutResponse,
error::MessageResponse,
)),
tags(
(name = "auth", description = "Authentication endpoints"),