У меня есть 4 коллекции Firestore:
users/{userId}
, доступ к которым разрешен только для одного и того же использования - request.auth.uid == userId
organizations/{organizationId}
, доступ к которым разрешен пользователям эта организация - exists(/databases/$(database)/documents/organizations/{organizationId}/users/$(request.auth.uid))
Пока что простые правила. В следующих коллекциях есть ссылки либо на пользователя, либо на организацию, а в лучшем случае я бы хотел рассказать firestore: hasAccess(someReference, read)
.
notifications
, у которых есть
ref
для уведомления, который может быть либо
users/{userId}
, либо
organizations/{organizationId}
, к которому я разрешу доступ, если это ссылка на пользователя или на организацию, членом которой является пользователь. (комбинация двух предыдущих правил)
accounts
с массивом организации
ref
, и я хотел бы, чтобы правило было таким:
resource.data.organizations.any(organization => hasAccess(organizationRef, read))
Вопросы:
- Есть ли способ запросить у firebase совпадение с новой ссылкой и вернуть, если у пользователя есть к ней доступ?
- Есть ли способ обработать массив, как в моем 4-я коллекция, где я хочу выполнить операцию «any»?
Редактировать:
Это рекурсивно, потому что я хочу, чтобы при сопоставлении коллекции запрашивались другие правила коллекции, который может спросить о другом, et c .. (hasAccess
)
Edit 2:
Один из обходных путей - создать функцию canAccess
, которую я могу вызывать рекурсивно, так, чтобы для любого пути я могу сделать canAccess(request.path);
.
НО "Правила сохранения ошибок - строка 5: рекурсивный вызов не допускается. "