Как я могу проверить, существует ли идентификатор в документе? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть базовое приложение для чата, и пользователи могут блокировать друг друга.Когда пользователь A блокирует пользователь B , пользователь B больше не доступен для отправки сообщений.

Структура блоков

user-blocks collection

Правило безопасности (разговоры)

function isBlocked() {
  return !get(/databases/$(database)/documents/user-blocks/$(request.resource.data.receiverId)).data.hasAny([request.auth.uid]);
}

Итак, когда пользователь B (аутентифицированный пользователь) отправляет сообщение на пользователь A (получатель), это не должно быть разрешено.Поскольку пользователь A заблокировал пользователя B .

Проблема

Код выше не работает.Как я могу проверить, существует ли идентификатор пользователя B в документе?

1 Ответ

0 голосов
/ 18 апреля 2019

hasAny задокументировано в списке .Похоже, вы захотите перейти от поля на блок к одному блоку со списком идентификаторов.Например, документ в / user-blocks / будет иметь блоки = [sender-id1, sender-id2], тогда ваше правило будет выглядеть так: return !get(/databases/$(database)/documents/user-blocks/$(request.resource.data.receiverId)).data.blocks.hasAny([request.auth.uid]);

Вы также можете попробовать использовать оператор in для Карта , например return !(request.auth.uid in get(/databases/$(database)/documents/user-blocks/$(request.resource.data.receiverId)).data)

Чтобы объединить это с существующим вызовом, вам понадобится что-то вроде: `

if (!exists(/databases/$(database)/documents/user-blocks/$(request.resource.data.receiverId)
     or !(request.auth.uid in get(/databases/$(database)/documents/user-blocks/$(request.resource.data.receiverId)).data))

`

...