LinkDesk/openspec/changes/my-task-page-project-tasks/design.md

3.7 KiB
Raw Permalink Blame History

Context

此變更旨在為 VFX 專案管理系統新增一個「我的任務」(My Tasks) 頁面,讓用戶能夠在一個統一的視圖中查看所有專案中分配給自己的任務。目前用戶需要逐一進入每個專案才能看到被分配的任務,這對於同時管理多個專案的 Director、Coordinator 等角色而言效率較低。

現有系統已經具備:

  • 完善的任務管理系統Task entity with assignments
  • 專案內的任務頁面(使用 DataTable 元件)
  • 基於角色的存取控制 (RBAC)
  • JWT 認證機制

Goals / Non-Goals

Goals:

  • 建立一個統一的「我的任務」頁面,展示所有分配給當前用戶的任務
  • 重用現有的專案任務頁面 layout 與 DataTable 元件,確保 UI 一致性
  • 支援按專案、狀態等條件篩選任務
  • 支援任務排序功能
  • 提供從任務列表直接導航到任務詳細頁面的功能

Non-Goals:

  • 不會修改現有專案內的任務頁面行為
  • 不會新增任務管理功能(如建立、編輯、刪除任務)- 這些應在專案上下文完成
  • 不會提供跨專案的任務批量操作

Decisions

1. API 設計:獨立端點 vs 擴展現有端點

Decision: 建立獨立的 /api/tasks/my-tasks 端點

Rationale:

  • 獨立端點可讓權限過濾更清晰(僅顯示用戶有權限存取的專案任務)
  • 回應格式可針對 My Tasks 視圖優化(如包含專案資訊)
  • 未來擴展(如分頁、進階篩選)更彈性

Alternative considered: 擴展現有的 /api/projects/{id}/tasks 端點

  • 這個方法需要傳遞多個專案 ID不適合跨專案查詢場景

2. 前端架構:新建元件 vs 重用現有元件

Decision: 重用現有的 ProjectTaskPage layout 與 DataTable 元件

Rationale:

  • 確保 UI/UX 一致性,用戶在專案內和 My Tasks 頁面有相同體驗
  • 減少開發時間和維護成本
  • DataTable 元件已經支援排序、篩選、分頁等功能

Alternative considered: 建立全新的 MyTasksPage 元件

  • 需要重複實作相同功能,增加維護負擔

3. 權限模型:僅顯示有權限的任務

Decision: API 僅返回用戶有存取權限的專案任務

Rationale:

  • 符合最小權限原則
  • 避免資安風險(用戶不應看到無權限專案的任務)
  • 與現有 RBAC 系統整合

4. 資料庫查詢策略

Decision: 單一查詢取得所有任務(而非多次查詢)

Rationale:

  • 減少網路往返次數
  • 雖然查詢較複雜,但可通過 SQLAlchemy 優化
  • 考量未來加入分頁以處理大量任務

Risks:

  • [Risk] 大型系統中任務數量可能很大 → Mitigation: 實作分頁機制
  • [Risk] 跨專案查詢效能 → Mitigation: 確保 task.assignee_id 和 task.project_id 有適當索引

Migration Plan

此變更為純新增功能,不需要資料遷移。部署步驟:

  1. 後端部署

    • 部署新 API 端點 /api/tasks/my-tasks
    • 確認任務查詢效能(如需要則新增資料庫索引)
  2. 前端部署

    • 新增 My Tasks 頁面路由
    • 確保導航選單有 My Tasks 入口
  3. 驗證

    • 測試不同角色用戶的 My Tasks 顯示正確性
    • 驗證篩選、排序功能正常運作
    • 確認權限控制正確(無權限專案的任務不顯示)

Open Questions

  • Q1: My Tasks 頁面是否需要顯示任務的詳細進度(如 shot/asset 進度)?

    • 目前建議: 暫不包含,保持與專案任務頁面一致
  • Q2: 是否需要支援「我的最愛」或「追蹤中」的任務功能?

    • 目前建議: 留待未來擴展
  • Q3: 如何處理任務數量眾多的效能問題?

    • 建議: 採用分頁(預設 50 筆),並在未來根據需求考慮虛擬滾動