All checks were successful
CI / Clippy (pull_request) Successful in 2m21s
CI / Security Audit (pull_request) Has been skipped
CI / Tests (pull_request) Has been skipped
CI / Deploy (push) Has been skipped
CI / Deploy (pull_request) Has been skipped
CI / Format (push) Successful in 3s
CI / Clippy (push) Successful in 2m22s
CI / Security Audit (push) Has been skipped
CI / Tests (push) Has been skipped
CI / Format (pull_request) Successful in 2s
Introduce centralized ServerState (Arc-wrapped, Box::leaked configs) loaded once at startup, replacing per-request dotenvy/env::var calls across all server functions. Add MongoDB Database wrapper with connection pooling. Add tower middleware that gates all /api/ server function endpoints behind session authentication (401 for unauthenticated callers, except check-auth). Fix DaisyUI theme toggle to use certifai-dark/certifai-light theme names and replace hardcoded hex colors in main.css with CSS variables. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
44 lines
1.2 KiB
Rust
44 lines
1.2 KiB
Rust
use axum::response::IntoResponse;
|
|
use reqwest::StatusCode;
|
|
|
|
/// Central error type for infrastructure-layer failures.
|
|
///
|
|
/// Each variant maps to an appropriate HTTP status code when converted
|
|
/// into an Axum response.
|
|
#[derive(thiserror::Error, Debug)]
|
|
pub enum Error {
|
|
#[error("{0}")]
|
|
StateError(String),
|
|
|
|
#[error("database error: {0}")]
|
|
DatabaseError(String),
|
|
|
|
#[error("configuration error: {0}")]
|
|
ConfigError(String),
|
|
|
|
#[error("IoError: {0}")]
|
|
IoError(#[from] std::io::Error),
|
|
}
|
|
|
|
impl From<mongodb::error::Error> for Error {
|
|
fn from(err: mongodb::error::Error) -> Self {
|
|
Self::DatabaseError(err.to_string())
|
|
}
|
|
}
|
|
|
|
impl IntoResponse for Error {
|
|
fn into_response(self) -> axum::response::Response {
|
|
let msg = self.to_string();
|
|
tracing::error!("Converting Error to Response: {msg}");
|
|
match self {
|
|
Self::StateError(e) | Self::ConfigError(e) => {
|
|
(StatusCode::INTERNAL_SERVER_ERROR, e).into_response()
|
|
}
|
|
Self::DatabaseError(e) => (StatusCode::SERVICE_UNAVAILABLE, e).into_response(),
|
|
Self::IoError(_) => {
|
|
(StatusCode::INTERNAL_SERVER_ERROR, "Unknown error").into_response()
|
|
}
|
|
}
|
|
}
|
|
}
|