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