use async_trait::async_trait;
use anyhow::Result;
use serde::{Deserialize, Serialize};
use crate::domain::entity::{FileVersion, FileVersionStatus};
use crate::infrastructure::persistence::{FileVersionRepository, PaginationParams, PaginatedResult, FileVersionFilter};
use super::QueryHandler;
#[deprecated(since = "0.2.0", note = "Use QueryHandler<Q> trait instead")]
#[async_trait]
pub trait FileVersionQuery: Send + Sync {
type Output;
async fn execute(&self) -> Result<Self::Output>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetFileVersionByIdQuery {
pub id: String,
}
pub struct GetFileVersionByIdHandler<R: FileVersionRepository> {
repository: std::sync::Arc<R>,
}
impl<R: FileVersionRepository> GetFileVersionByIdHandler<R> {
pub fn new(repository: std::sync::Arc<R>) -> Self {
Self { repository }
}
}
#[async_trait]
impl<R: FileVersionRepository + 'static> QueryHandler<GetFileVersionByIdQuery> for GetFileVersionByIdHandler<R> {
type Output = Option<FileVersion>;
async fn handle(&self, query: GetFileVersionByIdQuery) -> Result<Self::Output> {
self.repository.find_by_id(&query.id).await
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListFileVersionQuery {
pub page: u32,
pub per_page: u32,
pub filter_file_id: Option<Uuid>,
pub filter_version_number: Option<i32>,
pub filter_version_type: Option<VersionType>,
pub filter_storage_key: Option<String>,
pub filter_storage_backend: Option<String>,
pub filter_name: Option<String>,
pub filter_mime_type: Option<String>,
pub filter_checksum_md5: Option<String>,
pub filter_checksum_sha256: Option<String>,
pub filter_created_by_id: Option<Uuid>,
pub filter_change_summary: Option<String>,
pub filter_is_current: Option<bool>,
pub filter_restored_from_id: Option<Uuid>,
pub filter_status: Option<FileVersionStatus>,
pub filter_size_bytes: Option<i64>,
}
impl Default for ListFileVersionQuery {
fn default() -> Self {
Self {
page: 1,
per_page: 20,
filter_file_id: None,
filter_version_number: None,
filter_version_type: None,
filter_storage_key: None,
filter_storage_backend: None,
filter_name: None,
filter_mime_type: None,
filter_checksum_md5: None,
filter_checksum_sha256: None,
filter_created_by_id: None,
filter_change_summary: None,
filter_is_current: None,
filter_restored_from_id: None,
filter_status: None,
filter_size_bytes: None,
}
}
}
pub struct ListFileVersionHandler<R: FileVersionRepository> {
repository: std::sync::Arc<R>,
}
impl<R: FileVersionRepository> ListFileVersionHandler<R> {
pub fn new(repository: std::sync::Arc<R>) -> Self {
Self { repository }
}
}
#[async_trait]
impl<R: FileVersionRepository + 'static> QueryHandler<ListFileVersionQuery> for ListFileVersionHandler<R> {
type Output = PaginatedResult<FileVersion>;
async fn handle(&self, query: ListFileVersionQuery) -> Result<Self::Output> {
let params = PaginationParams::new(query.page, query.per_page);
let filters = FileVersionFilter {
file_id: query.filter_file_id.clone(),
version_number: query.filter_version_number.clone(),
version_type: query.filter_version_type.clone(),
storage_key: query.filter_storage_key.clone(),
storage_backend: query.filter_storage_backend.clone(),
name: query.filter_name.clone(),
mime_type: query.filter_mime_type.clone(),
checksum_md5: query.filter_checksum_md5.clone(),
checksum_sha256: query.filter_checksum_sha256.clone(),
created_by_id: query.filter_created_by_id.clone(),
change_summary: query.filter_change_summary.clone(),
is_current: query.filter_is_current.clone(),
restored_from_id: query.filter_restored_from_id.clone(),
status: query.filter_status.clone(),
size_bytes: query.filter_size_bytes.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 GetFileVersionByStorageKeyQuery {
pub storage_key: String,
}
pub struct GetFileVersionByStorageKeyHandler<R: FileVersionRepository> {
repository: std::sync::Arc<R>,
}
impl<R: FileVersionRepository> GetFileVersionByStorageKeyHandler<R> {
pub fn new(repository: std::sync::Arc<R>) -> Self {
Self { repository }
}
}
#[async_trait]
impl<R: FileVersionRepository + 'static> QueryHandler<GetFileVersionByStorageKeyQuery> for GetFileVersionByStorageKeyHandler<R> {
type Output = Option<FileVersion>;
async fn handle(&self, query: GetFileVersionByStorageKeyQuery) -> Result<Self::Output> {
self.repository.find_by_storage_key(&query.storage_key).await
}
}