refactor: replace LoginResponse and LogoutResponse with MessageResponse unified response instead of a struct for each response
This commit is contained in:
parent
f9c724f53c
commit
50c17393e2
3 changed files with 28 additions and 28 deletions
|
@ -4,10 +4,13 @@ use actix_web::{
|
||||||
web::{self, ServiceConfig},
|
web::{self, ServiceConfig},
|
||||||
};
|
};
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::Deserialize;
|
||||||
use utoipa::ToSchema;
|
use utoipa::ToSchema;
|
||||||
|
|
||||||
use crate::{Database, error::ApiError};
|
use crate::{
|
||||||
|
Database,
|
||||||
|
error::{ApiError, MessageResponse},
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Deserialize, ToSchema)]
|
#[derive(Deserialize, ToSchema)]
|
||||||
pub struct LoginRequest {
|
pub struct LoginRequest {
|
||||||
|
@ -17,20 +20,6 @@ pub struct LoginRequest {
|
||||||
pub password: String,
|
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) {
|
pub fn setup(cfg: &mut ServiceConfig) {
|
||||||
cfg.service(login).service(logout);
|
cfg.service(login).service(logout);
|
||||||
}
|
}
|
||||||
|
@ -43,7 +32,7 @@ pub fn setup(cfg: &mut ServiceConfig) {
|
||||||
description = "Authenticate a user with username and password",
|
description = "Authenticate a user with username and password",
|
||||||
request_body = LoginRequest,
|
request_body = LoginRequest,
|
||||||
responses(
|
responses(
|
||||||
(status = 200, description = "Login successful", body = LoginResponse),
|
(status = 200, description = "Login successful", body = MessageResponse),
|
||||||
(status = 400, description = "Invalid credentials"),
|
(status = 400, description = "Invalid credentials"),
|
||||||
(status = 409, description = "User already logged in"),
|
(status = 409, description = "User already logged in"),
|
||||||
(status = 500, description = "Internal server error")
|
(status = 500, description = "Internal server error")
|
||||||
|
@ -67,9 +56,7 @@ pub async fn login(
|
||||||
|
|
||||||
session.insert("user", user_id)?;
|
session.insert("user", user_id)?;
|
||||||
|
|
||||||
Ok(HttpResponse::Ok().json(LoginResponse {
|
Ok(HttpResponse::Ok().json(MessageResponse::new("Login successful")))
|
||||||
message: "Login successful".to_string(),
|
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[utoipa::path(
|
#[utoipa::path(
|
||||||
|
@ -79,7 +66,7 @@ pub async fn login(
|
||||||
summary = "User logout",
|
summary = "User logout",
|
||||||
description = "Log out the currently authenticated user and clear session",
|
description = "Log out the currently authenticated user and clear session",
|
||||||
responses(
|
responses(
|
||||||
(status = 200, description = "Logout successful", body = LogoutResponse),
|
(status = 200, description = "Logout successful", body = MessageResponse),
|
||||||
(status = 500, description = "Internal server error")
|
(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());
|
debug!("Session entries: {:?}", session.entries());
|
||||||
session.purge();
|
session.purge();
|
||||||
debug!("Session entries after purge: {:?}", session.entries());
|
debug!("Session entries after purge: {:?}", session.entries());
|
||||||
Ok(HttpResponse::Ok().json(LogoutResponse {
|
Ok(HttpResponse::Ok().json(MessageResponse::new("Logged out successfully")))
|
||||||
message: "Logged out successfully".to_string(),
|
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 sea_orm::TransactionError;
|
||||||
|
use serde::Serialize;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
use utoipa::ToSchema;
|
||||||
|
|
||||||
#[derive(Error, Debug)]
|
#[derive(Error, Debug)]
|
||||||
pub enum ApiError {
|
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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
use actix_files::NamedFile;
|
|
||||||
use actix_session::{SessionMiddleware, storage::RedisSessionStore};
|
use actix_session::{SessionMiddleware, storage::RedisSessionStore};
|
||||||
use actix_web::cookie::SameSite;
|
use actix_web::cookie::SameSite;
|
||||||
use actix_web::{App, HttpServer, cookie::Key, middleware::Logger, web};
|
use actix_web::{App, HttpServer, cookie::Key, middleware::Logger, web};
|
||||||
|
@ -34,8 +33,7 @@ struct AppConfig {
|
||||||
),
|
),
|
||||||
components(schemas(
|
components(schemas(
|
||||||
controller::auth::LoginRequest,
|
controller::auth::LoginRequest,
|
||||||
controller::auth::LoginResponse,
|
error::MessageResponse,
|
||||||
controller::auth::LogoutResponse,
|
|
||||||
)),
|
)),
|
||||||
tags(
|
tags(
|
||||||
(name = "auth", description = "Authentication endpoints"),
|
(name = "auth", description = "Authentication endpoints"),
|
||||||
|
|
Loading…
Add table
Reference in a new issue