RDMSだと、特定の更新のみを許可する場合が良くあります。たとえば、status = "done"にする場合だけ許可するようなパターン。これを、どう書くか、汎用的に関数化すると以下のようになります。
このテクニックを使えると、Cloud Functionsを使わなくて良いパターンがかなり増えるのではないかと思います。
// 指定されたキー以外は変化していない
function isNotChangedExcept(keys) {
return request.resource.data.diff(resource.data).affectedKeys().hasOnly(keys)
}
// 更新後の値が、valueを含んでいる
function hasFixedUpdate(value) {
return request.resource.data.diff(value).unchangedKeys() == value.keys().toSet();
}
// 更新時のupdate条件がvalueと一致する
function isFixedUpdate(value) {
return isNotChangedExcept(value.keys) && hasFixedUpdate(value);
}
// 使用例
isFixedUpdate({"status": "done"}) || isFixedUpdate({"status": "cancelled"})