產品規格 · 現狀能力盤點

後端已實現功能規格

Backend Capabilities Spec · linebot-saas-frontend
Draft 草稿
版本
v0.1 · 對齊 openapi.json
更新日期
2026-07-22
負責人
研發(Backend / PM)
讀者
內部工程 · PM
來源真相
openapi.json / /docs
What · 是什麼

多租戶 SaaS 後端目前已實現、可直接串接的 API 能力,依 9 個模組盤點,標明每個模組解決的問題與可用端點。

Who · 給誰

內部工程與 PM,做為前端串接、能力對齊與範圍溝通的單一「能力地圖」,補足 schema 契約看不出的全貌。

Why now · 為何現在

API 契約已達 75 路徑 / 112 操作、三條使用線成形;能力散落在 schema 中,需一頁對齊已交付範圍與尚未涵蓋的邊界。

75
API 路徑(paths)
112
操作(operations)
9
功能模組
3
使用線(超管 / 租戶 / LIFF)
01

問題定義

為什麼需要這份現狀規格

後端能力真相集中在 openapi.json(CI 強制與程式碼同步),但那是逐端點的 request/response schema——看得到「有哪些欄位」,看不出「這個模組解決什麼問題、屬於哪條使用線、邊界在哪」。前端串接與 PM 排範圍時,得在數十條路徑之間反覆拼圖,常誤判某能力「還沒做」或「應該有」。本文以功能視角把 9 個模組、三條使用線與 6 項橫切能力壓成一頁,並明確標出尚未涵蓋的面向(合約寫入、LINE 訊息推播、寄信),讓串接與範圍討論有共同基準。

我每次串新功能都要先開 Scalar 翻半天,才確定這條線到底做完了沒。給我一頁能力地圖,比 100 條 schema 有用。

— 前端工程師(LIFF / 租戶後台)
02

目標與非目標

這份文件負責什麼、不負責什麼

目標 GOALS

  • 以功能視角一頁盤點 9 模組已實現能力,對齊前端串接。
  • 標明每個模組的使用線(超管 / 租戶 / LIFF)與 gating 授權。
  • 明確列出橫切能力(回應信封、RBAC、entitlement、冪等、背景工作)。
  • 清楚界定「已交付」與「尚未涵蓋」的邊界,避免範圍誤判。

非目標 NON-GOALS

  • 不取代 openapi.json 逐欄位契約(schema 仍以其為準)。
  • 不涵蓋前端錯誤碼與 UX 動線(見 frontend/ 三份導覽)。
  • 不定義未來 roadmap 或優先序,只反映當下已實現狀態。
  • 不含合約寫入、LINE 訊息推播、寄信等尚未實作的能力。
03

橫切能力

所有模組共通,串接任一端點皆適用
統一回應信封

任何狀態碼皆回 {data, messages, status_code},錯誤帶穩定機器碼。ADR-0054 / 0045。

RBAC 權限體系

每端點有 gating permission,伺服器端即時解析(60 秒快取,撤銷即時失效)。

模組授權閘門

租戶未啟用模組整組回 403;租戶停權全站封鎖(entitlement)。

冪等寫入

所有寫入方法支援 Idempotency-Key header,重試安全。

背景工作

長時作業(如 ERP 同步)回 202 + job_id,以 GET /jobs/{id} 輪詢。

健康檢查

GET /health/liveGET /health/ready

04

模組能力地圖

9 模組 · 每卡「解決的問題 → 已實現能力 → 主要端點」;使用線以色籤標示
1 · identity

身分驗證、成員與邀請

租戶 + 平台

使用者如何登入、如何被邀請進租戶、租戶內成員如何管理。

租戶線平台線LIFF
  • POST /identity/auth/login · refresh · logout
  • GET /identity/auth/me — 選單/按鈕 gating 單一來源
  • POST /identity/auth/switch-tenant · accept-invitation
  • GET /identity/invitations · members(+/{id})
成員管理三道防護:不可指派平台線角色、不可越權升權、不可移除最後一位 owner。
2 · permission

角色與權限管理

租戶 + 平台

租戶如何自訂角色組合權限;平台如何維護全域角色目錄。

租戶線平台線
  • GET /permission/catalog · roles/assignable
  • POST /permission/roles — 建私有角色
  • ·/· /permission/roles/{id} — 改 / 刪(種子角色唯讀)
  • GET /admin/permission/catalog · modules(core/feature)
休眠權限:模組停用時角色權限標記 inactive_permissions,不報錯(ADR-0048)。
3 · tenant

租戶開通與生命週期

平台線

平台如何開租戶、控制可用模組、處理停權與刪除。

平台線
  • POST /admin/tenant/tenants — 開租戶(單一交易)
  • PATCH /admin/tenant/tenants/{id} — 生命週期轉換
  • POST …/{id}/entitlements — 模組授權整組替換
  • POST …/{id}/impersonate — 代入短效 token
狀態機 active ⇄ suspended → deleted(可 undelete);代入權限取「超管 ∩ tenant_owner」不可升權(ADR-0038 / 0052 / 0053)。
4 · identity(平台)

平台帳號治理

平台線

誰能當平台管理員;問題帳號如何全域封鎖;權限如何稽核。

平台線
  • POST /admin/identity/platform-grants — 授予平台角色
  • DEL /admin/identity/platform-grants/{id}(即時生效)
  • PATCH /admin/identity/users/{id} — 全域 is_active 開關
  • GET …/users/{id}/effective-permissions(可帶 tenant_id)
保護最後一位 super_admin 不可移除;is_active 是唯一全域擋登入機制。
5 · directory

名錄主檔

租戶線

公司 / 業主 / 員工 / 廠商主資料,以及現場人員如何拿到登入帳號。

租戶線LIFF
  • CRUD /directory/companies · customers · employees · vendors
  • POST /directory/employees/{id}/account — 員工帳號開通
  • POST /directory/vendors/{id}/staff-invitations
  • GET /directory/staff/by-user/{id} — 反查所屬廠商
皆軟刪除、code 不可改、支援 ?view=options;協力廠商人員資料範圍固定 own(ADR-0051)。
6 · project

專案與區域

租戶 + 平台

工程專案建檔與空間分區(區域樹),供合約與回報掛載。

租戶線平台線
  • POST /project/projects — 強制從 planning 起(無刪除)
  • POST /project/projects/{id}/areas — 階層區域節點
  • ·/· …/areas/{area_id} — 改父 / 刪葉節點
  • GET /project/area-level-types(租戶唯讀,active)
區域分類為平台擁有的 System Master Catalog,平台側 CRUD + 軟停用(ADR-0044)。
7 · contract

合約、ERP 同步與現場回報

租戶線

合約由 ERP 單向同步(唯讀),現場人員回報工作量,系統管控上限與追加減。

租戶線LIFF
  • GET /contract/contracts(+/{id})· reportable-items(含剩餘量)
  • POST /contract/work-entries — 批次回報 1–200 筆原子性
  • GET /contract/overages · consumption-report(對帳)
  • POST /contract/sync-runs — 手動同步(202 + job)
machine / material 有上限、超量記追加減不擋件;labor 無上限。廠商視角伺服器端強制隔離(ADR-0056)。
9 · storage

檔案儲存(BYO bucket)

租戶 + 平台

租戶自帶物件儲存(R2 / S3 / MinIO),使用者上傳回報照片等附件。

租戶線平台線LIFF
  • POST /storage/profile — BYO 設定(owner-only,存前實測)
  • POST /storage/objects/upload-url → confirm(兩段式 ≤5 GiB)
  • GET /storage/objects — keyset 分頁 / 軟刪除
  • GET /admin/storage/objects · usage(跨租戶稽核)
金鑰只寫不讀(遮罩 last 4);有已確認物件後不可換供應商 / bucket。
8 · llm

LLM 供應商設定與對話代理(本次未聚焦,列此備查) — 租戶自帶 LLM 金鑰(BYO key), /llm/profiles 管理 profile 與金鑰輪替(只寫不讀、遮罩 last 4); POST /llm/{name}/v1/chat/completions 為 OpenAI 相容、恆 SSE 串流,是系統中唯一不走回應信封的端點。

05

能力覆蓋指標

以「現況值 / 量測方式」呈現已交付契約的規模與健全度
指標現況值量測方式
API 契約規模75 路徑 · 112 操作openapi.json 逐路徑 / operation 計數(CI 強制同步)。
模組覆蓋9 模組identity · permission · tenant · directory · project · contract · llm · storage(+ 平台治理)。
使用線覆蓋3 條超管後台 /admin/*、租戶後台 /<module>/*、LIFF(租戶線子集)。
橫切保證6 項全模組回應信封、RBAC、entitlement 閘門、冪等、背景工作、健康檢查逐端點適用。
寫入冪等覆蓋100% 寫入方法所有寫入端點支援 Idempotency-Key,重試安全。
權限撤銷延遲即時(≤ 60s 快取)RBAC 伺服器端解析,權限快取 60 秒,撤銷即時失效。
06

使用者故事

依三條使用線,as-a / I-want / so-that
As a — 平台維運人員(super_admin / support)

我想要一次交易開通租戶並種核心模組授權、必要時以代入身分排查,以便快速上線客戶且全程稽核可追、不會升權。

As a — 客戶方管理者 / 內勤(tenant_owner / member)

我想要邀請成員與協力廠商人員、自訂角色權限、維護名錄與專案區域,以便把現場組織搬進系統並控管誰能看哪些資料。

As a — 現場人員(協力廠商 / 員工,LIFF)

我想要接受邀請直接入戶、對可回報項目批次提交工作量並附照片,以便在工地用手機完成報工,且只看得到自己所屬廠商的合約。

07

範圍:交付里程碑

現狀為已交付狀態;最後一階為尚未涵蓋的邊界

P1 · 身分與權限骨幹

已交付

登入 / 邀請 / 多租戶切換、RBAC 角色目錄、平台帳號治理與租戶生命週期。

identitypermissiontenant

P2 · 業務主資料與工程結構

已交付

四種名錄主檔 + 帳號開通、協力廠商人員入戶、專案與階層區域樹。

directoryproject

P3 · 合約流與平台服務

已交付

ERP 單向同步 + 現場批次回報 + 追加減對帳、BYO 儲存兩段式上傳、BYO LLM 對話代理。

contractstoragellm
08

待解問題

由邊界與串接不確定性彙整,附建議指派
Q1
合約寫入是否永久由 ERP 獨佔? 目前 API 無建立 / 修改合約端點;若未來需系統內調整 allocation,需定義寫入面與 ERP 回寫策略。
BEBackend
Q2
邀請連結交付由前端全權負責? 系統只回一次性 token 不寄信;需確認前端(含 LIFF)的連結產生、時效與重寄流程。
FEFrontend
Q3
LINE 訊息推播的落點? 現契約無 webhook / 推播端點,LIFF 僅用租戶線子集;若要主動通知(如回報審核結果),需評估新模組或外部整合。
PMPM
Q4
本文與 openapi.json 的同步機制? 目前為人工整理的衍生文件;API 異動時需明確的更新責任與檢查點,避免能力地圖與契約漂移。
BEBackend