summaryrefslogtreecommitdiff
path: root/backend/app/src/routes/account.rs
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2024-10-16 12:51:21 +0100
committerJoe Carstairs <me@joeac.net>2024-10-16 12:51:21 +0100
commit27b95c9186bd45edd4c982a7cc89cf69cf2c5d46 (patch)
treebf104ff9d64e601bfec5516eb51ef298f3095e9b /backend/app/src/routes/account.rs
parent76974785294089965efc3f55b2a08d4089029c52 (diff)
All backend stuff lives in backend folder
Diffstat (limited to 'backend/app/src/routes/account.rs')
-rw-r--r--backend/app/src/routes/account.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/backend/app/src/routes/account.rs b/backend/app/src/routes/account.rs
new file mode 100644
index 0000000..7bbdb4f
--- /dev/null
+++ b/backend/app/src/routes/account.rs
@@ -0,0 +1,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}"
+ )),
+ },
+ }
+}