Переменные в правиле иерархического облачного пожарного хранилища - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть следующее правило в облачном пожарном хранилище.Структура: /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;
  }
}

Вопрос по-прежнему открыт дляхорошие решения.

...