Backend: - user roles (DB + JWT + first-user-is-admin) - volume-aware file resolver (multi-volume asset serving) - directory scanner uses volume URI directly - date-summary endpoint (capture date from EXIF) - timeline ordered by capture date - list endpoints: volumes, plugins, pipelines, library paths - delete endpoints: volumes, library paths - configurable upload body limit (MAX_UPLOAD_BYTES) Frontend: - auth: login/register, token refresh, role-based admin gate - timeline: date-grouped grid, infinite scroll, date scrubber - image viewer: fullscreen zoom/pan/pinch, metadata sidebar - upload: drag-drop, sequential upload, progress tracking - albums: create, add/remove photos, asset picker dialog - admin: storage (import library), jobs (pagination, error details), plugins (list + toggle), pipelines, sidecars, duplicates - multi-select mode with add-to-album action - TanStack Query for all data fetching
136 lines
5.0 KiB
Rust
136 lines
5.0 KiB
Rust
use std::sync::Arc;
|
|
|
|
use application::{
|
|
catalog::{
|
|
CreateStackHandler, DeleteAssetHandler, DeleteStackHandler, DetectLivePhotosHandler,
|
|
GetAssetHandler, GetDateSummaryHandler, GetStackHandler, GetTimelineHandler,
|
|
ListDuplicatesHandler, ListStacksHandler, ReadAssetFileHandler, ReadDerivativeHandler,
|
|
RegisterAssetHandler, ResolveDuplicateHandler, SearchAssetsHandler,
|
|
UpdateMetadataHandler,
|
|
},
|
|
identity::{
|
|
GetProfileHandler, LoginUserHandler, LogoutHandler, RefreshTokenHandler,
|
|
RegisterUserHandler,
|
|
},
|
|
organization::{
|
|
CreateAlbumHandler, GetAlbumHandler, ListAlbumsHandler, ManageAlbumEntriesHandler,
|
|
TagAssetHandler, UpdateAlbumHandler,
|
|
},
|
|
processing::{
|
|
CompleteJobHandler, ConfigurePipelineHandler, EnqueueJobHandler, FailJobHandler,
|
|
ListJobsHandler, ListPipelinesHandler, ListPluginsHandler, ManagePluginHandler,
|
|
ReportBatchProgressHandler, StartJobHandler,
|
|
},
|
|
sharing::{
|
|
AccessSharedResourceHandler, GenerateShareLinkHandler, RevokeShareHandler,
|
|
ShareResourceHandler,
|
|
},
|
|
sidecar::{
|
|
DetectExternalChangesHandler, ExportSidecarHandler, FullExportHandler, FullImportHandler,
|
|
ImportSidecarHandler, ResolveConflictHandler,
|
|
},
|
|
storage::{
|
|
CheckQuotaHandler, DeleteLibraryPathHandler, DeleteVolumeHandler, IngestAssetHandler,
|
|
ListAllLibraryPathsHandler, ListIngestPathsHandler, ListVolumesHandler,
|
|
RegisterLibraryPathHandler, RegisterVolumeHandler,
|
|
},
|
|
};
|
|
use domain::ports::{RefreshTokenRepository, TokenIssuer};
|
|
|
|
#[derive(Clone)]
|
|
pub struct IdentityHandlers {
|
|
pub register: Arc<RegisterUserHandler>,
|
|
pub login: Arc<LoginUserHandler>,
|
|
pub get_profile: Arc<GetProfileHandler>,
|
|
pub refresh: Arc<RefreshTokenHandler>,
|
|
pub logout: Arc<LogoutHandler>,
|
|
pub refresh_token_repo: Arc<dyn RefreshTokenRepository>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct CatalogHandlers {
|
|
pub ingest_asset: Arc<IngestAssetHandler>,
|
|
pub get_asset: Arc<GetAssetHandler>,
|
|
pub get_timeline: Arc<GetTimelineHandler>,
|
|
pub get_date_summary: Arc<GetDateSummaryHandler>,
|
|
pub update_metadata: Arc<UpdateMetadataHandler>,
|
|
pub read_asset_file: Arc<ReadAssetFileHandler>,
|
|
pub read_derivative: Arc<ReadDerivativeHandler>,
|
|
pub register_asset: Arc<RegisterAssetHandler>,
|
|
pub delete_asset: Arc<DeleteAssetHandler>,
|
|
pub search_assets: Arc<SearchAssetsHandler>,
|
|
pub list_duplicates: Arc<ListDuplicatesHandler>,
|
|
pub resolve_duplicate: Arc<ResolveDuplicateHandler>,
|
|
pub create_stack: Arc<CreateStackHandler>,
|
|
pub get_stack: Arc<GetStackHandler>,
|
|
pub delete_stack: Arc<DeleteStackHandler>,
|
|
pub detect_live_photos: Arc<DetectLivePhotosHandler>,
|
|
pub list_stacks: Arc<ListStacksHandler>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct OrganizationHandlers {
|
|
pub create_album: Arc<CreateAlbumHandler>,
|
|
pub get_album: Arc<GetAlbumHandler>,
|
|
pub list_albums: Arc<ListAlbumsHandler>,
|
|
pub manage_album_entries: Arc<ManageAlbumEntriesHandler>,
|
|
pub update_album: Arc<UpdateAlbumHandler>,
|
|
pub tag_asset: Arc<TagAssetHandler>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct StorageHandlers {
|
|
pub register_volume: Arc<RegisterVolumeHandler>,
|
|
pub delete_volume: Arc<DeleteVolumeHandler>,
|
|
pub list_volumes: Arc<ListVolumesHandler>,
|
|
pub register_library_path: Arc<RegisterLibraryPathHandler>,
|
|
pub list_ingest_paths: Arc<ListIngestPathsHandler>,
|
|
pub list_all_library_paths: Arc<ListAllLibraryPathsHandler>,
|
|
pub delete_library_path: Arc<DeleteLibraryPathHandler>,
|
|
pub check_quota: Arc<CheckQuotaHandler>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct SharingHandlers {
|
|
pub share_resource: Arc<ShareResourceHandler>,
|
|
pub generate_link: Arc<GenerateShareLinkHandler>,
|
|
pub revoke: Arc<RevokeShareHandler>,
|
|
pub access: Arc<AccessSharedResourceHandler>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct SidecarHandlers {
|
|
pub export: Arc<ExportSidecarHandler>,
|
|
pub detect_changes: Arc<DetectExternalChangesHandler>,
|
|
pub import: Arc<ImportSidecarHandler>,
|
|
pub resolve: Arc<ResolveConflictHandler>,
|
|
pub full_export: Arc<FullExportHandler>,
|
|
pub full_import: Arc<FullImportHandler>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct ProcessingHandlers {
|
|
pub enqueue_job: Arc<EnqueueJobHandler>,
|
|
pub start_job: Arc<StartJobHandler>,
|
|
pub complete_job: Arc<CompleteJobHandler>,
|
|
pub fail_job: Arc<FailJobHandler>,
|
|
pub list_jobs: Arc<ListJobsHandler>,
|
|
pub batch_progress: Arc<ReportBatchProgressHandler>,
|
|
pub manage_plugin: Arc<ManagePluginHandler>,
|
|
pub list_plugins: Arc<ListPluginsHandler>,
|
|
pub configure_pipeline: Arc<ConfigurePipelineHandler>,
|
|
pub list_pipelines: Arc<ListPipelinesHandler>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct AppState {
|
|
pub identity: IdentityHandlers,
|
|
pub catalog: CatalogHandlers,
|
|
pub organization: OrganizationHandlers,
|
|
pub storage: StorageHandlers,
|
|
pub sharing: SharingHandlers,
|
|
pub sidecar: SidecarHandlers,
|
|
pub processing: ProcessingHandlers,
|
|
pub token_issuer: Arc<dyn TokenIssuer>,
|
|
}
|