summaryrefslogtreecommitdiff
path: root/backend/app/src/routes
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
parent76974785294089965efc3f55b2a08d4089029c52 (diff)
All backend stuff lives in backend folder
Diffstat (limited to 'backend/app/src/routes')
-rw-r--r--backend/app/src/routes/account.rs57
-rw-r--r--backend/app/src/routes/balance.rs17
-rw-r--r--backend/app/src/routes/budget.rs18
-rw-r--r--backend/app/src/routes/budget_update.rs18
-rw-r--r--backend/app/src/routes/category.rs16
-rw-r--r--backend/app/src/routes/mod.rs5
6 files changed, 131 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}"
+ )),
+ },
+ }
+}
diff --git a/backend/app/src/routes/balance.rs b/backend/app/src/routes/balance.rs
new file mode 100644
index 0000000..f423c90
--- /dev/null
+++ b/backend/app/src/routes/balance.rs
@@ -0,0 +1,17 @@
+use rocket::{get, http::Status, serde::json::Json};
+
+use crate::{
+ databases::UserDataDb, models::category_balance::CategoryBalance,
+ queries::category_balances::get_all_category_balances as get_all_category_balances_query,
+};
+
+#[get("/balance/category")]
+pub async fn get_all_category_balances(
+ user_data_db: UserDataDb,
+) -> Result<Json<Vec<CategoryBalance>>, Status> {
+ user_data_db
+ .run(get_all_category_balances_query)
+ .await
+ .map(Json)
+ .map_err(|_| Status { code: 500 })
+}
diff --git a/backend/app/src/routes/budget.rs b/backend/app/src/routes/budget.rs
new file mode 100644
index 0000000..67aae8e
--- /dev/null
+++ b/backend/app/src/routes/budget.rs
@@ -0,0 +1,18 @@
+use rocket::get;
+use rocket::http::Status;
+use rocket::serde::json::Json;
+
+use crate::databases::UserDataDb;
+use crate::models::category_budget::CategoryBudget;
+use crate::queries;
+
+#[get("/budget/category?current")]
+pub async fn get_current_category_budget_per_category(
+ user_data_db: UserDataDb,
+) -> Result<Json<Vec<CategoryBudget>>, Status> {
+ user_data_db
+ .run(queries::category_budgets::get_most_recent_category_budget_per_category_id)
+ .await
+ .map(Json)
+ .map_err(|_| Status { code: 500 })
+}
diff --git a/backend/app/src/routes/budget_update.rs b/backend/app/src/routes/budget_update.rs
new file mode 100644
index 0000000..7732c7b
--- /dev/null
+++ b/backend/app/src/routes/budget_update.rs
@@ -0,0 +1,18 @@
+use rocket::get;
+use rocket::http::Status;
+use rocket::serde::json::Json;
+
+use crate::databases::UserDataDb;
+use crate::models::budget_update::BudgetUpdate;
+use crate::queries;
+
+#[get("/budget-update")]
+pub async fn get_all_budget_updates(
+ user_data_db: UserDataDb,
+) -> Result<Json<Vec<BudgetUpdate>>, Status> {
+ user_data_db
+ .run(queries::budget_updates::get_all_budget_updates)
+ .await
+ .map(Json)
+ .map_err(|_| Status { code: 500 })
+}
diff --git a/backend/app/src/routes/category.rs b/backend/app/src/routes/category.rs
new file mode 100644
index 0000000..01fd8d1
--- /dev/null
+++ b/backend/app/src/routes/category.rs
@@ -0,0 +1,16 @@
+use rocket::get;
+use rocket::http::Status;
+use rocket::serde::json::Json;
+
+use crate::databases::UserDataDb;
+use crate::models::category::Category;
+use crate::queries::categories::get_all_categories as get_all_categories_query;
+
+#[get("/category")]
+pub async fn get_all_categories(user_data_db: UserDataDb) -> Result<Json<Vec<Category>>, Status> {
+ user_data_db
+ .run(get_all_categories_query)
+ .await
+ .map(Json)
+ .map_err(|_| Status { code: 500 })
+}
diff --git a/backend/app/src/routes/mod.rs b/backend/app/src/routes/mod.rs
new file mode 100644
index 0000000..bf0ab4a
--- /dev/null
+++ b/backend/app/src/routes/mod.rs
@@ -0,0 +1,5 @@
+pub mod account;
+pub mod balance;
+pub mod budget;
+pub mod budget_update;
+pub mod category;