Skip to Content
核心概念規則when 前置條件

when 前置條件

when 讓規則只在目前列符合條件時才執行。它使用與 filter predicate 相同的陣列 shape,因此前端可以共用欄位選擇器、operator 控制項與型別驗證,不必再設計一套規則專用 DSL。

Shape 與 AND 語意

{ "type": "require", "name": "已送出案件必須有負責人", "column": "負責人", "when": [ { "column": "狀態", "op": "eq", "value": "已送出" }, { "column": "已封存", "op": "eq", "value": false } ] }

陣列內最多 5 個 predicate,全部以 AND 組合。column 可用顯示名稱或內部 col_<hex> key 輸入;伺服器會解析並儲存 rename-stable key。只可引用 stored scalar 欄位,不能用 link、rollup、lookup 或 formula。

Operator 與 value

opvalue shape
eq, neq, gt, gte, lt, lte, contains與欄位型別相符的單一 scalar
in非空 scalar 陣列,最多 100 項
is_null, is_not_null不帶 value,或帶 null

前端應依欄位型別縮小 operator 選項,並在送出前拒絕物件、巢狀陣列及型別不符的值。伺服器仍會做最終驗證。

哪些規則不能用 when

unique 是無條件的資料庫約束;transition 只看狀態前後值;channelinvariant 在各自的安全 floor 執行。immutable_when 拒絕它的理由則是第四種:when 是以 post-image 判斷,而鎖定條件若在寫入之後才讀,就會被那筆寫入自己打敗 —— 呼叫者在同一個 request 裡解鎖並修改({"Status": "draft", "Qty": 6}),Status eq posted 就永遠不會命中。它改用 prior_when,以列的 pre-image 判斷。

這五類都不接受有效的 when;帶了非空的 when 會在設定階段收到 rules.set400,detail 是一個點名該 type 的純字串。immutable_when 的是:

immutable_when rules do not take a when pre-condition — use `prior_when`, which evaluates against the row's PRE-image

對 SCP 的條件式邏輯,請使用 policy 的 if / then / else,見 channelinvariant

Note GET 回來的規則可能帶有 "when": null。這是可安全原樣重送的正規化表示,不必刪除。

端點與完整錯誤模型見 rules.set;可先用 rules.preview 驗證組合後的候選清單。

Last updated on