use actix_web::HttpResponse;
use serde::Serialize;
use serde_json::{Value, json};
use crate::error::ProcessedError;
#[derive(Serialize)]
pub struct ApiSuccessResponse<T: Serialize> {
pub status: &'static str,
pub message: String,
pub data: T,
}
#[derive(Serialize)]
pub struct ApiErrorResponse {
pub status: &'static str,
pub message: String,
pub error: String,
}
pub fn api_success<T: Serialize>(message: impl Into<String>, data: T) -> HttpResponse {
HttpResponse::Ok().json(ApiSuccessResponse {
status: "success",
message: message.into(),
data,
})
}
pub fn api_ok<T: Serialize>(data: T) -> HttpResponse {
HttpResponse::Ok().json(data)
}
pub fn api_created<T: Serialize>(message: impl Into<String>, data: T) -> HttpResponse {
HttpResponse::Created().json(ApiSuccessResponse {
status: "success",
message: message.into(),
data,
})
}
pub fn bad_request(message: impl Into<String>, error: impl Into<String>) -> HttpResponse {
HttpResponse::BadRequest().json(ApiErrorResponse {
status: "error",
message: message.into(),
error: error.into(),
})
}
pub fn unauthorized(message: impl Into<String>, error: impl Into<String>) -> HttpResponse {
HttpResponse::Unauthorized().json(ApiErrorResponse {
status: "error",
message: message.into(),
error: error.into(),
})
}
pub fn forbidden(message: impl Into<String>, error: impl Into<String>) -> HttpResponse {
HttpResponse::Forbidden().json(ApiErrorResponse {
status: "error",
message: message.into(),
error: error.into(),
})
}
pub fn not_found(message: impl Into<String>, error: impl Into<String>) -> HttpResponse {
HttpResponse::NotFound().json(ApiErrorResponse {
status: "error",
message: message.into(),
error: error.into(),
})
}
pub fn conflict(message: impl Into<String>, error: impl Into<String>) -> HttpResponse {
HttpResponse::Conflict().json(ApiErrorResponse {
status: "error",
message: message.into(),
error: error.into(),
})
}
pub fn internal_error(message: impl Into<String>, error: impl Into<String>) -> HttpResponse {
HttpResponse::InternalServerError().json(ApiErrorResponse {
status: "error",
message: message.into(),
error: error.into(),
})
}
pub fn service_unavailable(message: impl Into<String>, error: impl Into<String>) -> HttpResponse {
HttpResponse::ServiceUnavailable().json(ApiErrorResponse {
status: "error",
message: message.into(),
error: error.into(),
})
}
pub fn api_success_value(message: impl Into<String>, data: Value) -> HttpResponse {
HttpResponse::Ok().json(json!({
"status": "success",
"message": message.into(),
"data": data
}))
}
pub fn api_error(message: impl Into<String>) -> HttpResponse {
let msg: String = message.into();
internal_error(&msg, &msg)
}
pub fn processed_error(error: ProcessedError) -> HttpResponse {
let status = error.status_code;
let json = error.to_json();
HttpResponse::build(status).json(json)
}