2026-02-08 13:40:23 +01:00
|
|
|
//! Puerto de persistencia del dominio para la entidad Folder.
|
|
|
|
|
//!
|
|
|
|
|
//! Define el contrato que cualquier implementación de almacenamiento de carpetas
|
|
|
|
|
//! debe cumplir. Este trait vive en el dominio porque Folder es una entidad core
|
|
|
|
|
//! del sistema y sus contratos de persistencia pertenecen a la capa de dominio,
|
|
|
|
|
//! siguiendo los principios de Clean/Hexagonal Architecture.
|
|
|
|
|
//!
|
|
|
|
|
//! Las implementaciones concretas (filesystem, PostgreSQL, S3, etc.) viven en
|
|
|
|
|
//! la capa de infraestructura.
|
|
|
|
|
|
2025-03-17 21:28:08 +01:00
|
|
|
use async_trait::async_trait;
|
2026-02-08 13:40:23 +01:00
|
|
|
|
2025-03-17 21:28:08 +01:00
|
|
|
use crate::domain::entities::folder::Folder;
|
2025-03-19 00:44:27 +01:00
|
|
|
use crate::domain::services::path_service::StoragePath;
|
2025-03-20 09:22:31 +01:00
|
|
|
use crate::common::errors::DomainError;
|
2025-03-17 21:28:08 +01:00
|
|
|
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Puerto del dominio para persistencia de carpetas.
|
|
|
|
|
///
|
|
|
|
|
/// Define las operaciones CRUD y de gestión necesarias para
|
|
|
|
|
/// la entidad Folder en el sistema de almacenamiento.
|
2025-03-17 21:28:08 +01:00
|
|
|
#[async_trait]
|
|
|
|
|
pub trait FolderRepository: Send + Sync + 'static {
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Crea una nueva carpeta
|
|
|
|
|
async fn create_folder(&self, name: String, parent_id: Option<String>) -> Result<Folder, DomainError>;
|
2025-03-17 21:28:08 +01:00
|
|
|
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Obtiene una carpeta por su ID
|
|
|
|
|
async fn get_folder(&self, id: &str) -> Result<Folder, DomainError>;
|
2025-03-17 21:28:08 +01:00
|
|
|
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Obtiene una carpeta por su ruta de almacenamiento
|
|
|
|
|
async fn get_folder_by_path(&self, storage_path: &StoragePath) -> Result<Folder, DomainError>;
|
2025-03-17 21:28:08 +01:00
|
|
|
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Lista carpetas dentro de una carpeta padre
|
|
|
|
|
async fn list_folders(&self, parent_id: Option<&str>) -> Result<Vec<Folder>, DomainError>;
|
2025-03-17 21:28:08 +01:00
|
|
|
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Lista carpetas con paginación
|
2025-03-19 00:44:27 +01:00
|
|
|
async fn list_folders_paginated(
|
|
|
|
|
&self,
|
2026-02-08 13:40:23 +01:00
|
|
|
parent_id: Option<&str>,
|
|
|
|
|
offset: usize,
|
2025-03-19 00:44:27 +01:00
|
|
|
limit: usize,
|
|
|
|
|
include_total: bool
|
2026-02-08 13:40:23 +01:00
|
|
|
) -> Result<(Vec<Folder>, Option<usize>), DomainError>;
|
2025-03-19 00:44:27 +01:00
|
|
|
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Renombra una carpeta
|
|
|
|
|
async fn rename_folder(&self, id: &str, new_name: String) -> Result<Folder, DomainError>;
|
2025-03-19 00:44:27 +01:00
|
|
|
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Mueve una carpeta a otro padre
|
|
|
|
|
async fn move_folder(&self, id: &str, new_parent_id: Option<&str>) -> Result<Folder, DomainError>;
|
2025-03-24 16:47:42 +01:00
|
|
|
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Elimina una carpeta
|
|
|
|
|
async fn delete_folder(&self, id: &str) -> Result<(), DomainError>;
|
2025-03-24 16:47:42 +01:00
|
|
|
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Verifica si existe una carpeta en la ruta dada
|
|
|
|
|
async fn folder_exists(&self, storage_path: &StoragePath) -> Result<bool, DomainError>;
|
2025-03-24 16:47:42 +01:00
|
|
|
|
2026-02-08 13:40:23 +01:00
|
|
|
/// Obtiene la ruta de una carpeta
|
|
|
|
|
async fn get_folder_path(&self, id: &str) -> Result<StoragePath, DomainError>;
|
|
|
|
|
|
|
|
|
|
// ── Trash operations ──
|
|
|
|
|
|
|
|
|
|
/// Mueve una carpeta a la papelera
|
|
|
|
|
async fn move_to_trash(&self, folder_id: &str) -> Result<(), DomainError>;
|
|
|
|
|
|
|
|
|
|
/// Restaura una carpeta desde la papelera a su ubicación original
|
|
|
|
|
async fn restore_from_trash(&self, folder_id: &str, original_path: &str) -> Result<(), DomainError>;
|
|
|
|
|
|
|
|
|
|
/// Elimina una carpeta permanentemente (usado por la papelera)
|
|
|
|
|
async fn delete_folder_permanently(&self, folder_id: &str) -> Result<(), DomainError>;
|
|
|
|
|
}
|