2021-12-29 18:33:31 +01:00
|
|
|
use std::convert::Infallible;
|
|
|
|
|
|
|
|
use axum::{
|
|
|
|
body::{Bytes, Full},
|
|
|
|
response::IntoResponse,
|
|
|
|
Json,
|
|
|
|
};
|
|
|
|
use reqwest::StatusCode;
|
|
|
|
|
|
|
|
use super::models::ErrorResponse;
|
2022-07-20 11:57:38 +02:00
|
|
|
use crate::error::{APIError, ServiceError};
|
2022-01-02 17:25:23 +01:00
|
|
|
|
2021-12-29 18:33:31 +01:00
|
|
|
impl ErrorResponse {
|
|
|
|
fn new(status: StatusCode, message: Option<String>) -> Self {
|
2022-01-02 17:25:23 +01:00
|
|
|
let reason = status.canonical_reason().unwrap_or_default();
|
|
|
|
Self {
|
2021-12-29 18:33:31 +01:00
|
|
|
status,
|
2022-01-10 14:37:27 +01:00
|
|
|
error: message.unwrap_or_else(|| reason.to_string()),
|
2021-12-29 18:33:31 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-02 17:25:23 +01:00
|
|
|
impl IntoResponse for APIError {
|
2021-12-29 18:33:31 +01:00
|
|
|
type Body = Full<Bytes>;
|
|
|
|
|
|
|
|
type BodyError = Infallible;
|
|
|
|
|
|
|
|
fn into_response(self) -> axum::http::Response<Self::Body> {
|
2022-01-02 17:25:23 +01:00
|
|
|
let res = match self {
|
|
|
|
APIError::Sql(err) => match err {
|
|
|
|
sqlx::Error::RowNotFound => ErrorResponse::new(StatusCode::NOT_FOUND, None),
|
|
|
|
_ => ErrorResponse::new(StatusCode::INTERNAL_SERVER_ERROR, None),
|
|
|
|
},
|
2022-07-20 11:57:38 +02:00
|
|
|
APIError::Multipart(_) => ErrorResponse::new(
|
|
|
|
StatusCode::BAD_REQUEST,
|
|
|
|
Some("Invalid Multipart Form".to_string()),
|
|
|
|
),
|
2022-01-02 17:25:23 +01:00
|
|
|
APIError::BadRequest(err) => ErrorResponse::new(StatusCode::BAD_REQUEST, Some(err)),
|
2022-01-08 20:57:53 +01:00
|
|
|
APIError::Unauthorized(err) => ErrorResponse::new(StatusCode::UNAUTHORIZED, Some(err)),
|
|
|
|
APIError::Forbidden(err) => ErrorResponse::new(StatusCode::FORBIDDEN, Some(err)),
|
2022-01-16 17:46:09 +01:00
|
|
|
APIError::NotFound(err) => ErrorResponse::new(StatusCode::NOT_FOUND, Some(err)),
|
2022-07-20 11:57:38 +02:00
|
|
|
APIError::Internal(err) => {
|
|
|
|
ErrorResponse::new(StatusCode::INTERNAL_SERVER_ERROR, Some(err))
|
2022-07-21 12:18:25 +02:00
|
|
|
},
|
2022-07-20 11:57:38 +02:00
|
|
|
APIError::Service(err) => ErrorResponse::new(
|
|
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
Some(err.get_response_message()),
|
|
|
|
),
|
2022-01-11 19:42:15 +01:00
|
|
|
APIError::Query(_) => ErrorResponse::new(StatusCode::BAD_REQUEST, None),
|
2022-07-19 21:11:13 +02:00
|
|
|
APIError::Decode(_) => ErrorResponse::new(StatusCode::BAD_REQUEST, None),
|
2022-01-02 17:25:23 +01:00
|
|
|
};
|
2022-01-10 14:37:27 +01:00
|
|
|
let status = res.status;
|
2022-01-02 17:25:23 +01:00
|
|
|
(status, Json(res)).into_response()
|
2021-12-29 18:33:31 +01:00
|
|
|
}
|
|
|
|
}
|
2022-07-20 11:57:38 +02:00
|
|
|
|
|
|
|
impl ServiceError {
|
|
|
|
fn get_response_message(&self) -> String {
|
|
|
|
match self {
|
2022-07-26 11:59:52 +02:00
|
|
|
ServiceError::Reqwest(err) => {
|
|
|
|
format!(
|
|
|
|
"URL: {}, Status Code: {}",
|
|
|
|
match err.url() {
|
|
|
|
Some(url) => url.to_string(),
|
|
|
|
None => "No URL in error".to_string(),
|
|
|
|
},
|
|
|
|
match err.status() {
|
|
|
|
Some(code) => code.to_string(),
|
|
|
|
None => "No Status Code in error".to_string(),
|
|
|
|
}
|
|
|
|
)
|
|
|
|
},
|
2022-07-20 11:57:38 +02:00
|
|
|
ServiceError::Url(_) => "URL parse error".to_string(),
|
|
|
|
ServiceError::InvalidResponse(code) => format!("Invalid response code: {}", code),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|