Skip to main content

backbone_bucket/domain/entity/
mod.rs

1//! Domain Entities
2//!
3//! Generated by metaphor-schema. Do not edit manually.
4
5pub 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
41// Re-exports
42pub 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
104// ==========================================================================
105// Entity Trait
106// ==========================================================================
107
108use std::fmt::Debug;
109
110/// Trait for domain entities
111///
112/// All generated entities implement this trait, providing
113/// a common interface for working with domain objects.
114pub trait Entity: Debug + Clone {
115    /// The type of the entity's unique identifier
116    type Id: Debug + Clone + PartialEq;
117
118    /// Get the entity's unique identifier
119    fn entity_id(&self) -> &Self::Id;
120
121    /// Get the entity type name
122    fn entity_type() -> &'static str;
123}
124
125// ==========================================================================
126// Audit Metadata
127// ==========================================================================
128
129use chrono::{DateTime, Utc};
130use serde::{Deserialize, Serialize};
131use uuid::Uuid;
132#[cfg(feature = "openapi")]
133use utoipa::ToSchema;
134
135/// Audit metadata stored as JSONB in the database
136///
137/// This struct consolidates audit fields (timestamps and actors) into a single
138/// JSONB column for efficient storage and flexible querying.
139#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
140#[cfg_attr(feature = "openapi", derive(ToSchema))]
141pub struct AuditMetadata {
142    /// Timestamp when the record was created
143    #[serde(skip_serializing_if = "Option::is_none")]
144    pub created_at: Option<DateTime<Utc>>,
145
146    /// Timestamp when the record was last updated
147    #[serde(skip_serializing_if = "Option::is_none")]
148    pub updated_at: Option<DateTime<Utc>>,
149
150    /// Timestamp when the record was soft-deleted
151    #[serde(skip_serializing_if = "Option::is_none")]
152    pub deleted_at: Option<DateTime<Utc>>,
153
154    /// User ID who created the record
155    #[serde(skip_serializing_if = "Option::is_none")]
156    pub created_by: Option<Uuid>,
157
158    /// User ID who last updated the record
159    #[serde(skip_serializing_if = "Option::is_none")]
160    pub updated_by: Option<Uuid>,
161
162    /// User ID who deleted the record
163    #[serde(skip_serializing_if = "Option::is_none")]
164    pub deleted_by: Option<Uuid>,
165}
166
167impl AuditMetadata {
168    /// Create new audit metadata with created_at set to now
169    pub fn new() -> Self {
170        Self {
171            created_at: Some(Utc::now()),
172            ..Default::default()
173        }
174    }
175
176    /// Create with creator ID
177    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    /// Touch the record (update updated_at)
186    pub fn touch(&mut self) {
187        self.updated_at = Some(Utc::now());
188    }
189
190    /// Touch with updater ID
191    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    /// Soft delete the record
197    pub fn soft_delete(&mut self) {
198        self.deleted_at = Some(Utc::now());
199    }
200
201    /// Soft delete with deleter ID
202    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    /// Restore a soft-deleted record
208    pub fn restore(&mut self) {
209        self.deleted_at = None;
210        self.deleted_by = None;
211    }
212
213    /// Check if record is deleted
214    pub fn is_deleted(&self) -> bool {
215        self.deleted_at.is_some()
216    }
217
218    /// Check if record is active (not deleted)
219    pub fn is_active(&self) -> bool {
220        self.deleted_at.is_none()
221    }
222}