koprogo_api/application/ports/
user_role_repository.rs

1use 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}