Правила безопасности не определены в вашем 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, чтобы он был стабильным независимо от того, какой пользователь отправляет.