タイトルのままなのですが、おそらく世の中の99%の人が知らない知識です。(私調べ)
変数の使い方
条件
rules_version = '2';
- functionの中でのみ使える
使い方
firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isAuthorOrAdmin(userId, article) {
// こんな感じでletが使えちゃう
let isAuthor = article.author == userId;
let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
return isAuthor || isAdmin;
}
match /articles/{article_id} {
match write: if isAuthorOrAdmin(request.auth.uid, resource);
match read: if request.auth != null;
}
}
}
びっくりですね〜!
ですが、この例の場合は、 isAdmin
がisAuthorがtruehyの時にも呼び出されてしまうので、もったいないです。
遅延評価を活用して、呼び出しを抑制してみましょう。
firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isAdmin(userId) {
return exists(/databases/$(database)/documents/admins/$(userId));
}
function isAuthorOrAdmin(userId, article) {
let isAuthor = article.author == userId;
// `||`を活用して isAuthorがfalseの場合のみisAdminが呼ばれる
return isAuthor || isAdmin(userId);
}
match /articles/{article_id} {
match write: if isAuthorOrAdmin(request.auth.uid, resource);
match read: if request.auth != null;
}
}
}
これで、無駄に呼ばれることがなくなったのでいい感じです。
このletが使えるのはFirestoreだけでなくStorageでも利用できるようです!
変数の制限
- Functionの中で10個まで宣言できる
- Functionの終了は絶対returnしないといけない
まとめ
変数を使って可読性の高いルールを書いていきましょう。
実践FirestoreというFirestoreのルールやら設計やらの参考になりFirestoreやるならマストバイな良本があるのですが、それにも載ってないぐらい恐らく誰にも知られていません。
参考文献