Files
ss-tools/specs/014-file-storage-ui/tasks.md
2026-01-24 16:21:43 +03:00

84 lines
5.5 KiB
Markdown

# Tasks: File Storage Management & UI
**Branch**: `014-file-storage-ui` | **Spec**: [specs/014-file-storage-ui/spec.md](../014-file-storage-ui/spec.md)
## Phase 1: Setup
*Goal: Initialize backend plugin structure and frontend route scaffolding.*
- [ ] T001 Create storage plugin directory and `__init__.py` in `backend/src/plugins/storage/`
- [ ] T002 Create storage models file `backend/src/models/storage.py` with `StorageConfig` and `StoredFile` Pydantic models
- [ ] T003 Create empty storage route handler `backend/src/api/routes/storage.py` and register in `backend/src/api/routes/__init__.py`
- [ ] T004 Create frontend storage route directory `frontend/src/routes/tools/storage/` and empty `+page.svelte`
- [ ] T005 Create frontend service `frontend/src/services/storageService.js` stub
## Phase 2: Foundational
*Goal: Implement core backend logic for storage management, configuration, and security.*
- [ ] T006 Implement `StoragePlugin` class in `backend/src/plugins/storage/plugin.py` inheriting from `PluginBase`
- [ ] T007 Implement `get_storage_root()` method in `StoragePlugin` with default path logic (`../ss-tools-storage`)
- [ ] T008 Implement `ensure_directories()` method to create `backups/` and `repositories/` subfolders on init
- [ ] T009 Implement path traversal protection helper `validate_path(path)` in `StoragePlugin`
- [ ] T010 Implement `list_files(category)` method in `StoragePlugin` returning `StoredFile` objects
- [ ] T011 Implement `save_file(file, category)` method in `StoragePlugin` handling uploads
- [ ] T012 Implement `delete_file(category, filename)` method in `StoragePlugin`
- [ ] T013 Implement `get_file_path(category, filename)` method in `StoragePlugin` for downloads
- [ ] T014 Register `StoragePlugin` in `backend/src/core/plugin_loader.py` (if manual registration needed)
## Phase 3: User Story 1 - File Management Dashboard (Priority: P1)
*Goal: Enable users to list, upload, download, and delete files via Web UI.*
### Backend Endpoints
- [ ] T015 [US1] Implement `GET /api/storage/files` endpoint in `backend/src/api/routes/storage.py` using `StoragePlugin.list_files`
- [ ] T016 [US1] Implement `POST /api/storage/upload` endpoint in `backend/src/api/routes/storage.py` using `StoragePlugin.save_file`
- [ ] T017 [US1] Implement `DELETE /api/storage/files/{category}/{filename}` endpoint in `backend/src/api/routes/storage.py`
- [ ] T018 [US1] Implement `GET /api/storage/download/{category}/{filename}` endpoint in `backend/src/api/routes/storage.py`
### Frontend Implementation
- [ ] T019 [US1] Implement `listFiles`, `uploadFile`, `deleteFile`, `downloadFileUrl` in `frontend/src/services/storageService.js`
- [ ] T020 [US1] Create `frontend/src/components/storage/FileList.svelte` to display files in a table with metadata
- [ ] T021 [US1] Create `frontend/src/components/storage/FileUpload.svelte` with category selection and drag-drop support
- [ ] T022 [US1] Implement main logic in `frontend/src/routes/tools/storage/+page.svelte` to fetch files and handle tabs (Backups vs Repositories)
- [ ] T023 [US1] Integrate `FileList` and `FileUpload` components into `+page.svelte`
## Phase 4: User Story 2 - Storage Location Configuration (Priority: P2)
*Goal: Allow administrators to configure the storage root path via Settings.*
### Backend
- [ ] T024 [US2] Add `storage_path` field to main configuration model in `backend/src/core/config_models.py` (if not using separate storage config)
- [ ] T025 [US2] Implement `GET /api/settings/storage` and `PUT /api/settings/storage` endpoints in `backend/src/api/routes/settings.py` (or `storage.py`)
- [ ] T026 [US2] Update `StoragePlugin` to read root path from global configuration instead of hardcoded default
- [ ] T027 [US2] Add validation logic to `PUT` endpoint to ensure new path is writable
### Frontend
- [ ] T028 [US2] Add `getStorageConfig` and `updateStorageConfig` to `frontend/src/services/storageService.js`
- [ ] T029 [US2] Create configuration section in `frontend/src/routes/settings/+page.svelte` (or dedicated Storage Settings component)
- [ ] T030 [US2] Implement form to update storage path with validation feedback
- [ ] T031 [US2] Add configuration fields for directory structure and filename patterns in `backend/src/models/storage.py` and `frontend/src/routes/settings/+page.svelte`
- [ ] T032 [US2] Implement logic in `StoragePlugin` to resolve dynamic paths based on configured patterns
## Phase 5: Polish & Cross-Cutting
*Goal: Finalize UI/UX and ensure robustness.*
- [ ] T033 Add link to "File Storage" in main navigation `frontend/src/components/Navbar.svelte`
- [ ] T034 Add error handling toasts for failed uploads or file operations
- [ ] T035 Verify large file upload support (50MB+) in Nginx/FastAPI config if applicable
- [ ] T036 Add confirmation modal for file deletion
## Dependencies
1. **Phase 1 (Setup)**: No dependencies.
2. **Phase 2 (Foundational)**: Depends on Phase 1.
3. **Phase 3 (US1)**: Depends on Phase 2.
4. **Phase 4 (US2)**: Depends on Phase 2. Can run parallel to Phase 3.
5. **Phase 5 (Polish)**: Depends on Phase 3 and 4.
## Parallel Execution Examples
- **Backend/Frontend Split**: T015-T018 (Backend Endpoints) can be developed in parallel with T020-T021 (Frontend Components) using mock data.
- **Story Split**: US1 (File Management) and US2 (Configuration) are largely independent after Phase 2 is complete.
## Implementation Strategy
1. **MVP**: Complete Phases 1, 2, and 3. This delivers a working file manager with a default storage location.
2. **Full Feature**: Complete Phase 4 to allow path configuration.
3. **Polish**: Complete Phase 5 for better UX.