use async_trait::async_trait;
use anyhow::Result;
use serde::{Deserialize, Serialize};
use crate::domain::entity::FileShare;
use crate::infrastructure::persistence::{FileShareRepository, PaginationParams, PaginatedResult, FileShareFilter};
use super::QueryHandler;
#[deprecated(since = "0.2.0", note = "Use QueryHandler<Q> trait instead")]
#[async_trait]
pub trait FileShareQuery: Send + Sync {
type Output;
async fn execute(&self) -> Result<Self::Output>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetFileShareByIdQuery {
pub id: String,
}
pub struct GetFileShareByIdHandler<R: FileShareRepository> {
repository: std::sync::Arc<R>,
}
impl<R: FileShareRepository> GetFileShareByIdHandler<R> {
pub fn new(repository: std::sync::Arc<R>) -> Self {
Self { repository }
}
}
#[async_trait]
impl<R: FileShareRepository + 'static> QueryHandler<GetFileShareByIdQuery> for GetFileShareByIdHandler<R> {
type Output = Option<FileShare>;
async fn handle(&self, query: GetFileShareByIdQuery) -> Result<Self::Output> {
self.repository.find_by_id(&query.id).await
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListFileShareQuery {
pub page: u32,
pub per_page: u32,
pub filter_file_id: Option<Uuid>,
pub filter_owner_id: Option<Uuid>,
pub filter_token: Option<String>,
pub filter_share_type: Option<ShareType>,
pub filter_permission: Option<SharePermission>,
pub filter_password_hash: Option<String>,
pub filter_status: Option<ShareStatus>,
pub filter_revoked_by: Option<Uuid>,
pub filter_message: Option<String>,
}
impl Default for ListFileShareQuery {
fn default() -> Self {
Self {
page: 1,
per_page: 20,
filter_file_id: None,
filter_owner_id: None,
filter_token: None,
filter_share_type: None,
filter_permission: None,
filter_password_hash: None,
filter_status: None,
filter_revoked_by: None,
filter_message: None,
}
}
}
pub struct ListFileShareHandler<R: FileShareRepository> {
repository: std::sync::Arc<R>,
}
impl<R: FileShareRepository> ListFileShareHandler<R> {
pub fn new(repository: std::sync::Arc<R>) -> Self {
Self { repository }
}
}
#[async_trait]
impl<R: FileShareRepository + 'static> QueryHandler<ListFileShareQuery> for ListFileShareHandler<R> {
type Output = PaginatedResult<FileShare>;
async fn handle(&self, query: ListFileShareQuery) -> Result<Self::Output> {
let params = PaginationParams::new(query.page, query.per_page);
let filters = FileShareFilter {
file_id: query.filter_file_id.clone(),
owner_id: query.filter_owner_id.clone(),
token: query.filter_token.clone(),
share_type: query.filter_share_type.clone(),
permission: query.filter_permission.clone(),
password_hash: query.filter_password_hash.clone(),
status: query.filter_status.clone(),
revoked_by: query.filter_revoked_by.clone(),
message: query.filter_message.clone(),
..Default::default()
};
if filters.has_filters() {
self.repository.list_with_filters(params, filters).await
} else {
self.repository.list(params).await
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetFileShareByTokenQuery {
pub token: String,
}
pub struct GetFileShareByTokenHandler<R: FileShareRepository> {
repository: std::sync::Arc<R>,
}
impl<R: FileShareRepository> GetFileShareByTokenHandler<R> {
pub fn new(repository: std::sync::Arc<R>) -> Self {
Self { repository }
}
}
#[async_trait]
impl<R: FileShareRepository + 'static> QueryHandler<GetFileShareByTokenQuery> for GetFileShareByTokenHandler<R> {
type Output = Option<FileShare>;
async fn handle(&self, query: GetFileShareByTokenQuery) -> Result<Self::Output> {
self.repository.find_by_token(&query.token).await
}
}