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