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;
#[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,
}
#[derive(Debug, Clone)]
pub struct CreateStoredFileOutput {
pub stored_file: StoredFile,
}
pub struct CreateStoredFileUseCase {
repository: Arc<StoredFileRepository>,
}
impl CreateStoredFileUseCase {
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> {
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,
};
let created = self.repository.create(entity).await?;
Ok(CreateStoredFileOutput { stored_file: created })
}
}