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;
#[derive(Debug, Clone)]
pub struct CreateFileAccessLogInput {
pub file_id: Uuid,
pub user_id: Option<Uuid>,
pub share_id: Option<Uuid>,
pub action: AccessAction,
pub ip_address: Option<String>,
pub user_agent: Option<String>,
pub accessed_at: DateTime<Utc>,
}
#[derive(Debug, Clone)]
pub struct CreateFileAccessLogOutput {
pub file_access_log: FileAccessLog,
}
pub struct CreateFileAccessLogUseCase {
repository: Arc<FileAccessLogRepository>,
}
impl CreateFileAccessLogUseCase {
pub fn new(repository: Arc<FileAccessLogRepository>) -> Self {
Self { repository }
}
}
#[async_trait]
impl UseCase for CreateFileAccessLogUseCase {
type Input = CreateFileAccessLogInput;
type Output = CreateFileAccessLogOutput;
async fn execute(&self, input: Self::Input) -> Result<Self::Output> {
let entity = FileAccessLog {
id: None,
file_id: input.file_id,
user_id: input.user_id,
share_id: input.share_id,
action: input.action,
ip_address: input.ip_address,
user_agent: input.user_agent,
accessed_at: input.accessed_at,
};
let created = self.repository.create(entity).await?;
Ok(CreateFileAccessLogOutput { file_access_log: created })
}
}