summaryrefslogtreecommitdiff
path: root/backend/src/routes/account.rs
blob: 7bbdb4f9acb6dbd6c9d2480a067f7d2671fa8cd5 (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 diesel::result::DatabaseErrorKind;
use rocket::http::Status;
use rocket::serde::json::Json;
use rocket::{get, post, Responder};

use crate::databases::UserDataDb;
use crate::models::account::Account;
use crate::queries::accounts::{get_all_accounts as get_all_accounts_query, insert_account};

#[get("/account")]
pub async fn get_all_accounts(user_data_db: UserDataDb) -> Result<Json<Vec<Account>>, Status> {
    user_data_db
        .run(get_all_accounts_query)
        .await
        .map(Json)
        .map_err(|_| Status { code: 500 })
}

#[derive(Responder)]
pub enum CreateAccountResponder {
    #[response(status = 500, content_type = "text")]
    InternalServerError(String),

    #[response(status = 202, content_type = "json")]
    Created(Json<Account>),

    #[response(status = 400, content_type = "text")]
    BadRequest(String),
}

#[post("/account", data = "<account>", format = "json")]
pub async fn create_account(
    account: Json<Account>,
    user_data_db: UserDataDb,
) -> CreateAccountResponder {
    let account = account.into_inner();
    let accounts_vec = vec![account.clone()];

    let num_rows_inserted = user_data_db
        .run(move |connection| insert_account(&accounts_vec, connection))
        .await;

    match num_rows_inserted {
        Ok(_) => CreateAccountResponder::Created(Json(account)),
        Err(err) => match err {
            diesel::result::Error::DatabaseError(DatabaseErrorKind::UniqueViolation, info) => {
                let column = info.column_name().unwrap_or("account");
                CreateAccountResponder::BadRequest(format!(
                    "Error creating account: {column} was not unique."
                ))
            }
            _ => CreateAccountResponder::InternalServerError(format!(
                "Error creating account: {err}"
            )),
        },
    }
}