feat: add storage cleanup mechanism with soft delete and auto scheduler

- Add soft delete (deleted_at column) to preserve task records for statistics
- Implement cleanup service to delete old files while keeping DB records
- Add automatic cleanup scheduler (configurable interval, default 24h)
- Add admin endpoints: storage stats, cleanup trigger, scheduler status
- Update task service with admin views (include deleted/files_deleted)
- Add frontend storage management UI in admin dashboard
- Add i18n translations for storage management

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
egg
2025-12-14 12:41:01 +08:00
parent 81a0a3ab0f
commit 73112db055
23 changed files with 1359 additions and 634 deletions

View File

@@ -0,0 +1,60 @@
# Change: Add Storage Cleanup Mechanism
## Why
目前系統缺乏完整的磁碟空間管理機制:
- `delete_task` 只刪除資料庫記錄,不刪除實際檔案
- `auto_cleanup_expired_tasks` 存在但從未被調用
- 上傳檔案 (uploads/) 和結果檔案 (storage/results/) 會無限累積
用戶需要:
1. 定期清理過期檔案以節省磁碟空間
2. 保留資料庫記錄以便管理員查看累計統計TOKEN、成本、用量
3. 軟刪除機制讓用戶可以「刪除」任務但不影響統計
## What Changes
### Backend Changes
1. **Task Model 擴展**
- 新增 `deleted_at` 欄位實現軟刪除
- 保留現有 `file_deleted` 欄位追蹤檔案清理狀態
2. **Task Service 更新**
- `delete_task()` 改為軟刪除(設置 `deleted_at`,不刪檔案)
- 用戶查詢自動過濾 `deleted_at IS NOT NULL` 的記錄
- 新增 `cleanup_expired_files()` 方法清理過期檔案
3. **Cleanup Service 新增**
- 定期排程任務(可配置間隔,建議每日)
- 清理邏輯:每用戶保留最新 N 筆任務的檔案(預設 50
- 只刪除檔案,不刪除資料庫記錄(保留統計數據)
4. **Admin Endpoints 擴展**
- 新增 `/api/v2/admin/tasks` 端點:查看所有任務(含已刪除)
- 支援過濾:`include_deleted=true/false``include_files_deleted=true/false`
### Frontend Changes
5. **Task History Page**
- 用戶只看到自己的任務(已有 user_id 隔離)
- 軟刪除的任務不顯示在列表中
6. **Admin Dashboard**
- 新增任務管理視圖
- 顯示所有任務含狀態標記(已刪除、檔案已清理)
- 可查看累計統計不受刪除影響
### Configuration
7. **Config 新增設定項**
- `cleanup_interval_hours`: 清理間隔(預設 24
- `max_files_per_user`: 每用戶保留最新檔案數(預設 50
- `cleanup_enabled`: 是否啟用自動清理(預設 true
## Impact
- Affected specs: `task-management`
- Affected code:
- `backend/app/models/task.py` - 新增 deleted_at 欄位
- `backend/app/services/task_service.py` - 軟刪除和查詢邏輯
- `backend/app/services/cleanup_service.py` - 新檔案
- `backend/app/routers/admin.py` - 新增端點
- `backend/app/core/config.py` - 新增設定
- `frontend/src/pages/AdminDashboardPage.tsx` - 任務管理視圖
- Database migration required: 新增 `deleted_at` 欄位