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;
#[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,
}
#[derive(Debug, Clone)]
pub struct CreateThumbnailOutput {
pub thumbnail: Thumbnail,
}
pub struct CreateThumbnailUseCase {
repository: Arc<ThumbnailRepository>,
}
impl CreateThumbnailUseCase {
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> {
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,
};
let created = self.repository.create(entity).await?;
Ok(CreateThumbnailOutput { thumbnail: created })
}
}