7737ed90c7
Backend: - Add owner_id to Folder entity + FolderDto (DB user_id column) - Add list_folders_by_owner to FolderRepository trait + PG impl - Add list_folders_for_owner to FolderUseCase + FolderService - Rewrite FolderHandler: all endpoints now scope by AuthUser - Remove dead handler methods (list_folders_inner, list_folders_for_user, is_user_home_folder, folder_belongs_to_user) - Add ownership check in get_folder (returns 404 on mismatch) Batch operations: - Add trash_service + zip_service to BatchOperationService - New methods: trash_files, trash_folders, move_folders, download_zip - New handlers: trash_batch, move_folders_batch, download_batch - New routes: POST /api/batch/trash, /api/batch/folders/move, /api/batch/download Frontend: - Replace findUserHomeFolder (~130 lines) with resolveHomeFolder (~35 lines) - Remove client-side folder filtering in loadFiles (backend now scopes) - Rewrite batchDelete: N requests -> 1 POST /api/batch/trash - Rewrite batchMove: N requests -> 2 POST max (files + folders) - Rewrite batchDownload: N requests -> 1 POST /api/batch/download (ZIP) - Search moved to backend, share system uses backend API - Dark mode fixes, frontend audit improvements
74 lines
2.6 KiB
Rust
74 lines
2.6 KiB
Rust
use async_trait::async_trait;
|
|
|
|
use crate::application::dtos::folder_dto::{
|
|
CreateFolderDto, FolderDto, MoveFolderDto, RenameFolderDto,
|
|
};
|
|
use crate::application::dtos::search_dto::{
|
|
SearchCriteriaDto, SearchResultsDto, SearchSuggestionsDto,
|
|
};
|
|
use crate::common::errors::DomainError;
|
|
|
|
/// Primary port for folder operations
|
|
#[async_trait]
|
|
pub trait FolderUseCase: Send + Sync + 'static {
|
|
/// Creates a new folder
|
|
async fn create_folder(&self, dto: CreateFolderDto) -> Result<FolderDto, DomainError>;
|
|
|
|
/// Gets a folder by its ID
|
|
async fn get_folder(&self, id: &str) -> Result<FolderDto, DomainError>;
|
|
|
|
/// Gets a folder by its path
|
|
async fn get_folder_by_path(&self, path: &str) -> Result<FolderDto, DomainError>;
|
|
|
|
/// Lists folders within a parent folder
|
|
async fn list_folders(&self, parent_id: Option<&str>) -> Result<Vec<FolderDto>, DomainError>;
|
|
|
|
/// Lists folders scoped to a specific owner (for user-facing endpoints).
|
|
/// At root level, only returns folders belonging to this user.
|
|
async fn list_folders_for_owner(
|
|
&self,
|
|
parent_id: Option<&str>,
|
|
owner_id: &str,
|
|
) -> Result<Vec<FolderDto>, DomainError>;
|
|
|
|
/// Lists folders with pagination
|
|
async fn list_folders_paginated(
|
|
&self,
|
|
parent_id: Option<&str>,
|
|
pagination: &crate::application::dtos::pagination::PaginationRequestDto,
|
|
) -> Result<crate::application::dtos::pagination::PaginatedResponseDto<FolderDto>, DomainError>;
|
|
|
|
/// Renames a folder
|
|
async fn rename_folder(&self, id: &str, dto: RenameFolderDto)
|
|
-> Result<FolderDto, DomainError>;
|
|
|
|
/// Moves a folder to another parent
|
|
async fn move_folder(&self, id: &str, dto: MoveFolderDto) -> Result<FolderDto, DomainError>;
|
|
|
|
/// Deletes a folder
|
|
async fn delete_folder(&self, id: &str) -> Result<(), DomainError>;
|
|
}
|
|
|
|
/**
|
|
* Primary port for file and folder search.
|
|
*
|
|
* All search processing (filtering, scoring, sorting, categorization)
|
|
* is handled server-side in Rust for maximum efficiency.
|
|
*/
|
|
#[async_trait]
|
|
pub trait SearchUseCase: Send + Sync + 'static {
|
|
/// Performs a full search based on the specified criteria.
|
|
async fn search(&self, criteria: SearchCriteriaDto) -> Result<SearchResultsDto, DomainError>;
|
|
|
|
/// Returns quick suggestions for autocomplete (lightweight, fast).
|
|
async fn suggest(
|
|
&self,
|
|
query: &str,
|
|
folder_id: Option<&str>,
|
|
limit: usize,
|
|
) -> Result<SearchSuggestionsDto, DomainError>;
|
|
|
|
/// Clears the search results cache.
|
|
async fn clear_search_cache(&self) -> Result<(), DomainError>;
|
|
}
|