backbone_bucket/domain/entity/
mod.rs1pub mod access_log;
6pub mod bucket;
7pub mod content_hash;
8pub mod conversion_job;
9pub mod file_comment;
10pub mod file_lock;
11pub mod file_share;
12pub mod file_version;
13pub mod processing_job;
14pub mod stored_file;
15pub mod thumbnail;
16pub mod upload_session;
17pub mod user_quota;
18pub mod bucket_type;
19pub mod bucket_status;
20pub mod storage_backend;
21pub mod hash_algorithm;
22pub mod conversion_status;
23pub mod conversion_type;
24pub mod comment_status;
25pub mod lock_status;
26pub mod share_type;
27pub mod share_status;
28pub mod share_permission;
29pub mod version_type;
30pub mod file_version_status;
31pub mod processing_job_type;
32pub mod job_status;
33pub mod file_status;
34pub mod threat_level;
35pub mod access_action;
36pub mod processing_status;
37pub mod thumbnail_size;
38pub mod upload_status;
39pub mod quota_status;
40
41pub use access_log::AccessLog;
43pub use access_log::AccessLogBuilder;
44pub use access_log::AccessLogId;
45pub use bucket::Bucket;
46pub use bucket::BucketBuilder;
47pub use bucket::BucketId;
48pub use content_hash::ContentHash;
49pub use content_hash::ContentHashBuilder;
50pub use content_hash::ContentHashId;
51pub use conversion_job::ConversionJob;
52pub use conversion_job::ConversionJobBuilder;
53pub use conversion_job::ConversionJobId;
54pub use file_comment::FileComment;
55pub use file_comment::FileCommentBuilder;
56pub use file_comment::FileCommentId;
57pub use file_lock::FileLock;
58pub use file_lock::FileLockBuilder;
59pub use file_lock::FileLockId;
60pub use file_share::FileShare;
61pub use file_share::FileShareBuilder;
62pub use file_share::FileShareId;
63pub use file_version::FileVersion;
64pub use file_version::FileVersionBuilder;
65pub use file_version::FileVersionId;
66pub use processing_job::ProcessingJob;
67pub use processing_job::ProcessingJobBuilder;
68pub use processing_job::ProcessingJobId;
69pub use stored_file::StoredFile;
70pub use stored_file::StoredFileBuilder;
71pub use stored_file::StoredFileId;
72pub use thumbnail::Thumbnail;
73pub use thumbnail::ThumbnailBuilder;
74pub use thumbnail::ThumbnailId;
75pub use upload_session::UploadSession;
76pub use upload_session::UploadSessionBuilder;
77pub use upload_session::UploadSessionId;
78pub use user_quota::UserQuota;
79pub use user_quota::UserQuotaBuilder;
80pub use user_quota::UserQuotaId;
81pub use bucket_type::BucketType;
82pub use bucket_status::BucketStatus;
83pub use storage_backend::StorageBackend;
84pub use hash_algorithm::HashAlgorithm;
85pub use conversion_status::ConversionStatus;
86pub use conversion_type::ConversionType;
87pub use comment_status::CommentStatus;
88pub use lock_status::LockStatus;
89pub use share_type::ShareType;
90pub use share_status::ShareStatus;
91pub use share_permission::SharePermission;
92pub use version_type::VersionType;
93pub use file_version_status::FileVersionStatus;
94pub use processing_job_type::ProcessingJobType;
95pub use job_status::JobStatus;
96pub use file_status::FileStatus;
97pub use threat_level::ThreatLevel;
98pub use access_action::AccessAction;
99pub use processing_status::ProcessingStatus;
100pub use thumbnail_size::ThumbnailSize;
101pub use upload_status::UploadStatus;
102pub use quota_status::QuotaStatus;
103
104use std::fmt::Debug;
109
110pub trait Entity: Debug + Clone {
115 type Id: Debug + Clone + PartialEq;
117
118 fn entity_id(&self) -> &Self::Id;
120
121 fn entity_type() -> &'static str;
123}
124
125use chrono::{DateTime, Utc};
130use serde::{Deserialize, Serialize};
131use uuid::Uuid;
132#[cfg(feature = "openapi")]
133use utoipa::ToSchema;
134
135#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
140#[cfg_attr(feature = "openapi", derive(ToSchema))]
141pub struct AuditMetadata {
142 #[serde(skip_serializing_if = "Option::is_none")]
144 pub created_at: Option<DateTime<Utc>>,
145
146 #[serde(skip_serializing_if = "Option::is_none")]
148 pub updated_at: Option<DateTime<Utc>>,
149
150 #[serde(skip_serializing_if = "Option::is_none")]
152 pub deleted_at: Option<DateTime<Utc>>,
153
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub created_by: Option<Uuid>,
157
158 #[serde(skip_serializing_if = "Option::is_none")]
160 pub updated_by: Option<Uuid>,
161
162 #[serde(skip_serializing_if = "Option::is_none")]
164 pub deleted_by: Option<Uuid>,
165}
166
167impl AuditMetadata {
168 pub fn new() -> Self {
170 Self {
171 created_at: Some(Utc::now()),
172 ..Default::default()
173 }
174 }
175
176 pub fn with_creator(creator_id: Uuid) -> Self {
178 Self {
179 created_at: Some(Utc::now()),
180 created_by: Some(creator_id),
181 ..Default::default()
182 }
183 }
184
185 pub fn touch(&mut self) {
187 self.updated_at = Some(Utc::now());
188 }
189
190 pub fn touch_by(&mut self, updater_id: Uuid) {
192 self.updated_at = Some(Utc::now());
193 self.updated_by = Some(updater_id);
194 }
195
196 pub fn soft_delete(&mut self) {
198 self.deleted_at = Some(Utc::now());
199 }
200
201 pub fn soft_delete_by(&mut self, deleter_id: Uuid) {
203 self.deleted_at = Some(Utc::now());
204 self.deleted_by = Some(deleter_id);
205 }
206
207 pub fn restore(&mut self) {
209 self.deleted_at = None;
210 self.deleted_by = None;
211 }
212
213 pub fn is_deleted(&self) -> bool {
215 self.deleted_at.is_some()
216 }
217
218 pub fn is_active(&self) -> bool {
220 self.deleted_at.is_none()
221 }
222}