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