Files
M-CTF-2025/ticktalk/crates/backend/src/error.rs

73 lines
2.5 KiB
Rust
Raw Normal View History

2025-12-14 10:39:18 +03:00
use actix_web::HttpResponse;
use actix_web::error::ResponseError;
use serde_json;
use thiserror::Error;
use ticktalk_db::errors::RepositoryError;
use tracing::{error, warn};
#[derive(Error, Debug)]
pub enum WebError {
#[error("Database error: {0}")]
DatabaseError(#[from] RepositoryError),
#[error("Invalid UUID: {0}")]
InvalidUuid(#[from] uuid::Error),
#[error("Not found")]
NotFound,
#[error("Unauthorized")]
Unauthorized,
#[error("Bad request")]
BadRequest(String),
#[error("Internal server error")]
InternalServerError(String),
}
impl ResponseError for WebError {
fn error_response(&self) -> HttpResponse {
match self {
WebError::DatabaseError(_) => {
error!("Database error");
HttpResponse::InternalServerError().json(serde_json::json!({
"error": "Database error occurred",
"message": "An error occurred while accessing the database"
}))
}
WebError::InvalidUuid(e) => {
error!("Invalid UUID error: {}", e);
HttpResponse::InternalServerError().json(serde_json::json!({
"error": "Invalid UUID",
"message": "An error occurred while parsing the UUID"
}))
}
WebError::NotFound => {
error!("Resource not found");
HttpResponse::NotFound().json(serde_json::json!({
"error": "Not found",
"message": "The requested resource was not found"
}))
}
WebError::Unauthorized => {
warn!("Unauthorized access attempt");
HttpResponse::Unauthorized().json(serde_json::json!({
"error": "Unauthorized",
"message": "Access denied"
}))
}
WebError::InternalServerError(e) => {
error!("Internal server error: {}", e);
HttpResponse::InternalServerError().json(serde_json::json!({
"error": "Internal server error",
"message": "An unexpected error occurred"
}))
}
WebError::BadRequest(msg) => {
error!("Bad Request: {}", msg);
HttpResponse::BadRequest().json(serde_json::json!({
"error": "Bad Request",
"message": msg
}))
}
}
}
}