summaryrefslogtreecommitdiff
path: root/server/src/errors.rs
blob: 72eb8370e1776df29c82d647e5a369ae6165b1cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use axum::{
    http::StatusCode,
    response::{IntoResponse, Response},
    Json,
};
use serde_json::json;

/// All errors raised by the web app
pub enum AppError {
    /// Database error
    Database,
    /// Generic bad request. It is handled with a message value
    BadRequest(String),
    /// Not found error
    NotFound(String),
    /// Raised when a token is not good created
    TokenCreation,
    /// Raised when a passed token is not valid
    InvalidToken,
}

/// Use `AppError` as response for an endpoint
impl IntoResponse for AppError {
    /// Matches `AppError` into a tuple of status and error message.
    /// The response will be a JSON in the format of:
    /// ```json
    /// { "error": "<message>" }
    /// ```
    fn into_response(self) -> Response {
        let (status, error_message) = match self {
            AppError::Database => (
                StatusCode::INTERNAL_SERVER_ERROR,
                "Error with database connection".to_string(),
            ),
            AppError::BadRequest(value) => (StatusCode::BAD_REQUEST, value),
            AppError::NotFound(value) => (StatusCode::NOT_FOUND, value),
            AppError::TokenCreation => (
                StatusCode::INTERNAL_SERVER_ERROR,
                "Token creation error".to_string(),
            ),
            AppError::InvalidToken => (StatusCode::BAD_REQUEST, "Invalid token".to_string()),
        };

        let body = Json(json!({
            "error": error_message,
        }));

        (status, body).into_response()
    }
}

/// Transforms a `sqlx::Error` into a `AppError::Databse` error
impl From<sqlx::Error> for AppError {
    fn from(_error: sqlx::Error) -> AppError {
        AppError::Database
    }
}