shared/domain/role_permission/
model.rs1use chrono::DateTime;
2use mongodb::bson;
3use serde::{Deserialize, Serialize};
4use sqlx::FromRow;
5use utoipa::ToSchema;
6
7use crate::domain::query::IntoBsonDocument;
8
9use super::super::serde::{
10 deserialize_datetime, deserialize_object_id, deserialize_object_id_as_string,
11 serialize_object_id_as_string,
12};
13
14#[derive(Default, Debug, Clone, PartialEq, Eq, Deserialize, Serialize, FromRow, ToSchema)]
15#[schema(example = json!({ "permissionId": String::default(), "roleId": String::default() }))]
16pub struct RolePermission {
17 #[serde(
18 rename = "_id",
19 default,
20 skip_serializing_if = "Option::is_none",
21 deserialize_with = "deserialize_object_id_as_string"
22 )]
23 pub id: Option<String>,
24
25 #[sqlx(rename = "permissionId")]
26 #[serde(
27 rename = "permissionId",
28 default,
29 serialize_with = "serialize_object_id_as_string",
30 deserialize_with = "deserialize_object_id"
31 )]
32 pub permission_id: String,
33
34 #[sqlx(rename = "roleId")]
35 #[serde(
36 rename = "roleId",
37 default,
38 serialize_with = "serialize_object_id_as_string",
39 deserialize_with = "deserialize_object_id"
40 )]
41 pub role_id: String,
42
43 #[sqlx(rename = "issuedAt")]
44 #[serde(rename = "issuedAt", deserialize_with = "deserialize_datetime")]
45 pub issued_at: chrono::DateTime<chrono::Utc>,
46}
47
48impl RolePermission {
49 pub fn new(role_id: &str, permission_id: &str) -> Self {
50 Self {
51 id: None,
52 role_id: role_id.into(),
53 permission_id: permission_id.into(),
54 issued_at: chrono::Utc::now(),
55 }
56 }
57}
58
59impl IntoBsonDocument for RolePermission {
60 fn into_bson_document(self) -> Result<bson::Document, bson::ser::Error> {
61 let mut doc = bson::to_document(&self)?;
62
63 for key in &["issuedAt"] {
64 if let Some(bson::Bson::String(s)) = doc.get(*key).cloned()
65 && let Ok(dt) = DateTime::parse_from_rfc3339(&s)
66 {
67 doc.insert(
68 *key,
69 bson::Bson::DateTime(bson::DateTime::from_millis(dt.timestamp_millis())),
70 );
71 }
72 }
73
74 Ok(doc)
75 }
76}