У меня есть следующая база данных пожарного магазина (упрощенно)
groups
group1
role=guest
group2
role=user
group3
role=moderator
users
user1
group=group1
user2
group=group2
items
item1
item2
Допустим, я хочу разрешить пользователям только читать /items
данные.
Вот мой подход:
service cloud.firestore {
match /databases/{database}/documents {
function getUser(id) {
return get(/databases/$(database)/documents/users/$(id)).data
}
function getGroup(id) {
return get(/databases/$(database)/documents/groups/$(id)).data
}
function getRole(id) {
return get(/databases/$(database)/documents/roles/$(id)).data
}
match /items/{document=**} {
allow read: if getRole(getGroup(getUser(request.auth.id).group).role) == 'user'
}
}
}
Но, похоже, это не работает.
Похоже, что нельзя делать вложенные вызовы в правилах пожарного депо.
Я протестировал getGroup()
с жестко закодированным идентификатором, и он отлично работает:
allow read: if getGroup('<userGroupId>') == 'user'
Это также работает:
allow read: if getUser(request.auth.uid).group == '<userGroupId>'
Но оно не работает по этому более сложному правилу:
allow read: if getGroup(getUser(request.auth.uid).group) == 'user'
Можно ли заставить его работать?
Есть ли другой способ сделать это, если нет?