use serde::{Deserialize, Serialize};
use uuid::Uuid;
use chrono::{DateTime, Utc};
use crate::domain::entity::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct AccessLogId(pub Uuid);
impl AccessLogId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for AccessLogId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<AccessLogId> for Uuid {
fn from(id: AccessLogId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessLogDto {
pub id: AccessLogId,
pub file_id: Uuid,
pub bucket_id: Option<Uuid>,
pub action: AccessAction,
pub user_id: Option<Uuid>,
pub share_id: Option<Uuid>,
pub is_owner: bool,
pub is_shared: bool,
pub is_public: bool,
pub ip_address: Option<String>,
pub user_agent: Option<String>,
pub referer: Option<String>,
pub country_code: Option<String>,
pub city: Option<String>,
pub bytes_transferred: Option<i64>,
pub duration_ms: Option<i32>,
pub success: bool,
pub error_message: Option<String>,
pub accessed_at: DateTime<Utc>,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessLogSummary {
pub id: AccessLogId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessLogRef {
pub id: AccessLogId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct BucketId(pub Uuid);
impl BucketId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for BucketId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<BucketId> for Uuid {
fn from(id: BucketId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BucketDto {
pub id: BucketId,
pub name: String,
pub slug: String,
pub description: Option<String>,
pub owner_id: Uuid,
pub bucket_type: BucketType,
pub status: BucketStatus,
pub storage_backend: StorageBackend,
pub root_path: String,
pub file_count: i32,
pub total_size_bytes: i64,
pub max_file_size: Option<i64>,
pub allowed_mime_types: Vec<String>,
pub auto_delete_after_days: Option<i32>,
pub enable_cdn: bool,
pub enable_versioning: bool,
pub enable_deduplication: bool,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BucketSummary {
pub id: BucketId,
pub name: String,
pub status: BucketStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BucketRef {
pub id: BucketId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ContentHashId(pub Uuid);
impl ContentHashId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for ContentHashId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<ContentHashId> for Uuid {
fn from(id: ContentHashId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContentHashDto {
pub id: ContentHashId,
pub hash: String,
pub size_bytes: i64,
pub storage_key: String,
pub storage_backend: StorageBackend,
pub reference_count: i32,
pub first_uploaded_at: DateTime<Utc>,
pub last_referenced_at: DateTime<Utc>,
pub fingerprint: Option<String>,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContentHashSummary {
pub id: ContentHashId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContentHashRef {
pub id: ContentHashId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ConversionJobId(pub Uuid);
impl ConversionJobId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for ConversionJobId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<ConversionJobId> for Uuid {
fn from(id: ConversionJobId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConversionJobDto {
pub id: ConversionJobId,
pub source_file_id: Uuid,
pub target_format: String,
pub status: ConversionStatus,
pub conversion_options: Option<serde_json::Value>,
pub result_file_id: Option<Uuid>,
pub progress: i32,
pub error_message: Option<String>,
pub started_at: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConversionJobSummary {
pub id: ConversionJobId,
pub status: ConversionStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConversionJobRef {
pub id: ConversionJobId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct FileCommentId(pub Uuid);
impl FileCommentId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for FileCommentId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<FileCommentId> for Uuid {
fn from(id: FileCommentId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileCommentDto {
pub id: FileCommentId,
pub file_id: Uuid,
pub user_id: Uuid,
pub parent_id: Option<Uuid>,
pub content: String,
pub annotation_region: Option<serde_json::Value>,
pub mentions: Vec<Uuid>,
pub resolved: bool,
pub resolved_by: Option<Uuid>,
pub resolved_at: Option<DateTime<Utc>>,
pub status: CommentStatus,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileCommentSummary {
pub id: FileCommentId,
pub status: CommentStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileCommentRef {
pub id: FileCommentId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct FileLockId(pub Uuid);
impl FileLockId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for FileLockId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<FileLockId> for Uuid {
fn from(id: FileLockId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileLockDto {
pub id: FileLockId,
pub file_id: Uuid,
pub user_id: Uuid,
pub locked_at: DateTime<Utc>,
pub expires_at: DateTime<Utc>,
pub refreshed_at: Option<DateTime<Utc>>,
pub status: LockStatus,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileLockSummary {
pub id: FileLockId,
pub status: LockStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileLockRef {
pub id: FileLockId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct FileShareId(pub Uuid);
impl FileShareId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for FileShareId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<FileShareId> for Uuid {
fn from(id: FileShareId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileShareDto {
pub id: FileShareId,
pub file_id: Uuid,
pub owner_id: Uuid,
pub token: String,
pub share_type: ShareType,
pub permission: SharePermission,
pub shared_with: Vec<Uuid>,
pub password_hash: Option<String>,
pub max_downloads: Option<i32>,
pub download_count: i32,
pub expires_at: Option<DateTime<Utc>>,
pub status: ShareStatus,
pub revoked_at: Option<DateTime<Utc>>,
pub revoked_by: Option<Uuid>,
pub message: Option<String>,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileShareSummary {
pub id: FileShareId,
pub status: ShareStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileShareRef {
pub id: FileShareId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct FileVersionId(pub Uuid);
impl FileVersionId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for FileVersionId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<FileVersionId> for Uuid {
fn from(id: FileVersionId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileVersionDto {
pub id: FileVersionId,
pub file_id: Uuid,
pub version_number: i32,
pub version_type: VersionType,
pub storage_key: String,
pub storage_backend: String,
pub name: String,
pub mime_type: String,
pub checksum_md5: Option<String>,
pub checksum_sha256: Option<String>,
pub created_by_id: Uuid,
pub change_summary: Option<String>,
pub is_current: bool,
pub restored_from_id: Option<Uuid>,
pub expires_at: Option<DateTime<Utc>>,
pub status: FileVersionStatus,
pub deleted_at: Option<DateTime<Utc>>,
pub size_bytes: i64,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileVersionSummary {
pub id: FileVersionId,
pub name: String,
pub status: FileVersionStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileVersionRef {
pub id: FileVersionId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ProcessingJobId(pub Uuid);
impl ProcessingJobId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for ProcessingJobId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<ProcessingJobId> for Uuid {
fn from(id: ProcessingJobId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProcessingJobDto {
pub id: ProcessingJobId,
pub file_id: Uuid,
pub job_type: ProcessingJobType,
pub status: JobStatus,
pub priority: i32,
pub input_data: Option<serde_json::Value>,
pub result_data: Option<serde_json::Value>,
pub error_message: Option<String>,
pub started_at: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
pub retry_count: i32,
pub max_retries: i32,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProcessingJobSummary {
pub id: ProcessingJobId,
pub status: JobStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProcessingJobRef {
pub id: ProcessingJobId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct StoredFileId(pub Uuid);
impl StoredFileId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for StoredFileId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<StoredFileId> for Uuid {
fn from(id: StoredFileId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StoredFileDto {
pub id: StoredFileId,
pub bucket_id: Uuid,
pub owner_id: Uuid,
pub path: String,
pub original_name: String,
pub size_bytes: i64,
pub mime_type: String,
pub checksum: Option<String>,
pub is_compressed: bool,
pub original_size: Option<i64>,
pub compression_algorithm: Option<String>,
pub is_scanned: bool,
pub scan_result: Option<serde_json::Value>,
pub threat_level: Option<ThreatLevel>,
pub has_thumbnail: bool,
pub thumbnail_path: Option<String>,
pub has_video_thumbnail: bool,
pub has_document_preview: bool,
pub processing_status: Option<ProcessingStatus>,
pub content_hash_id: Option<Uuid>,
pub cdn_url: Option<String>,
pub cdn_url_expires_at: Option<DateTime<Utc>>,
pub owner_module: Option<String>,
pub owner_entity: Option<String>,
pub owner_entity_id: Option<Uuid>,
pub field_name: Option<String>,
pub sort_order: i32,
pub status: FileStatus,
pub storage_key: String,
pub version: i32,
pub previous_version_id: Option<Uuid>,
pub download_count: i32,
pub last_accessed_at: Option<DateTime<Utc>>,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StoredFileSummary {
pub id: StoredFileId,
pub original_name: String,
pub field_name: Option<String>,
pub status: FileStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StoredFileRef {
pub id: StoredFileId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ThumbnailId(pub Uuid);
impl ThumbnailId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for ThumbnailId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<ThumbnailId> for Uuid {
fn from(id: ThumbnailId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThumbnailDto {
pub id: ThumbnailId,
pub file_id: Uuid,
pub size: ThumbnailSize,
pub width: i32,
pub height: i32,
pub storage_key: String,
pub storage_backend: String,
pub mime_type: String,
pub format: String,
pub quality: i32,
pub size_bytes: i64,
pub generated_at: DateTime<Utc>,
pub generation_time_ms: Option<i32>,
pub source_version: i32,
pub cdn_url: Option<String>,
pub cache_expires_at: Option<DateTime<Utc>>,
pub is_stale: bool,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThumbnailSummary {
pub id: ThumbnailId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThumbnailRef {
pub id: ThumbnailId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct UploadSessionId(pub Uuid);
impl UploadSessionId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for UploadSessionId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<UploadSessionId> for Uuid {
fn from(id: UploadSessionId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadSessionDto {
pub id: UploadSessionId,
pub bucket_id: Uuid,
pub user_id: Uuid,
pub path: String,
pub filename: String,
pub mime_type: Option<String>,
pub file_size: i64,
pub chunk_size: i32,
pub total_chunks: i32,
pub uploaded_chunks: i32,
pub status: UploadStatus,
pub storage_backend: StorageBackend,
pub completed_parts: Vec<i32>,
pub part_etags: Option<serde_json::Value>,
pub expires_at: DateTime<Utc>,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadSessionSummary {
pub id: UploadSessionId,
pub status: UploadStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadSessionRef {
pub id: UploadSessionId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct UserQuotaId(pub Uuid);
impl UserQuotaId {
pub fn new(id: Uuid) -> Self {
Self(id)
}
pub fn into_inner(self) -> Uuid {
self.0
}
}
impl From<Uuid> for UserQuotaId {
fn from(id: Uuid) -> Self {
Self(id)
}
}
impl From<UserQuotaId> for Uuid {
fn from(id: UserQuotaId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserQuotaDto {
pub id: UserQuotaId,
pub user_id: Uuid,
pub limit_bytes: i64,
pub used_bytes: i64,
pub file_count: i32,
pub max_file_size: Option<i64>,
pub max_file_count: Option<i32>,
pub tier: String,
pub quota_status: QuotaStatus,
pub warning_threshold_percent: i32,
pub last_warning_sent_at: Option<DateTime<Utc>>,
pub peak_usage_bytes: i64,
pub peak_usage_at: Option<DateTime<Utc>>,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserQuotaSummary {
pub id: UserQuotaId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserQuotaRef {
pub id: UserQuotaId,
}