backbone-bucket 0.2.0

Bucket Bounded Context: File Storage Module for Backbone Framework
Documentation
//! Create StoredFile use case
//!
//! Generated by backbone-schema. Do not edit manually.

use std::sync::Arc;

use anyhow::Result;
use async_trait::async_trait;

use super::UseCase;
use crate::domain::entity::StoredFile;
use crate::infrastructure::persistence::StoredFileRepository;

/// Input for creating a StoredFile
#[derive(Debug, Clone)]
pub struct CreateStoredFileInput {
    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 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,
}

/// Output after creating a StoredFile
#[derive(Debug, Clone)]
pub struct CreateStoredFileOutput {
    pub stored_file: StoredFile,
}

/// Use case for creating a new StoredFile
pub struct CreateStoredFileUseCase {
    repository: Arc<StoredFileRepository>,
}

impl CreateStoredFileUseCase {
    /// Create a new use case instance
    pub fn new(repository: Arc<StoredFileRepository>) -> Self {
        Self { repository }
    }
}

#[async_trait]
impl UseCase for CreateStoredFileUseCase {
    type Input = CreateStoredFileInput;
    type Output = CreateStoredFileOutput;

    async fn execute(&self, input: Self::Input) -> Result<Self::Output> {
        // Create entity from input
        let entity = StoredFile {
            id: None,
            bucket_id: input.bucket_id,
            owner_id: input.owner_id,
            path: input.path,
            original_name: input.original_name,
            size_bytes: input.size_bytes,
            mime_type: input.mime_type,
            checksum: input.checksum,
            is_compressed: input.is_compressed,
            original_size: input.original_size,
            compression_algorithm: input.compression_algorithm,
            is_scanned: input.is_scanned,
            scan_result: input.scan_result,
            threat_level: input.threat_level,
            has_thumbnail: input.has_thumbnail,
            thumbnail_path: input.thumbnail_path,
            has_video_thumbnail: input.has_video_thumbnail,
            has_document_preview: input.has_document_preview,
            processing_status: input.processing_status,
            content_hash_id: input.content_hash_id,
            cdn_url: input.cdn_url,
            cdn_url_expires_at: input.cdn_url_expires_at,
            status: input.status,
            storage_key: input.storage_key,
            version: input.version,
            previous_version_id: input.previous_version_id,
            download_count: input.download_count,
            last_accessed_at: input.last_accessed_at,
            metadata: input.metadata,
        };

        // <<< CUSTOM VALIDATION START >>>
        // Add custom validation logic here
        // <<< CUSTOM VALIDATION END >>>

        // Persist entity
        let created = self.repository.create(entity).await?;

        Ok(CreateStoredFileOutput { stored_file: created })
    }
}