use std::sync::Arc;
use anyhow::Result;
use async_trait::async_trait;
use super::UseCase;
use crate::domain::entity::UploadSession;
use crate::infrastructure::persistence::UploadSessionRepository;
use backbone_orm::repository::PaginationParams;
#[derive(Debug, Clone, Default)]
pub struct ListUploadSessionInput {
pub page: Option<u32>,
pub per_page: Option<u32>,
}
#[derive(Debug, Clone)]
pub struct ListUploadSessionOutput {
pub upload_sessions: Vec<UploadSession>,
pub total: u64,
pub page: u32,
pub per_page: u32,
pub total_pages: u32,
}
pub struct ListUploadSessionUseCase {
repository: Arc<UploadSessionRepository>,
}
impl ListUploadSessionUseCase {
pub fn new(repository: Arc<UploadSessionRepository>) -> Self {
Self { repository }
}
}
#[async_trait]
impl UseCase for ListUploadSessionUseCase {
type Input = ListUploadSessionInput;
type Output = ListUploadSessionOutput;
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(ListUploadSessionOutput {
upload_sessions: result.items,
total: result.total,
page,
per_page,
total_pages,
})
}
}