Firestore правила, если ... еще - PullRequest
0 голосов
/ 06 июня 2018

Я только начал разбираться с правилами Firestore, и моя голова быстро расширяется.

Я пытаюсь понять, как применить правило к одной коллекции, а другое правило ко всем другим коллекциям иих подколлекции.

Итак, я начну с правила по умолчанию, которое поставляется вместе с Firestore:

service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write;
    }
  }
}

, которое разрешает доступ на чтение и запись ко всем коллекциям и их документам.

Но предположим, что я хочу применить правило к документам в одной коллекции и сохранить правило по умолчанию для всех других коллекций.Следующее не будет работать:

service cloud.firestore {
  match /databases/{database}/documents {

      match /suppliers/{supplier} {
        allow create: if !exists(/databases/$(database)/documents/supplierABNs/1260)
}

  match /{document=**} {
    allow read, write;
}


 }
}

, потому что второе правило переопределит первое.

Есть ли способ сделать то, что я пытаюсь сделать?

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Я понимаю, что вы хотите применить правило к документам в одной коллекции и сохранить правило по умолчанию для всех других коллекций.Есть способ сделать то, что вы пытаетесь сделать, и вам это не понравится.

Вы должны явно указать правила по умолчанию для всех других коллекций.

Вот пример.

service cloud.firestore {
  match /databases/{database}/documents {

    //Rule for Suppliers collection
    match /suppliers/{supplier} {
        allow create: if !exists(/databases/$(database)/documents/supplierABNs/1260)
    }

    //Rule for Changelog collection allowing complete access
    match /Changelog/{id} {
        allow read: if true;
        allow write: if true;
    }

    //Rule for Vendors collection allowing complete access
    match /Vendors/{id} {
        allow read: if true;
        allow write: if true;
    }

  }
}

Примечание: правила Firestore не поддерживают операторы if else.Но вы можете использовать условия И и ИЛИ в качестве обходного пути для симуляции.

0 голосов
/ 06 июня 2018
service cloud.firestore {
  match /databases/{database}/documents {

    match /suppliers/{supplier} {
      allow create: if isValidSupplier()
    }

    function isValidSupplier() {
        return resource.data.supplierABNs == '1260'
    }

    match /{document=**} {
      allow read, write;
    }
  }
}

resource.data содержит значения из ваших существующих документов.

...