From 1ae19eb3315c40e3f9062592c27fa76c11cf626c Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Sun, 17 Nov 2024 09:23:28 +0000 Subject: Renames workspace folder --- rust/core/src/queries/budget_updates/delete_all.rs | 11 +++++++++ rust/core/src/queries/budget_updates/get_all.rs | 16 +++++++++++++ .../get_first_with_date_and_category_id.rs | 25 +++++++++++++++++++ .../get_most_recent_with_category_id.rs | 21 ++++++++++++++++ rust/core/src/queries/budget_updates/insert.rs | 28 ++++++++++++++++++++++ rust/core/src/queries/budget_updates/mod.rs | 11 +++++++++ 6 files changed, 112 insertions(+) create mode 100644 rust/core/src/queries/budget_updates/delete_all.rs create mode 100644 rust/core/src/queries/budget_updates/get_all.rs create mode 100644 rust/core/src/queries/budget_updates/get_first_with_date_and_category_id.rs create mode 100644 rust/core/src/queries/budget_updates/get_most_recent_with_category_id.rs create mode 100644 rust/core/src/queries/budget_updates/insert.rs create mode 100644 rust/core/src/queries/budget_updates/mod.rs (limited to 'rust/core/src/queries/budget_updates') diff --git a/rust/core/src/queries/budget_updates/delete_all.rs b/rust/core/src/queries/budget_updates/delete_all.rs new file mode 100644 index 0000000..b7ad082 --- /dev/null +++ b/rust/core/src/queries/budget_updates/delete_all.rs @@ -0,0 +1,11 @@ +use anyhow::{Context, Result}; +use diesel::{RunQueryDsl, SqliteConnection}; + +use crate::schema::budget_updates::dsl::budget_updates; + +pub fn delete_all_budget_updates(connection: &mut SqliteConnection) -> Result { + let num_rows_deleted = diesel::delete(budget_updates) + .execute(connection) + .with_context(|| "failed to delete all budget updates")?; + Ok(num_rows_deleted) +} diff --git a/rust/core/src/queries/budget_updates/get_all.rs b/rust/core/src/queries/budget_updates/get_all.rs new file mode 100644 index 0000000..9c9310b --- /dev/null +++ b/rust/core/src/queries/budget_updates/get_all.rs @@ -0,0 +1,16 @@ +use anyhow::{Context, Result}; +use crate::{ + models::budget_update::BudgetUpdate, + schema::budget_updates::dsl::budget_updates as budget_updates_table, +}; +use diesel::{QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; + +pub fn get_all_budget_updates( + connection: &mut SqliteConnection, +) -> Result> { + let all_budget_updates = budget_updates_table + .select(BudgetUpdate::as_select()) + .load::(connection) + .with_context(|| "failed to get all budget updates")?; + Ok(all_budget_updates) +} diff --git a/rust/core/src/queries/budget_updates/get_first_with_date_and_category_id.rs b/rust/core/src/queries/budget_updates/get_first_with_date_and_category_id.rs new file mode 100644 index 0000000..2d8f97c --- /dev/null +++ b/rust/core/src/queries/budget_updates/get_first_with_date_and_category_id.rs @@ -0,0 +1,25 @@ +use anyhow::{Context, Result}; +use crate::{ + models::{budget_update::BudgetUpdate, date_utc::DateUtc}, + schema::budget_updates::{ + self as budget_updates_schema, dsl::budget_updates as budget_updates_table, + }, +}; +use diesel::{ + ExpressionMethods, OptionalExtension, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection +}; + +pub fn get_first_budget_update_with_date_and_category_id( + date: &DateUtc, + category_id: i32, + connection: &mut SqliteConnection, +) -> Result> { + let first_budget_update = budget_updates_table + .select(BudgetUpdate::as_select()) + .filter(budget_updates_schema::date.eq(date.to_string())) + .filter(budget_updates_schema::category_id.eq(category_id)) + .first(connection) + .optional() + .with_context(|| format!("failed to get first budget update with date {}", date.to_string()))?; + Ok(first_budget_update) +} diff --git a/rust/core/src/queries/budget_updates/get_most_recent_with_category_id.rs b/rust/core/src/queries/budget_updates/get_most_recent_with_category_id.rs new file mode 100644 index 0000000..41ef5ec --- /dev/null +++ b/rust/core/src/queries/budget_updates/get_most_recent_with_category_id.rs @@ -0,0 +1,21 @@ +use anyhow::{Context, Result}; +use crate::{ + models::date_utc::DateUtc, + schema::budget_updates::{ + self as budget_updates_schema, dsl::budget_updates as budget_updates_table, + }, traits::nowlike::Nowlike, +}; +use diesel::{dsl::max, ExpressionMethods, QueryDsl, RunQueryDsl, SqliteConnection}; + +pub fn get_most_recent_budget_update_date_with_category_id( + category_id: i32, + connection: &mut SqliteConnection, +) -> Result> { + let most_recent_date = budget_updates_table + .select(max(budget_updates_schema::date)) + .filter(budget_updates_schema::category_id.eq(category_id)) + .filter(budget_updates_schema::date.le(DateUtc::now())) + .first(connection) + .with_context(|| format!("failed to get most recent budget update date with category ID {}", category_id))?; + Ok(most_recent_date) +} diff --git a/rust/core/src/queries/budget_updates/insert.rs b/rust/core/src/queries/budget_updates/insert.rs new file mode 100644 index 0000000..e8ae271 --- /dev/null +++ b/rust/core/src/queries/budget_updates/insert.rs @@ -0,0 +1,28 @@ +use anyhow::{Context, Result}; +use crate::{ + models::budget_update::BudgetUpdate, + schema::budget_updates::dsl::budget_updates as budget_updates_table, +}; +use diesel::prelude::*; + +pub fn insert_budget_updates( + budget_updates: &[BudgetUpdate], + connection: &mut SqliteConnection, +) -> Result { + let num_rows_inserted = diesel::insert_into(budget_updates_table) + .values(budget_updates) + .execute(connection) + .with_context(|| err_msg(budget_updates))?; + Ok(num_rows_inserted) +} + +fn err_msg(budget_updates: &[BudgetUpdate]) -> String { + format!( + "failed to insert budget updates: [{}]", + budget_updates + .iter() + .map(|a| a.id.to_string()) + .collect::>() + .join(", ") + ) +} diff --git a/rust/core/src/queries/budget_updates/mod.rs b/rust/core/src/queries/budget_updates/mod.rs new file mode 100644 index 0000000..6fc7de0 --- /dev/null +++ b/rust/core/src/queries/budget_updates/mod.rs @@ -0,0 +1,11 @@ +mod delete_all; +mod get_all; +mod get_first_with_date_and_category_id; +mod get_most_recent_with_category_id; +mod insert; + +pub use delete_all::delete_all_budget_updates; +pub use get_all::get_all_budget_updates; +pub use get_first_with_date_and_category_id::get_first_budget_update_with_date_and_category_id; +pub use get_most_recent_with_category_id::get_most_recent_budget_update_date_with_category_id; +pub use insert::insert_budget_updates; -- cgit v1.2.3