Skip to main content

shared/domain/role_permission/
repository.rs

1use std::sync::Arc;
2
3use crate::error::{CoreError, InternalError, ResourceKind, Result};
4
5use super::model::RolePermission;
6use super::ports::database::DatabaseAdapter;
7use super::ports::query::QueryBuilder;
8
9#[derive(Clone)]
10pub struct RolePermissionRepository {
11    adapter: Arc<dyn DatabaseAdapter<RolePermission>>,
12}
13
14impl RolePermissionRepository {
15    pub fn new(adapter: Arc<dyn DatabaseAdapter<RolePermission>>) -> Self {
16        Self { adapter }
17    }
18}
19
20impl RolePermissionRepository {
21    #[tracing::instrument(name = "db.role_permission.insert", skip(self, role))]
22    pub async fn insert(&self, role: RolePermission) -> Result<()> {
23        match self.adapter.upsert(role).await {
24            Ok(_id) => Ok(()),
25            Err(err) => {
26                tracing::error!("Failed to assign permission to role - {err}");
27                Err(CoreError::Internal(InternalError::Database(
28                    err.to_string(),
29                )))
30            }
31        }
32    }
33    #[tracing::instrument(name = "db.role_permission.insert", skip(self, roles))]
34    pub async fn upsert_many(&self, roles: Vec<RolePermission>) -> Result<()> {
35        match self.adapter.upsert_many(roles).await {
36            Ok(_id) => Ok(()),
37            Err(err) => {
38                tracing::error!("Failed to assign permission to role - {err}");
39                Err(CoreError::Internal(InternalError::Database(
40                    err.to_string(),
41                )))
42            }
43        }
44    }
45
46    #[tracing::instrument(name = "db.role_permission.find", skip(self, id))]
47    pub async fn find(&self, id: &str) -> Result<RolePermission> {
48        let filter = QueryBuilder::default().eq("id", id);
49
50        match self.adapter.find_one(filter).await {
51            Ok(Some(role)) => Ok(role),
52            Ok(None) => Err(CoreError::NotFound(ResourceKind::Role {
53                id: Some(id.into()),
54            })),
55            Err(err) => {
56                tracing::error!(error_code = "InternalError::Database", error = %err, "Database query failed");
57                Err(err)
58            }
59        }
60    }
61
62    #[tracing::instrument(name = "db.role_permission.find_all", skip(self, role_id))]
63    pub async fn find_all(&self, role_id: &str) -> Result<Vec<RolePermission>> {
64        let filter = QueryBuilder::default().eq("roleId", role_id);
65
66        match self.adapter.find_all(filter).await {
67            Ok(roles) => Ok(roles),
68            Err(err) => {
69                tracing::error!(error_code = "InternalError::Database", error = %err, "Database query failed");
70                Err(err)
71            }
72        }
73    }
74
75    #[tracing::instrument(name = "db.role_permission.find", skip(self, user_id, role_id))]
76    pub async fn delete(&self, user_id: &str, role_id: &str) -> Result<()> {
77        let filter = QueryBuilder::default()
78            .eq("userId", user_id)
79            .eq("roleId", role_id);
80
81        match self.adapter.delete_one(filter).await {
82            Ok(_) => Ok(()),
83            Err(err) => {
84                tracing::error!(error_code = "InternalError::Database", error = %err, "Database query failed");
85                Err(err)
86            }
87        }
88    }
89}