Создавайте приватные чаты в Firebase и Javascript - PullRequest
0 голосов
/ 05 января 2020

Я создаю приложение с Firebase, которое требует личных сообщений между пользователями. Что мне нужно, так это создавать отдельные чаты для 1-1 чатов и хранить сообщения в Firestore.

Моя идея: Я думаю, что лучший способ - создать отдельную коллекцию для каждого чата с правильные правила безопасности. Допустим, пользователь с tokenID 1234 хочет поговорить с пользователем с tokenID 1111, будет создана новая коллекция с именем 1234_1111 (если она не существует), и защита позволит только этим двум пользователям читать и писать.

Мой вопрос: Это правильный путь? И как это сделать в Javascript? Я не уверен, как определить правила безопасности непосредственно в коде JS, а также как создать коллекцию с идентификатором двух пользователей.

1 Ответ

1 голос
/ 05 января 2020

Правила безопасности не определены в вашем JavaScript коде, они определены отдельно . То, что вы предлагаете, было бы разумным подходом, хотя я бы использовал для него вложенную коллекцию, и упрощенная версия ваших правил безопасности может выглядеть примерно так:

service cloud.firestore {
  match /databases/{database}/documents {
    match /dms/{idPair}/messages/{msgId} {
      allow read, write: if 
        idPair.split('_')[0] == request.auth.uid ||
        idPair.split('_')[1] == request.auth.uid;
    }
  }
}

Тогда в своем коде JS вы может сделать что-то вроде:

// generate idPair
function dmCollection(uid) {
  const idPair = [firebase.auth().currentUser.uid, toUid].join('_').sort();
  return firebase.firestore().collection('dms').doc(idPair).collection('messages');
}

// send a DM
function sendDM(toUid, messageText) {
  return dmCollection(toUid).add({
    from: firebase.auth().currentUser.uid,
    text: messageText,
    sent: firebase.firestore.FieldValue.serverTimestamp(),
  });
}

// retrieve DMs
function messagesWith(uid) {
  return dmCollection(uid).orderBy('sent', 'desc').get();
}

Обратите внимание, что idPair создается путем объединения отсортированной пары UID, чтобы он был стабильным независимо от того, какой пользователь отправляет.

...