Я пишу приложение, в котором пользователи могут оставлять комментарии в темах. Поскольку для этого я использую бэкэнд No SQL в Firestore, я храню каждый комментарий в двух местах:
/threads/THREADID/comments/COMMENTID
/users/USERID/comments/COMMENTID
Таким образом, у меня есть обзор всех комментариев в теме, но также и всех комментарии, оставленные пользователем. Чтобы оба этих комментария всегда создавались, я использую пакетную запись. Пакетные записи - это atomi c, так что это никогда не должно вызывать проблем, но меня беспокоит то, что злонамеренный пользователь может использовать собственный код для создания комментария только в одном месте, а не в обоих. Мне нужно найти правило, которое подтверждает, что либо оба комментария созданы, либо ни один из них не должен.
match /users/{userId}/comments/{commentId} {
allow create: if exists(/databases/$(database)/documents/threads/$(request.resource.data.threadId)/comments/$(commentId)
}
match /threads/{threadId}/comments/{commentId} {
allow create: if exists(/databases/$(database)/documents/users/$(request.auth.uid)/comments/$(commentId)
}
CommentId используется повторно, так что он должен быть одинаковым в обеих коллекциях, поэтому я могу использовать повторно это в моих правилах. Предыдущий пример явно терпит неудачу, потому что для вставки в одном месте мне требуется, чтобы он уже был вставлен в другом месте, и наоборот.
Спасибо!