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;
use backbone_orm::repository::PaginationParams;
#[derive(Debug, Clone, Default)]
pub struct ListThumbnailInput {
pub page: Option<u32>,
pub per_page: Option<u32>,
}
#[derive(Debug, Clone)]
pub struct ListThumbnailOutput {
pub thumbnails: Vec<Thumbnail>,
pub total: u64,
pub page: u32,
pub per_page: u32,
pub total_pages: u32,
}
pub struct ListThumbnailUseCase {
repository: Arc<ThumbnailRepository>,
}
impl ListThumbnailUseCase {
pub fn new(repository: Arc<ThumbnailRepository>) -> Self {
Self { repository }
}
}
#[async_trait]
impl UseCase for ListThumbnailUseCase {
type Input = ListThumbnailInput;
type Output = ListThumbnailOutput;
async fn execute(&self, input: Self::Input) -> Result<Self::Output> {
let page = input.page.unwrap_or(1);
let per_page = input.per_page.unwrap_or(20);
let pagination = PaginationParams::new(page, per_page);
let result = self.repository.find_all(pagination).await?;
let total_pages = ((result.total as f64) / (per_page as f64)).ceil() as u32;
Ok(ListThumbnailOutput {
thumbnails: result.items,
total: result.total,
page,
per_page,
total_pages,
})
}
}