summaryrefslogtreecommitdiff
path: root/rust/actualbudget_queries
diff options
context:
space:
mode:
Diffstat (limited to 'rust/actualbudget_queries')
-rw-r--r--rust/actualbudget_queries/Cargo.toml10
-rw-r--r--rust/actualbudget_queries/src/actualbudget_accounts.rs25
-rw-r--r--rust/actualbudget_queries/src/actualbudget_categories.rs7
-rw-r--r--rust/actualbudget_queries/src/actualbudget_transactions.rs23
-rw-r--r--rust/actualbudget_queries/src/actualbudget_zero_budgets.rs12
-rw-r--r--rust/actualbudget_queries/src/lib.rs4
6 files changed, 81 insertions, 0 deletions
diff --git a/rust/actualbudget_queries/Cargo.toml b/rust/actualbudget_queries/Cargo.toml
new file mode 100644
index 0000000..6108461
--- /dev/null
+++ b/rust/actualbudget_queries/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "actualbudget_queries"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+actualbudget_models = { path = "../actualbudget_models" }
+actualbudget_schema = { path = "../actualbudget_schema" }
+anyhow = { workspace = true }
+diesel = { workspace = true }
diff --git a/rust/actualbudget_queries/src/actualbudget_accounts.rs b/rust/actualbudget_queries/src/actualbudget_accounts.rs
new file mode 100644
index 0000000..1d8843d
--- /dev/null
+++ b/rust/actualbudget_queries/src/actualbudget_accounts.rs
@@ -0,0 +1,25 @@
+use actualbudget_models::actualbudget_account::ActualbudgetAccount;
+use actualbudget_schema::actualbudget_schema::accounts::{
+ self as accounts_schema,
+ dsl::accounts as accounts_table,
+};
+use anyhow::{Context, Result};
+use diesel::{ExpressionMethods, OptionalExtension, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
+
+pub fn get_all_actualbudget_accounts(connection: &mut SqliteConnection) -> Result<Vec<ActualbudgetAccount>> {
+ let actualbudget_accounts = accounts_table
+ .select(ActualbudgetAccount::as_select())
+ .load(connection)
+ .with_context(|| "failed to get all Actualbudget accounts")?;
+ Ok(actualbudget_accounts)
+}
+
+pub fn get_category_transfers_account(connection: &mut SqliteConnection) -> Result<Option<ActualbudgetAccount>> {
+ let category_transfers_account = accounts_table
+ .filter(accounts_schema::name.eq("Category transfers"))
+ .select(ActualbudgetAccount::as_select())
+ .first(connection)
+ .optional()
+ .with_context(|| "failed to get Category Transfers account")?;
+ Ok(category_transfers_account)
+}
diff --git a/rust/actualbudget_queries/src/actualbudget_categories.rs b/rust/actualbudget_queries/src/actualbudget_categories.rs
new file mode 100644
index 0000000..5f33e1e
--- /dev/null
+++ b/rust/actualbudget_queries/src/actualbudget_categories.rs
@@ -0,0 +1,7 @@
+use actualbudget_models::actualbudget_category::ActualbudgetCategory;
+use actualbudget_schema::actualbudget_schema::categories::dsl::categories;
+use diesel::{result::Error, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
+
+pub fn get_all_actualbudget_categories(connection: &mut SqliteConnection) -> Result<Vec<ActualbudgetCategory>, Error> {
+ categories.select(ActualbudgetCategory::as_select()).load(connection)
+}
diff --git a/rust/actualbudget_queries/src/actualbudget_transactions.rs b/rust/actualbudget_queries/src/actualbudget_transactions.rs
new file mode 100644
index 0000000..44d3730
--- /dev/null
+++ b/rust/actualbudget_queries/src/actualbudget_transactions.rs
@@ -0,0 +1,23 @@
+use actualbudget_models::{actualbudget_date::ActualbudgetDate, actualbudget_transaction::ActualbudgetTransaction};
+use actualbudget_schema::actualbudget_schema::transactions::{
+ self as transactions_schema,
+ dsl::transactions as transactions_table,
+};
+use anyhow::{Context, Result};
+use diesel::{dsl::min, result::Error, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
+
+pub fn get_all_actualbudget_transactions(connection: &mut SqliteConnection) -> Result<Vec<ActualbudgetTransaction>> {
+ let actualbudget_transactions = transactions_table
+ .select(ActualbudgetTransaction::as_select())
+ .load(connection)
+ .with_context(|| "failed to get all Actualbudget transactions")?;
+ Ok(actualbudget_transactions)
+}
+
+pub fn get_first_actualbudget_transaction_date(connection: &mut SqliteConnection) -> Result<ActualbudgetDate> {
+ let date_as_int = transactions_table
+ .select(min(transactions_schema::date))
+ .first::<Option<i32>>(connection)
+ .map_or_else(|e| Err(e), |o| o.map_or_else(|| Err(Error::NotFound), |i| Ok(i)))?;
+ Ok(ActualbudgetDate::from_i32(date_as_int))
+}
diff --git a/rust/actualbudget_queries/src/actualbudget_zero_budgets.rs b/rust/actualbudget_queries/src/actualbudget_zero_budgets.rs
new file mode 100644
index 0000000..187fe8d
--- /dev/null
+++ b/rust/actualbudget_queries/src/actualbudget_zero_budgets.rs
@@ -0,0 +1,12 @@
+use anyhow::{Context, Result};
+use actualbudget_models::actualbudget_zero_budget::ActualbudgetZeroBudget;
+use actualbudget_schema::actualbudget_schema::zero_budgets::dsl::zero_budgets as zero_budgets_table;
+use diesel::{QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
+
+pub fn get_all_actualbudget_zero_budgets(connection: &mut SqliteConnection) -> Result<Vec<ActualbudgetZeroBudget>> {
+ let zero_budgets = zero_budgets_table
+ .select(ActualbudgetZeroBudget::as_select())
+ .load(connection)
+ .with_context(|| "failed to get all Actualbudget zero budgets")?;
+ Ok(zero_budgets)
+}
diff --git a/rust/actualbudget_queries/src/lib.rs b/rust/actualbudget_queries/src/lib.rs
new file mode 100644
index 0000000..e16dafc
--- /dev/null
+++ b/rust/actualbudget_queries/src/lib.rs
@@ -0,0 +1,4 @@
+pub mod actualbudget_accounts;
+pub mod actualbudget_categories;
+pub mod actualbudget_transactions;
+pub mod actualbudget_zero_budgets;