koprogo_api/application/ports/
user_role_repository.rs1use crate::domain::entities::UserRoleAssignment;
2use async_trait::async_trait;
3use std::collections::HashMap;
4use uuid::Uuid;
5
6#[async_trait]
7pub trait UserRoleRepository: Send + Sync {
8 async fn create(&self, assignment: &UserRoleAssignment) -> Result<UserRoleAssignment, String>;
9 async fn list_for_user(&self, user_id: Uuid) -> Result<Vec<UserRoleAssignment>, String>;
10 async fn list_for_users(
11 &self,
12 user_ids: &[Uuid],
13 ) -> Result<HashMap<Uuid, Vec<UserRoleAssignment>>, String>;
14 async fn replace_all(
15 &self,
16 user_id: Uuid,
17 assignments: &[UserRoleAssignment],
18 ) -> Result<(), String>;
19 async fn find_by_id(&self, id: Uuid) -> Result<Option<UserRoleAssignment>, String>;
20 async fn set_primary_role(
21 &self,
22 user_id: Uuid,
23 role_id: Uuid,
24 ) -> Result<UserRoleAssignment, String>;
25}
26
27#[cfg(test)]
28pub use tests::MockUserRoleRepo;
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33 use mockall::mock;
34
35 mock! {
36 pub UserRoleRepo {}
37
38 #[async_trait]
39 impl UserRoleRepository for UserRoleRepo {
40 async fn create(&self, assignment: &UserRoleAssignment) -> Result<UserRoleAssignment, String>;
41 async fn list_for_user(&self, user_id: Uuid) -> Result<Vec<UserRoleAssignment>, String>;
42 async fn list_for_users(
43 &self,
44 user_ids: &[Uuid],
45 ) -> Result<HashMap<Uuid, Vec<UserRoleAssignment>>, String>;
46 async fn replace_all(
47 &self,
48 user_id: Uuid,
49 assignments: &[UserRoleAssignment],
50 ) -> Result<(), String>;
51 async fn find_by_id(&self, id: Uuid) -> Result<Option<UserRoleAssignment>, String>;
52 async fn set_primary_role(
53 &self,
54 user_id: Uuid,
55 role_id: Uuid,
56 ) -> Result<UserRoleAssignment, String>;
57 }
58 }
59}