backbone-bucket 0.4.5

Bucket Bounded Context: File Storage Module for Backbone Framework
Documentation
//! Queries for Thumbnail aggregate
//!
//! Generated by backbone-schema. Do not edit manually.
//!
//! CQRS Queries represent requests for data without side effects.

use async_trait::async_trait;
use anyhow::Result;
use serde::{Deserialize, Serialize};

use crate::domain::entity::Thumbnail;
use crate::infrastructure::persistence::{ThumbnailRepository, PaginationParams, PaginatedResult, ThumbnailFilter};
use super::QueryHandler;

// ============================================================================
// QUERY TRAIT (DEPRECATED)
// ============================================================================

/// Query trait for Thumbnail operations
///
/// **DEPRECATED**: Use the generic `QueryHandler<Q>` trait from `mod.rs` instead.
/// This trait is kept for backwards compatibility.
#[deprecated(since = "0.2.0", note = "Use QueryHandler<Q> trait instead")]
#[async_trait]
pub trait ThumbnailQuery: Send + Sync {
    type Output;
    async fn execute(&self) -> Result<Self::Output>;
}

// ============================================================================
// GET BY ID QUERY
// ============================================================================

/// Query to get a thumbnail by ID
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetThumbnailByIdQuery {
    pub id: String,
}

/// Handler for GetThumbnailByIdQuery
pub struct GetThumbnailByIdHandler<R: ThumbnailRepository> {
    repository: std::sync::Arc<R>,
}

impl<R: ThumbnailRepository> GetThumbnailByIdHandler<R> {
    pub fn new(repository: std::sync::Arc<R>) -> Self {
        Self { repository }
    }
}

#[async_trait]
impl<R: ThumbnailRepository + 'static> QueryHandler<GetThumbnailByIdQuery> for GetThumbnailByIdHandler<R> {
    type Output = Option<Thumbnail>;

    async fn handle(&self, query: GetThumbnailByIdQuery) -> Result<Self::Output> {
        self.repository.find_by_id(&query.id).await
    }
}

// ============================================================================
// LIST QUERY
// ============================================================================

/// Query to list thumbnail entities with pagination
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListThumbnailQuery {
    pub page: u32,
    pub per_page: u32,
    pub filter_file_id: Option<Uuid>,
    pub filter_size: Option<ThumbnailSize>,
    pub filter_width: Option<i32>,
    pub filter_height: Option<i32>,
    pub filter_storage_key: Option<String>,
    pub filter_storage_backend: Option<String>,
    pub filter_mime_type: Option<String>,
    pub filter_format: Option<String>,
    pub filter_quality: Option<i32>,
    pub filter_size_bytes: Option<i64>,
    pub filter_generation_time_ms: Option<i32>,
    pub filter_source_version: Option<i32>,
    pub filter_cdn_url: Option<String>,
    pub filter_is_stale: Option<bool>,
}

impl Default for ListThumbnailQuery {
    fn default() -> Self {
        Self {
            page: 1,
            per_page: 20,
            filter_file_id: None,
            filter_size: None,
            filter_width: None,
            filter_height: None,
            filter_storage_key: None,
            filter_storage_backend: None,
            filter_mime_type: None,
            filter_format: None,
            filter_quality: None,
            filter_size_bytes: None,
            filter_generation_time_ms: None,
            filter_source_version: None,
            filter_cdn_url: None,
            filter_is_stale: None,
        }
    }
}

/// Handler for ListThumbnailQuery
pub struct ListThumbnailHandler<R: ThumbnailRepository> {
    repository: std::sync::Arc<R>,
}

impl<R: ThumbnailRepository> ListThumbnailHandler<R> {
    pub fn new(repository: std::sync::Arc<R>) -> Self {
        Self { repository }
    }
}

#[async_trait]
impl<R: ThumbnailRepository + 'static> QueryHandler<ListThumbnailQuery> for ListThumbnailHandler<R> {
    type Output = PaginatedResult<Thumbnail>;

    async fn handle(&self, query: ListThumbnailQuery) -> Result<Self::Output> {
        let params = PaginationParams::new(query.page, query.per_page);

        // Build filter from query parameters
        let filters = ThumbnailFilter {
            file_id: query.filter_file_id.clone(),
            size: query.filter_size.clone(),
            width: query.filter_width.clone(),
            height: query.filter_height.clone(),
            storage_key: query.filter_storage_key.clone(),
            storage_backend: query.filter_storage_backend.clone(),
            mime_type: query.filter_mime_type.clone(),
            format: query.filter_format.clone(),
            quality: query.filter_quality.clone(),
            size_bytes: query.filter_size_bytes.clone(),
            generation_time_ms: query.filter_generation_time_ms.clone(),
            source_version: query.filter_source_version.clone(),
            cdn_url: query.filter_cdn_url.clone(),
            is_stale: query.filter_is_stale.clone(),
            ..Default::default()
        };

        // Use list_with_filters if any filters are set
        if filters.has_filters() {
            self.repository.list_with_filters(params, filters).await
        } else {
            self.repository.list(params).await
        }
    }
}

// ============================================================================
// FIND BY UNIQUE FIELDS
// ============================================================================

/// Query to find thumbnail by storage_key
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetThumbnailByStorageKeyQuery {
    pub storage_key: String,
}

/// Handler for GetThumbnailByStorageKeyQuery
pub struct GetThumbnailByStorageKeyHandler<R: ThumbnailRepository> {
    repository: std::sync::Arc<R>,
}

impl<R: ThumbnailRepository> GetThumbnailByStorageKeyHandler<R> {
    pub fn new(repository: std::sync::Arc<R>) -> Self {
        Self { repository }
    }
}

#[async_trait]
impl<R: ThumbnailRepository + 'static> QueryHandler<GetThumbnailByStorageKeyQuery> for GetThumbnailByStorageKeyHandler<R> {
    type Output = Option<Thumbnail>;

    async fn handle(&self, query: GetThumbnailByStorageKeyQuery) -> Result<Self::Output> {
        self.repository.find_by_storage_key(&query.storage_key).await
    }
}

// ============================================================================
// CUSTOM QUERIES
// ============================================================================
// <<< CUSTOM QUERIES START >>>

// <<< CUSTOM QUERIES START >>>
// Add your custom queries here
// Example:
//
// #[derive(Debug, Clone, Serialize, Deserialize)]
// pub struct GetActiveThumbnailQuery;
// <<< CUSTOM QUERIES END >>>