Skip to Content
核心概念規則require_approval

require_approval 規則

require_approval 把符合條件的寫入從「立即落地」改成「先暫存、送 Review 模組、核准後重播」。它適合高風險資料變更,不是一般 validation error。

Payload

{ "type": "require_approval", "name": "高額訂單需主管核准", "label": "高額訂單變更", "events": ["create", "update", "delete", "restore"], "template_id": "44444444-4444-4444-8444-444444444444", "when": [ { "column": "金額", "op": "gte", "value": 100000 } ] }

eventscreateupdatedeleterestore 的非空子集合。template_id 必須是同公司、仍可用且 gates 有效的 Review template。每張表最多一條 require_approval

Template 的 reviewer 在存檔當下就被驗證

存規則時會載入該 template,並執行與 Review 模組建立 template 時相同的 gate 驗證,因此「reviewer 根本無法登入」的 gate 會在這裡被擋下,而不是等到之後才發現流程卡在 in_review、票沒有人投得了。一位 reviewer 要同時滿足未刪除、未停用、已驗證、未過期才算數。

驗證失敗時 rules.set400detail 是一個把 Review 模組原訊息包起來的純字串:

review template '44444444-4444-4444-8444-444444444444' has invalid gate groups: review users not found or inactive: ['77777777-7777-4777-8777-777777777777']

冒號之後是實際觸發的那一項檢查 —— review groups not found: [...]review groups have no active members: [...]review users not found or inactive: [...],或 gate {i} would assign {n} reviewers, exceeds max 500 —— id 只列出前五個。rules.preview 回完全相同的 400,所以 preview 不會接受存檔會拒絕的東西。Template 不存在、非 live 或屬於其他公司,則是另一則 400 review template '<id>' is not usable

走 IaC rule line 的路徑時,同一段文字不是 HTTP 400:apply 會把它記成該行的 per-resource apply error 寫進 apply report,request 本身仍然成功。

Gate condition 現在也可以直接指名一個人 —— 一個 {"type": "user", "user_id": "<uuid>"} leaf,不需要 review group —— 這樣的 template 同樣是合法的 require_approval 對象。該使用者套用與群組成員相同的檢查,因此未驗證或已過期的直接 reviewer 一樣會讓存檔失敗。

409 是 staged success

第一次符合的寫入會建立 staged change,回傳:

{ "detail": { "error": "approval_required", "process_id": "55555555-5555-4555-8555-555555555555", "rule_id": "rule_a1b2c3d4", "rule_label": "高額訂單變更", "staged_change_id": "66666666-6666-4666-8666-666666666666" } }

前端應把它呈現成「已送審」,保存 process_idstaged_change_id,不要自動重送。同一目標已有待審變更時會收到 409 approval_pending

每位 actor 在每張表最多保留 500 筆 pending staged changes;每張表跨所有 actors 最多 50 筆 pending create。任一上限超過時回傳 429

{ "detail": { "error": "staged_cap_exceeded", "scope": "actor", "limit": 500 } }

另一個 variant 是 {"scope":"table","limit":50}。前端必須依伺服器回傳的 scopelimit 呈現訊息;不要只寫死一種佇列上限,也不要假設所有 429 都是 actor cap。

有待審變更時,修改或移除 approval rule 會收到 409 approval_rule_locked。指向這張表的 trigger create/update action 也與 approval gate 互斥,避免無 acting reviewer 的自動寫入被無限暫存。

完整的 Review 管理、assignment decision 與 release/discard 流程見核准流程指南。端點資料見 rules.setstagedChanges.liststagedChanges.discard

Last updated on