Backend (FastAPI): - Database migration for spaces, projects, task_statuses, tasks tables - SQLAlchemy models with relationships - Pydantic schemas for CRUD operations - Spaces API: CRUD with soft delete - Projects API: CRUD with auto-created default statuses - Tasks API: CRUD, status change, assign, subtask support - Permission middleware with Security Level filtering - Subtask depth limit (max 2 levels) Frontend (React + Vite): - Layout component with navigation - Spaces list page - Projects list page - Tasks list page with status management Fixes: - auth_client.py: use 'username' field for external API - config.py: extend JWT expiry to 7 days - auth/router.py: sync Redis session with JWT expiry Tests: 36 passed (unit + integration) E2E: All APIs verified with real authentication OpenSpec: add-task-management archived 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
5.4 KiB
5.4 KiB
Tasks: add-task-management
1. 資料庫模型
- 1.1 建立
pjctrl_spacesmigration - 1.2 建立
pjctrl_projectsmigration - 1.3 建立
pjctrl_task_statusesmigration - 1.4 建立
pjctrl_tasksmigration - 1.5 建立 SQLAlchemy models (Space, Project, TaskStatus, Task)
- 1.6 驗證 migration 可正確執行與回滾
2. Pydantic Schemas
- 2.1 建立 Space schemas (Create, Update, Response)
- 2.2 建立 Project schemas (Create, Update, Response)
- 2.3 建立 TaskStatus schemas (Create, Update, Response)
- 2.4 建立 Task schemas (Create, Update, Response)
3. 權限中間件
- 3.1 實作 Space 權限檢查 (
check_space_access) - 3.2 實作 Project 權限檢查 (
check_project_access) - 3.3 實作 Security Level 過濾邏輯
- 3.4 整合至現有 auth middleware
4. Spaces API
- 4.1 實作
GET /api/spaces(列出可見空間) - 4.2 實作
POST /api/spaces(建立空間) - 4.3 實作
GET /api/spaces/{id}(取得詳情) - 4.4 實作
PATCH /api/spaces/{id}(更新空間) - 4.5 實作
DELETE /api/spaces/{id}(軟刪除)
5. Projects API
- 5.1 實作
GET /api/spaces/{space_id}/projects(列出專案) - 5.2 實作
POST /api/spaces/{space_id}/projects(建立專案) - 5.3 實作
GET /api/projects/{id}(取得詳情) - 5.4 實作
PATCH /api/projects/{id}(更新專案) - 5.5 實作
DELETE /api/projects/{id}(刪除專案) - 5.6 建立專案時自動建立預設狀態
6. Tasks API
- 6.1 實作
GET /api/projects/{project_id}/tasks(列出任務) - 6.2 實作
POST /api/projects/{project_id}/tasks(建立任務) - 6.3 實作
GET /api/tasks/{id}(取得詳情) - 6.4 實作
PATCH /api/tasks/{id}(更新任務) - 6.5 實作
DELETE /api/tasks/{id}(刪除任務) - 6.6 實作
PATCH /api/tasks/{id}/status(變更狀態) - 6.7 實作
PATCH /api/tasks/{id}/assign(指派任務) - 6.8 實作子任務建立 (parent_task_id)
7. 測試
- 7.1 撰寫 Space API 單元測試
- 7.2 撰寫 Project API 單元測試
- 7.3 撰寫 Task API 單元測試
- 7.4 撰寫權限檢查測試 (Security Level)
- 7.5 撰寫子任務層級限制測試
- 7.6 整合測試
8. 前端 (基礎)
- 8.1 建立 Spaces 列表頁面
- 8.2 建立 Projects 列表頁面
- 8.3 建立 Tasks 列表視角 (ListView)
- 8.4 建立任務建立/編輯表單
- 8.5 實作任務狀態變更
- 8.6 實作任務指派功能
Dependencies
1.x (資料庫) → 2.x (Schemas) → 3.x (權限)
↓
4.x (Spaces API)
↓
5.x (Projects API)
↓
6.x (Tasks API)
↓
7.x (測試)
8.x (前端) 可與 4.x-6.x 並行開發
Notes
- 所有資料表使用
pjctrl_前綴 - 子任務深度限制為 2 層
- 每個新專案自動建立 4 個預設狀態
- Security Level 為 'confidential' 時需檢查專案成員資格
Implementation Summary
完成日期: 2024-12-28 E2E 測試完成日期: 2024-12-29
已建立的檔案
Backend:
migrations/versions/002_task_management_tables.py- 資料庫 migrationapp/models/space.py- Space modelapp/models/project.py- Project modelapp/models/task_status.py- TaskStatus modelapp/models/task.py- Task modelapp/schemas/space.py- Space schemasapp/schemas/project.py- Project schemasapp/schemas/task_status.py- TaskStatus schemasapp/schemas/task.py- Task schemasapp/api/spaces/router.py- Spaces APIapp/api/projects/router.py- Projects APIapp/api/tasks/router.py- Tasks APItests/test_spaces.py- Space 測試tests/test_projects.py- Project 測試tests/test_tasks.py- Task 測試
Frontend:
src/pages/Spaces.tsx- Spaces 列表頁面src/pages/Projects.tsx- Projects 列表頁面src/pages/Tasks.tsx- Tasks 列表頁面src/components/Layout.tsx- 共用 Layout 元件
測試結果
36 tests passed (包含 user-auth 的 13 個測試)
E2E 測試結果 (2024-12-29)
使用真實帳號 (ymirliu@panjit.com.tw) 進行端對端測試:
Spaces API:
- POST /api/spaces - 建立空間
- GET /api/spaces - 列出空間
- GET /api/spaces/{id} - 取得空間詳情
- PATCH /api/spaces/{id} - 更新空間
- DELETE /api/spaces/{id} - 軟刪除空間
Projects API:
- POST /api/spaces/{space_id}/projects - 建立專案
- GET /api/spaces/{space_id}/projects - 列出專案
- GET /api/projects/{id} - 取得專案詳情
- PATCH /api/projects/{id} - 更新專案
- DELETE /api/projects/{id} - 刪除專案
- GET /api/projects/{id}/statuses - 驗證 4 個預設狀態自動建立
Tasks API:
- POST /api/projects/{project_id}/tasks - 建立任務
- GET /api/projects/{project_id}/tasks - 列出任務
- GET /api/tasks/{id} - 取得任務詳情
- PATCH /api/tasks/{id} - 更新任務
- PATCH /api/tasks/{id}/status - 變更狀態
- PATCH /api/tasks/{id}/assign - 指派任務
- DELETE /api/tasks/{id} - 刪除任務
- 子任務建立 (Level 1) - 成功
- 子任務深度限制 (Level 2) - 正確拒絕
- subtask_count 自動計算 - 正確
權限控制:
- Admin 可存取 department 級別專案
- Admin 可存取 confidential 級別專案
- Security Level 過濾邏輯運作正常