use async_trait::async_trait;
use anyhow::Result;
use uuid::Uuid;
use crate::domain::entity::{Thumbnail, ThumbnailSize};
#[derive(Debug, Clone, Default)]
pub struct ThumbnailPaginationParams {
pub page: u32,
pub per_page: u32,
}
impl ThumbnailPaginationParams {
pub fn new(page: u32, per_page: u32) -> Self {
Self { page, per_page }
}
pub fn offset(&self) -> u64 {
((self.page.saturating_sub(1)) * self.per_page) as u64
}
pub fn limit(&self) -> u64 {
self.per_page as u64
}
}
#[derive(Debug, Clone)]
pub struct ThumbnailPaginatedResult {
pub data: Vec<Thumbnail>,
pub total: u64,
pub page: u32,
pub per_page: u32,
}
#[derive(Debug, Clone, Default)]
pub struct ThumbnailFilter {
pub file_id: Option<Uuid>,
pub size: Option<ThumbnailSize>,
pub width: Option<i32>,
pub height: Option<i32>,
pub storage_key: Option<String>,
pub storage_backend: Option<String>,
pub mime_type: Option<String>,
pub format: Option<String>,
pub quality: Option<i32>,
pub size_bytes: Option<i64>,
pub generation_time_ms: Option<i32>,
pub source_version: Option<i32>,
pub cdn_url: Option<String>,
pub is_stale: Option<bool>,
}
impl ThumbnailFilter {
pub fn has_filters(&self) -> bool {
self.file_id.is_some() || self.size.is_some() || self.width.is_some() || self.height.is_some() || self.storage_key.is_some() || self.storage_backend.is_some() || self.mime_type.is_some() || self.format.is_some() || self.quality.is_some() || self.size_bytes.is_some() || self.generation_time_ms.is_some() || self.source_version.is_some() || self.cdn_url.is_some() || self.is_stale.is_some()
}
}
#[async_trait]
pub trait ThumbnailRepository: Send + Sync {
async fn save(&self, entity: &Thumbnail) -> Result<Thumbnail>;
async fn find_by_id(&self, id: &str) -> Result<Option<Thumbnail>>;
async fn find_all(&self) -> Result<Vec<Thumbnail>>;
async fn update(&self, id: &str, entity: &Thumbnail) -> Result<Option<Thumbnail>>;
async fn delete(&self, id: &str) -> Result<bool>;
async fn list(&self, params: ThumbnailPaginationParams) -> Result<ThumbnailPaginatedResult>;
async fn list_with_filters(&self, params: ThumbnailPaginationParams, filters: ThumbnailFilter) -> Result<ThumbnailPaginatedResult>;
async fn count(&self) -> Result<u64>;
async fn count_with_filters(&self, filters: ThumbnailFilter) -> Result<u64>;
async fn exists(&self, id: &str) -> Result<bool>;
async fn soft_delete(&self, id: &str) -> Result<bool>;
async fn restore(&self, id: &str) -> Result<Option<Thumbnail>>;
async fn list_deleted(&self, params: ThumbnailPaginationParams) -> Result<ThumbnailPaginatedResult>;
async fn empty_trash(&self) -> Result<u64>;
async fn find_by_storage_key(&self, storage_key: &str) -> Result<Option<Thumbnail>>;
async fn exists_by_storage_key(&self, storage_key: &str) -> Result<bool>;
async fn bulk_save(&self, entities: &[Thumbnail]) -> Result<Vec<Thumbnail>>;
async fn bulk_delete(&self, ids: &[&str]) -> Result<u64>;
}