koprogo_api/application/ports/
board_member_repository.rs

1use crate::domain::entities::BoardMember;
2use async_trait::async_trait;
3use uuid::Uuid;
4
5/// Port (interface) pour le repository des membres du conseil de copropriété
6#[async_trait]
7pub trait BoardMemberRepository: Send + Sync {
8    /// Crée un nouveau membre du conseil
9    async fn create(&self, board_member: &BoardMember) -> Result<BoardMember, String>;
10
11    /// Trouve un membre du conseil par son ID
12    async fn find_by_id(&self, id: Uuid) -> Result<Option<BoardMember>, String>;
13
14    /// Trouve tous les membres du conseil d'un immeuble
15    async fn find_by_building(&self, building_id: Uuid) -> Result<Vec<BoardMember>, String>;
16
17    /// Trouve tous les membres du conseil actifs d'un immeuble
18    /// (mandats non expirés à la date actuelle)
19    async fn find_active_by_building(&self, building_id: Uuid) -> Result<Vec<BoardMember>, String>;
20
21    /// Trouve les membres du conseil dont le mandat expire bientôt (< 60 jours)
22    async fn find_expiring_soon(
23        &self,
24        building_id: Uuid,
25        days_threshold: i32,
26    ) -> Result<Vec<BoardMember>, String>;
27
28    /// Trouve tous les mandats d'un copropriétaire (historique complet)
29    async fn find_by_owner(&self, owner_id: Uuid) -> Result<Vec<BoardMember>, String>;
30
31    /// Trouve le mandat d'un copropriétaire pour un immeuble spécifique (actif ou non)
32    async fn find_by_owner_and_building(
33        &self,
34        owner_id: Uuid,
35        building_id: Uuid,
36    ) -> Result<Option<BoardMember>, String>;
37
38    /// Vérifie si un copropriétaire a un mandat actif pour un immeuble donné
39    async fn has_active_mandate(&self, owner_id: Uuid, building_id: Uuid) -> Result<bool, String>;
40
41    /// Met à jour un membre du conseil (pour renouvellement de mandat)
42    async fn update(&self, board_member: &BoardMember) -> Result<BoardMember, String>;
43
44    /// Supprime un membre du conseil (fin de mandat anticipée)
45    async fn delete(&self, id: Uuid) -> Result<bool, String>;
46
47    /// Compte le nombre de membres actifs du conseil pour un immeuble
48    async fn count_active_by_building(&self, building_id: Uuid) -> Result<i64, String>;
49}