У меня есть следующее правило в облачном пожарном хранилище.Структура: /users/{userId}/years/{year}/**
.Я хочу запретить любую запись в документ year
и его подколлекции и их документы, если в этом году установлен флаг closed
.
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, update: ...;
allow delete: ....;
allow create: ...
match /years/{year} {
allow read, create: ...;
allow delete: ...;
allow update: if request.auth.uid == userId && !resource.data.closed
match /{document=**} {
allow read: ...;
allow write: if get(/databases/$(database)/documents/users/$(userId)/years/$(year)).data.closed == false
&& request.auth.uid == userId;
}
}
}
}
}
Правило на уровне года, похоже, работает.Но ниже этого, все запросы терпят неудачу (и в симуляторе, и в приложении) на вызове get
независимо от состояния флага.В документации пожарного магазина есть несколько примеров того, как использовать переменные - возможно ли вообще наследовать переменные верхнего уровня?Или как получить поле флага года при доступе к любому документу ниже этого?
[Обновление / решение]
После того, как вы довольно много погуглили и запустили некоторыебольше симуляций оказалось, что проблема в том, что флага closed
вообще нет.Кажется, что механизм правил пожарного депо не настолько условен с undefined , как двигатели JS.Выдает исключение, равное провалу правила.Нужно проверить свойство на наличие и затем проверить значение.И поскольку нет возможности использовать локальные переменные даже в функциях, это означает, что два get -s вместо одного ...
match /years/{year} {
match /{document=**} {
allow read: ...;
allow write: if !(getYearData().keys().hasAll(['closed']) && getYearData().closed) && request.auth.uid == userId;
}
function getYearData() {
return get(/databases/$(database)/documents/users/$(userId)/years/$(year)).data;
}
}
Вопрос по-прежнему открыт дляхорошие решения.