koprogo_api/application/ports/
expense_repository.rs

1use crate::application::dto::{ExpenseFilters, PageRequest};
2use crate::domain::entities::Expense;
3use async_trait::async_trait;
4use uuid::Uuid;
5
6#[async_trait]
7pub trait ExpenseRepository: Send + Sync {
8    async fn create(&self, expense: &Expense) -> Result<Expense, String>;
9    async fn find_by_id(&self, id: Uuid) -> Result<Option<Expense>, String>;
10    async fn find_by_building(&self, building_id: Uuid) -> Result<Vec<Expense>, String>;
11
12    /// Find all expenses with pagination and filters
13    /// Returns tuple of (expenses, total_count)
14    async fn find_all_paginated(
15        &self,
16        page_request: &PageRequest,
17        filters: &ExpenseFilters,
18    ) -> Result<(Vec<Expense>, i64), String>;
19
20    async fn update(&self, expense: &Expense) -> Result<Expense, String>;
21    async fn delete(&self, id: Uuid) -> Result<bool, String>;
22}