backbone-bucket 0.4.0

Bucket Bounded Context: File Storage Module for Backbone Framework
Documentation
//! Domain Entities
//!
//! Generated by metaphor-schema. Do not edit manually.

pub mod access_log;
pub mod bucket;
pub mod content_hash;
pub mod conversion_job;
pub mod file_comment;
pub mod file_lock;
pub mod file_share;
pub mod file_version;
pub mod processing_job;
pub mod stored_file;
pub mod thumbnail;
pub mod upload_session;
pub mod user_quota;
pub mod bucket_type;
pub mod bucket_status;
pub mod storage_backend;
pub mod hash_algorithm;
pub mod conversion_status;
pub mod conversion_type;
pub mod comment_status;
pub mod lock_status;
pub mod share_type;
pub mod share_status;
pub mod share_permission;
pub mod version_type;
pub mod file_version_status;
pub mod processing_job_type;
pub mod job_status;
pub mod file_status;
pub mod threat_level;
pub mod access_action;
pub mod processing_status;
pub mod thumbnail_size;
pub mod upload_status;
pub mod quota_status;

// Re-exports
pub use access_log::AccessLog;
pub use access_log::AccessLogBuilder;
pub use access_log::AccessLogId;
pub use bucket::Bucket;
pub use bucket::BucketBuilder;
pub use bucket::BucketId;
pub use content_hash::ContentHash;
pub use content_hash::ContentHashBuilder;
pub use content_hash::ContentHashId;
pub use conversion_job::ConversionJob;
pub use conversion_job::ConversionJobBuilder;
pub use conversion_job::ConversionJobId;
pub use file_comment::FileComment;
pub use file_comment::FileCommentBuilder;
pub use file_comment::FileCommentId;
pub use file_lock::FileLock;
pub use file_lock::FileLockBuilder;
pub use file_lock::FileLockId;
pub use file_share::FileShare;
pub use file_share::FileShareBuilder;
pub use file_share::FileShareId;
pub use file_version::FileVersion;
pub use file_version::FileVersionBuilder;
pub use file_version::FileVersionId;
pub use processing_job::ProcessingJob;
pub use processing_job::ProcessingJobBuilder;
pub use processing_job::ProcessingJobId;
pub use stored_file::StoredFile;
pub use stored_file::StoredFileBuilder;
pub use stored_file::StoredFileId;
pub use thumbnail::Thumbnail;
pub use thumbnail::ThumbnailBuilder;
pub use thumbnail::ThumbnailId;
pub use upload_session::UploadSession;
pub use upload_session::UploadSessionBuilder;
pub use upload_session::UploadSessionId;
pub use user_quota::UserQuota;
pub use user_quota::UserQuotaBuilder;
pub use user_quota::UserQuotaId;
pub use bucket_type::BucketType;
pub use bucket_status::BucketStatus;
pub use storage_backend::StorageBackend;
pub use hash_algorithm::HashAlgorithm;
pub use conversion_status::ConversionStatus;
pub use conversion_type::ConversionType;
pub use comment_status::CommentStatus;
pub use lock_status::LockStatus;
pub use share_type::ShareType;
pub use share_status::ShareStatus;
pub use share_permission::SharePermission;
pub use version_type::VersionType;
pub use file_version_status::FileVersionStatus;
pub use processing_job_type::ProcessingJobType;
pub use job_status::JobStatus;
pub use file_status::FileStatus;
pub use threat_level::ThreatLevel;
pub use access_action::AccessAction;
pub use processing_status::ProcessingStatus;
pub use thumbnail_size::ThumbnailSize;
pub use upload_status::UploadStatus;
pub use quota_status::QuotaStatus;

// ==========================================================================
// Entity Trait
// ==========================================================================

use std::fmt::Debug;

/// Trait for domain entities
///
/// All generated entities implement this trait, providing
/// a common interface for working with domain objects.
pub trait Entity: Debug + Clone {
    /// The type of the entity's unique identifier
    type Id: Debug + Clone + PartialEq;

    /// Get the entity's unique identifier
    fn entity_id(&self) -> &Self::Id;

    /// Get the entity type name
    fn entity_type() -> &'static str;
}

// ==========================================================================
// Audit Metadata
// ==========================================================================

use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[cfg(feature = "openapi")]
use utoipa::ToSchema;

/// Audit metadata stored as JSONB in the database
///
/// This struct consolidates audit fields (timestamps and actors) into a single
/// JSONB column for efficient storage and flexible querying.
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct AuditMetadata {
    /// Timestamp when the record was created
    #[serde(skip_serializing_if = "Option::is_none")]
    pub created_at: Option<DateTime<Utc>>,

    /// Timestamp when the record was last updated
    #[serde(skip_serializing_if = "Option::is_none")]
    pub updated_at: Option<DateTime<Utc>>,

    /// Timestamp when the record was soft-deleted
    #[serde(skip_serializing_if = "Option::is_none")]
    pub deleted_at: Option<DateTime<Utc>>,

    /// User ID who created the record
    #[serde(skip_serializing_if = "Option::is_none")]
    pub created_by: Option<Uuid>,

    /// User ID who last updated the record
    #[serde(skip_serializing_if = "Option::is_none")]
    pub updated_by: Option<Uuid>,

    /// User ID who deleted the record
    #[serde(skip_serializing_if = "Option::is_none")]
    pub deleted_by: Option<Uuid>,
}

impl AuditMetadata {
    /// Create new audit metadata with created_at set to now
    pub fn new() -> Self {
        Self {
            created_at: Some(Utc::now()),
            ..Default::default()
        }
    }

    /// Create with creator ID
    pub fn with_creator(creator_id: Uuid) -> Self {
        Self {
            created_at: Some(Utc::now()),
            created_by: Some(creator_id),
            ..Default::default()
        }
    }

    /// Touch the record (update updated_at)
    pub fn touch(&mut self) {
        self.updated_at = Some(Utc::now());
    }

    /// Touch with updater ID
    pub fn touch_by(&mut self, updater_id: Uuid) {
        self.updated_at = Some(Utc::now());
        self.updated_by = Some(updater_id);
    }

    /// Soft delete the record
    pub fn soft_delete(&mut self) {
        self.deleted_at = Some(Utc::now());
    }

    /// Soft delete with deleter ID
    pub fn soft_delete_by(&mut self, deleter_id: Uuid) {
        self.deleted_at = Some(Utc::now());
        self.deleted_by = Some(deleter_id);
    }

    /// Restore a soft-deleted record
    pub fn restore(&mut self) {
        self.deleted_at = None;
        self.deleted_by = None;
    }

    /// Check if record is deleted
    pub fn is_deleted(&self) -> bool {
        self.deleted_at.is_some()
    }

    /// Check if record is active (not deleted)
    pub fn is_active(&self) -> bool {
        self.deleted_at.is_none()
    }
}