backbone_maintenance/domain/entity/
mod.rs1pub mod maintenance_request;
6pub mod maintenance_schedule;
7pub mod maintenance_stage;
8pub mod maintenance_visit;
9pub mod maintenance_visit_part;
10pub mod request_kanban_state;
11pub mod request_priority;
12pub mod repeat_unit;
13pub mod repeat_type;
14pub mod maintenance_schedule_status;
15pub mod maintenance_type;
16pub mod visit_status;
17
18pub use maintenance_request::MaintenanceRequest;
20pub use maintenance_request::MaintenanceRequestBuilder;
21pub use maintenance_request::MaintenanceRequestId;
22pub use maintenance_schedule::MaintenanceSchedule;
23pub use maintenance_schedule::MaintenanceScheduleBuilder;
24pub use maintenance_schedule::MaintenanceScheduleId;
25pub use maintenance_stage::MaintenanceStage;
26pub use maintenance_stage::MaintenanceStageBuilder;
27pub use maintenance_stage::MaintenanceStageId;
28pub use maintenance_visit::MaintenanceVisit;
29pub use maintenance_visit::MaintenanceVisitBuilder;
30pub use maintenance_visit::MaintenanceVisitId;
31pub use maintenance_visit_part::MaintenanceVisitPart;
32pub use maintenance_visit_part::MaintenanceVisitPartBuilder;
33pub use maintenance_visit_part::MaintenanceVisitPartId;
34pub use request_kanban_state::RequestKanbanState;
35pub use request_priority::RequestPriority;
36pub use repeat_unit::RepeatUnit;
37pub use repeat_type::RepeatType;
38pub use maintenance_schedule_status::MaintenanceScheduleStatus;
39pub use maintenance_type::MaintenanceType;
40pub use visit_status::VisitStatus;
41
42use std::fmt::Debug;
47
48pub trait Entity: Debug + Clone {
53 type Id: Debug + Clone + PartialEq;
55
56 fn entity_id(&self) -> &Self::Id;
58
59 fn entity_type() -> &'static str;
61}
62
63use chrono::{DateTime, Utc};
68use serde::{Deserialize, Serialize};
69use uuid::Uuid;
70#[cfg(feature = "openapi")]
71use utoipa::ToSchema;
72
73#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
78#[cfg_attr(feature = "openapi", derive(ToSchema))]
79pub struct AuditMetadata {
80 #[serde(skip_serializing_if = "Option::is_none")]
82 pub created_at: Option<DateTime<Utc>>,
83
84 #[serde(skip_serializing_if = "Option::is_none")]
86 pub updated_at: Option<DateTime<Utc>>,
87
88 #[serde(skip_serializing_if = "Option::is_none")]
90 pub deleted_at: Option<DateTime<Utc>>,
91
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub created_by: Option<Uuid>,
95
96 #[serde(skip_serializing_if = "Option::is_none")]
98 pub updated_by: Option<Uuid>,
99
100 #[serde(skip_serializing_if = "Option::is_none")]
102 pub deleted_by: Option<Uuid>,
103}
104
105impl AuditMetadata {
106 pub fn new() -> Self {
108 Self {
109 created_at: Some(Utc::now()),
110 ..Default::default()
111 }
112 }
113
114 pub fn with_creator(creator_id: Uuid) -> Self {
116 Self {
117 created_at: Some(Utc::now()),
118 created_by: Some(creator_id),
119 ..Default::default()
120 }
121 }
122
123 pub fn touch(&mut self) {
125 self.updated_at = Some(Utc::now());
126 }
127
128 pub fn touch_by(&mut self, updater_id: Uuid) {
130 self.updated_at = Some(Utc::now());
131 self.updated_by = Some(updater_id);
132 }
133
134 pub fn soft_delete(&mut self) {
136 self.deleted_at = Some(Utc::now());
137 }
138
139 pub fn soft_delete_by(&mut self, deleter_id: Uuid) {
141 self.deleted_at = Some(Utc::now());
142 self.deleted_by = Some(deleter_id);
143 }
144
145 pub fn restore(&mut self) {
147 self.deleted_at = None;
148 self.deleted_by = None;
149 }
150
151 pub fn is_deleted(&self) -> bool {
153 self.deleted_at.is_some()
154 }
155
156 pub fn is_active(&self) -> bool {
158 self.deleted_at.is_none()
159 }
160}