summaryrefslogtreecommitdiff
path: root/backend/src/queries/category_budgets/get_all.rs
blob: 6a8b040188b51fceb40d813e75103506424e931b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use crate::{
    models::{budget::Budget, category_budget::CategoryBudget},
    queries::{
        budget_updates::{
            get_first_budget_update_with_date, get_most_recent_budget_update_date_with_category_id,
        },
        categories::get_all_category_ids,
    },
};
use diesel::{result::Error, SqliteConnection};

pub fn get_all_category_budgets(
    connection: &mut SqliteConnection,
) -> Result<Vec<CategoryBudget>, Error> {
    let category_ids: Vec<i32> = get_all_category_ids(connection)?;

    let mut budgets = Vec::<CategoryBudget>::new();
    for category_id in category_ids {
        let most_recent_budget_update_date =
            get_most_recent_budget_update_date_with_category_id(category_id, connection)?;

        if most_recent_budget_update_date.is_none() {
            budgets.push(CategoryBudget {
                category_id,
                budget: Option::None,
            });
            continue;
        }

        let most_recent_budget_update = get_first_budget_update_with_date(
            most_recent_budget_update_date.unwrap().as_str(),
            connection,
        )?;

        budgets.push(CategoryBudget {
            category_id,
            budget: Some(Budget::from(&most_recent_budget_update)),
        });
    }

    Ok(budgets)
}