Если я понимаю вопрос, у приложения есть несколько пользователей, и у этих пользователей могут быть чаты 1-1 или 1-много, и вы хотите, чтобы пользователи не получали события для чатов, частью которых они не являются.
Начнем с узла пользователя
users
uid_0
name: "Bill"
chats:
chat_id_0: true
chat_id_9: true
uid_1
name: "Jesse"
chats:
chat_id_0: true
chat_id_6: true
.
.
.
и затем упрощенный узел чатов
chats
chat_id_0:
uid_0: "Hey there, Jesse"
uid_1: "Sup Bill?"
chat_id_6:
uid_0: "This is Bill, anyone around?"
chat_id_9:
uid_1: "Look ma, no hands"
uid_7: "Impressive"
В приведенном выше примере chat_id_x создается с помощью .childByAutoId, когда пользователь запускает чат.
Когда Билл входит в систему (uid_0), прочитайте его узел чатов, а затем добавьте наблюдателей в чаты, перечисленные в этом узле. В этом случае Билл является частью chat_id_0 и chat_id_9. Сделайте то же самое для Джесси, который является частью 0 и 6.
И Билл, и Джесси ведут чат в chat_id_0, Билл ожидает ответа от всех пользователей, также просматривающих chat_id_6, а Джесси беседует с uid_7 в chat_id_9.
Оттуда в любое время, когда есть событие (например, .childAdded, когда в чат добавляется новое сообщение), только те пользователи, которые наблюдают за этим чатом («подписались»), получат событие.
Очевидно, что более подробная информация будет включена в каждый узел чата (отметка времени и т. Д.)
как проверить, есть ли уже чат с тем же получателем (или
получателей) на основе chatId
Есть несколько способов справиться с этим;
Во-первых, при добавлении наблюдателя в каждый из чатов, частью которых вы являетесь (.childAdded), каждый дочерний узел в этом узле чата будет возвращен вашему приложению. Это хорошо для двух вещей: во-первых, для заполнения пользовательского интерфейса существующими сообщениями чата, а во-вторых ... тогда вы будете знать, кто был связан с этим чатом. Сохраните эти UID в массиве с идентификатором чата, и перед отправкой чата этому человеку проверьте, существуют ли они в массиве как существующий чат.
Второй вариант - запросить все чаты, в которых отображается пользовательский uid (запрос с использованием .observeSingleEvent). Это вернет все чат-узлы, к которым они принадлежат, и затем получит uid того, с кем они еще общаются, и идентификатор чата.
Другой вариант - при создании чата / chat_id_0 добавить дочерний узел с именем / who_dat, в котором хранится список приглашенных в чат
chats
chat_id_0
who_dat
uid_0: true
uid_1: true
uid_2: true
messages:
uid_0: "Hey there, Jesse"
uid_1: "Sup Bill?"
в этом случае uid_2 также был добавлен в chat_id_0, но пока не слышал о них.