- Add ESLint configuration for Next.js and TypeScript support. - Create Next.js configuration file with standalone output option. - Initialize package.json with scripts for development, build, and linting. - Set up PostCSS configuration for Tailwind CSS. - Add SVG assets for UI components. - Create TypeScript configuration for strict type checking and module resolution.
37 lines
1.1 KiB
Rust
37 lines
1.1 KiB
Rust
use axum::{
|
|
extract::rejection::JsonRejection,
|
|
http::StatusCode,
|
|
response::{IntoResponse, Response},
|
|
Json,
|
|
};
|
|
use sea_orm::DbErr;
|
|
|
|
use app::error::UserError;
|
|
|
|
use super::{ApiError, HTTPError};
|
|
use crate::models::ApiErrorResponse;
|
|
|
|
impl IntoResponse for ApiError {
|
|
fn into_response(self) -> Response {
|
|
let err = self.0;
|
|
|
|
let (status, message) = if let Some(err) = err.downcast_ref::<DbErr>() {
|
|
tracing::error!(%err, "error from db:");
|
|
(err.to_status_code(), "DB error".to_string()) // hide the detail
|
|
} else if let Some(err) = err.downcast_ref::<UserError>() {
|
|
(err.to_status_code(), err.to_string())
|
|
} else if let Some(err) = err.downcast_ref::<JsonRejection>() {
|
|
tracing::error!(%err, "error from extractor:");
|
|
(err.to_status_code(), err.to_string())
|
|
} else {
|
|
tracing::error!(%err, "error from other source:");
|
|
(
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
"Unknown error".to_string(),
|
|
)
|
|
};
|
|
|
|
(status, Json(ApiErrorResponse { message })).into_response()
|
|
}
|
|
}
|