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
op | value shape |
|---|---|
eq, neq, gt, gte, lt, lte, contains | 與欄位型別相符的單一 scalar |
in | 非空 scalar 陣列,最多 100 項 |
is_null, is_not_null | 不帶 value,或帶 null |
前端應依欄位型別縮小 operator 選項,並在送出前拒絕物件、巢狀陣列及型別不符的值。伺服器仍會做最終驗證。
哪些規則不能用 when
unique 是無條件的資料庫約束;transition 只看狀態前後值;channel 與 invariant 在各自的安全 floor 執行。immutable_when 拒絕它的理由則是第四種:when 是以 post-image 判斷,而鎖定條件若在寫入之後才讀,就會被那筆寫入自己打敗 —— 呼叫者在同一個 request 裡解鎖並修改({"Status": "draft", "Qty": 6}),Status eq posted 就永遠不會命中。它改用 prior_when,以列的 pre-image 判斷。
這五類都不接受有效的 when;帶了非空的 when 會在設定階段收到 rules.set 的 400,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,見 channel 與 invariant。
Note
GET回來的規則可能帶有"when": null。這是可安全原樣重送的正規化表示,不必刪除。
端點與完整錯誤模型見 rules.set;可先用 rules.preview 驗證組合後的候選清單。