From 27b95c9186bd45edd4c982a7cc89cf69cf2c5d46 Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Wed, 16 Oct 2024 12:51:21 +0100 Subject: All backend stuff lives in backend folder --- backend/app/src/routes/account.rs | 57 +++++++++++++++++++++++++++++++++ backend/app/src/routes/balance.rs | 17 ++++++++++ backend/app/src/routes/budget.rs | 18 +++++++++++ backend/app/src/routes/budget_update.rs | 18 +++++++++++ backend/app/src/routes/category.rs | 16 +++++++++ backend/app/src/routes/mod.rs | 5 +++ 6 files changed, 131 insertions(+) create mode 100644 backend/app/src/routes/account.rs create mode 100644 backend/app/src/routes/balance.rs create mode 100644 backend/app/src/routes/budget.rs create mode 100644 backend/app/src/routes/budget_update.rs create mode 100644 backend/app/src/routes/category.rs create mode 100644 backend/app/src/routes/mod.rs (limited to 'backend/app/src/routes') 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>, 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), + + #[response(status = 400, content_type = "text")] + BadRequest(String), +} + +#[post("/account", data = "", format = "json")] +pub async fn create_account( + account: Json, + 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>, 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>, 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>, 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>, 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; -- cgit v1.2.3