Правила Firestore: как разрешить чтение вложенного документа на основе родительского свойства - PullRequest
0 голосов
/ 28 декабря 2018

Моя база данных firstore с коллекциями и документами структурирована следующим образом:

  • Пользователи -> События -> Действия -> Потоки

Я хочу, чтобы все могличитать документ внутри коллекции Events и ее подколлекционного документа (actions + Streams), если у документа Collectionsiton Events есть свойство, например, видимость строки "public"

То есть, если документ в коллекции Events имеет видимость поляпублично любой пользователь должен иметь возможность прочитать этот документ и его подколлекции.

До сих пор мне удавалось сделать доступным для чтения только документ в коллекции событий с помощью:

   service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userID} {
      allow read, update, delete: if request.auth.uid == userID;
      allow create: if request.auth.uid != null;
        match /events/{eventID} {
          allow read: if resource.data.visibility == 'public';
          allow read, write, create, update, delete: if request.auth.uid == userID;
          match /activities/{activitytID} {
            allow read, write, create, update, delete: if request.auth.uid == userID;
            match /streams/{streamID} {
              allow read, write, create, update, delete: if request.auth.uid == userID;
            }
          }
        }

    }
  }
}

Как сделать, чтобы видимость одного документа событий была общедоступной, а также вложенных коллекций действийа потоки тоже будут читабельными?

1 Ответ

0 голосов
/ 28 декабря 2018

Я решил это с помощью:

Добавление функции для получения данных события

 function eventData() {
            return get(/databases/$(database)/documents/users/$(userID)/events/$(eventID)).data
          }

Полные правила:

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userID} {
      allow read, update, delete: if request.auth.uid == userID;
      allow create: if request.auth.uid != null;
        match /events/{eventID} {
          allow read: if resource.data.visibility == 'public';
          allow read, write, create, update, delete: if request.auth.uid == userID;
          function eventData() {
            return get(/databases/$(database)/documents/users/$(userID)/events/$(eventID)).data
          }
          match /activities/{activityID} {
            allow read: if eventData().visibility == 'public'
            allow read, write, create, update, delete: if request.auth.uid == userID;
            match /streams/{streamID} {
              allow read: if eventData().visibility == 'public'
              allow read, write, create, update, delete: if request.auth.uid == userID;
            }
          }
        }

    }
  }
}
...