use std::sync::Arc; use async_trait::async_trait; use bytes::Bytes; use futures::Stream; use crate::application::dtos::file_dto::FileDto; use crate::application::dtos::folder_dto::{CreateFolderDto, FolderDto, MoveFolderDto, RenameFolderDto}; use crate::application::dtos::search_dto::{SearchCriteriaDto, SearchResultsDto}; use crate::common::errors::DomainError; /// Puerto primario para operaciones de archivos #[async_trait] pub trait FileUseCase: Send + Sync + 'static { /// Sube un nuevo archivo desde bytes async fn upload_file( &self, name: String, folder_id: Option, content_type: String, content: Vec, ) -> Result; /// Obtiene un archivo por su ID async fn get_file(&self, id: &str) -> Result; /// Lista archivos en una carpeta async fn list_files(&self, folder_id: Option<&str>) -> Result, DomainError>; /// Elimina un archivo async fn delete_file(&self, id: &str) -> Result<(), DomainError>; /// Obtiene contenido de archivo como bytes (para archivos pequeños) async fn get_file_content(&self, id: &str) -> Result, DomainError>; /// Obtiene contenido de archivo como stream (para archivos grandes) async fn get_file_stream(&self, id: &str) -> Result> + Send>, DomainError>; /// Mueve un archivo a otra carpeta async fn move_file(&self, file_id: &str, folder_id: Option) -> Result; } /// Puerto primario para operaciones de carpetas #[async_trait] pub trait FolderUseCase: Send + Sync + 'static { /// Crea una nueva carpeta async fn create_folder(&self, dto: CreateFolderDto) -> Result; /// Obtiene una carpeta por su ID async fn get_folder(&self, id: &str) -> Result; /// Obtiene una carpeta por su ruta async fn get_folder_by_path(&self, path: &str) -> Result; /// Lista carpetas dentro de una carpeta padre async fn list_folders(&self, parent_id: Option<&str>) -> Result, DomainError>; /// Lista carpetas con paginación async fn list_folders_paginated( &self, parent_id: Option<&str>, pagination: &crate::application::dtos::pagination::PaginationRequestDto ) -> Result, DomainError>; /// Renombra una carpeta async fn rename_folder(&self, id: &str, dto: RenameFolderDto) -> Result; /// Mueve una carpeta a otro padre async fn move_folder(&self, id: &str, dto: MoveFolderDto) -> Result; /// Elimina una carpeta async fn delete_folder(&self, id: &str) -> Result<(), DomainError>; } /** * Puerto primario para búsqueda de archivos y carpetas * * Define las operaciones relacionadas con la búsqueda avanzada de * archivos y carpetas basándose en diversos criterios. */ #[async_trait] pub trait SearchUseCase: Send + Sync + 'static { /** * Realiza una búsqueda basada en los criterios especificados * * @param criteria Criterios de búsqueda que incluyen texto, fechas, tamaños, etc. * @return Resultados de la búsqueda que contienen archivos y carpetas coincidentes */ async fn search(&self, criteria: SearchCriteriaDto) -> Result; /** * Limpia la caché de resultados de búsqueda * * @return Resultado indicando éxito o error */ async fn clear_search_cache(&self) -> Result<(), DomainError>; } /// Factory para crear implementaciones de casos de uso pub trait UseCaseFactory { fn create_file_use_case(&self) -> Arc; fn create_folder_use_case(&self) -> Arc; fn create_search_use_case(&self) -> Arc; }