backbone-bucket 0.2.1

Bucket Bounded Context: File Storage Module for Backbone Framework
Documentation
//! Create Thumbnail 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::Thumbnail;
use crate::infrastructure::persistence::ThumbnailRepository;

/// Input for creating a Thumbnail
#[derive(Debug, Clone)]
pub struct CreateThumbnailInput {
    pub deleted_at: Option<DateTime<Utc>>,
    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: i32,
    pub source_version: i32,
    pub cdn_url: String,
    pub cache_expires_at: DateTime<Utc>,
    pub is_stale: bool,
}

/// Output after creating a Thumbnail
#[derive(Debug, Clone)]
pub struct CreateThumbnailOutput {
    pub thumbnail: Thumbnail,
}

/// Use case for creating a new Thumbnail
pub struct CreateThumbnailUseCase {
    repository: Arc<ThumbnailRepository>,
}

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

#[async_trait]
impl UseCase for CreateThumbnailUseCase {
    type Input = CreateThumbnailInput;
    type Output = CreateThumbnailOutput;

    async fn execute(&self, input: Self::Input) -> Result<Self::Output> {
        // Create entity from input
        let entity = Thumbnail {
            created_at: Some(chrono::Utc::now()),
            updated_at: Some(chrono::Utc::now()),
            deleted_at: input.deleted_at,
            id: None,
            file_id: input.file_id,
            size: input.size,
            width: input.width,
            height: input.height,
            storage_key: input.storage_key,
            storage_backend: input.storage_backend,
            mime_type: input.mime_type,
            format: input.format,
            quality: input.quality,
            size_bytes: input.size_bytes,
            generated_at: input.generated_at,
            generation_time_ms: input.generation_time_ms,
            source_version: input.source_version,
            cdn_url: input.cdn_url,
            cache_expires_at: input.cache_expires_at,
            is_stale: input.is_stale,
        };

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

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

        Ok(CreateThumbnailOutput { thumbnail: created })
    }
}