summaryrefslogtreecommitdiff
path: root/rust/schist_backend/src/routes/account.rs
blob: 83d4d1bbbb6a265fbdc6ae0d867e1b4e86c84260 (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
use schist_models::account::Account;
use schist_queries::accounts::{get_all_accounts as get_all_accounts_query, insert_accounts};
use rocket::http::Status;
use rocket::serde::json::Json;
use rocket::{get, post, Responder};

use crate::databases::UserDataDb;

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

#[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_accounts(&accounts_vec, connection))
        .await;

    match num_rows_inserted {
        Ok(_) => CreateAccountResponder::Created(Json(account)),
        Err(err) => CreateAccountResponder::InternalServerError(format!(
                "Error creating account: {err}"
            )),
    }
}