bobashare_web/api/v1/
mod.rsuse std::error::Error;
use axum::{
response::{IntoResponse, Response},
routing::{delete, get, put},
Json, Router,
};
use hyper::StatusCode;
use serde_json::json;
use tracing::{event, Level};
use crate::AppState;
pub mod delete;
pub mod info;
pub mod upload;
pub fn router() -> Router<&'static AppState> {
Router::new()
.route("/info/{id}", get(info::info))
.route("/upload/{filename}", put(upload::put))
.route("/delete/{id}", delete(delete::delete))
}
pub trait ApiErrorExt: Error + Sized + Send + Sync + 'static {
fn into_response_with_code(self, code: StatusCode) -> Response {
let mut error_msg = self.to_string(); let mut err_buf = self.source();
while let Some(e) = err_buf {
error_msg += &format!(": {e}");
err_buf = e.source();
}
if code.is_server_error() {
event!(Level::ERROR, status = code.as_u16(), error = error_msg);
} else if code.is_client_error() {
event!(Level::WARN, status = code.as_u16(), error = error_msg);
} else {
event!(Level::INFO, status = code.as_u16(), error = error_msg);
}
let resp = json!({
"status": "error",
"error": serde_error::Error::new(&self),
"message": error_msg,
});
(code, Json(resp)).into_response()
}
}
impl<T> ApiErrorExt for T where T: Error + Send + Sync + 'static {}