Я пытался написать правило, что если идентификатор документа не существует, то создайте новый документ.Мой объект:
Message message = new Message(userId, title, messageBody, timestamp);
, и я использую WriteBatch
, чтобы создать новый документ и обновить его:
mWriteBatch.set(mMessageRef.document(messageId), message);
mWriteBatch.update(mMessageRef.document(mIntentMessageId), // params...);
После просмотра документов и этого сайта я 'мы обнаружили, что если я использую метод create
, он только позволяет записывать данные, если они не существуют .
Поэтому я создал правило безопасности, например:
match /messages/{message} {
allow read;
allow create: if isSignedIn();
allow update, delete: if isSignedIn();
}
isSignedIn()
- это просто метод, содержащий request.auth != null
.Это правило не выполняется и перезаписывает данные.Теперь я попробовал:
match /messages/{message} {
allow read;
allow create: if request.resource.id != message;
allow update, delete: if isSignedIn();
}
На этот раз также перезаписывает данные вместо того, чтобы показывать ошибку.
Что я здесь не так делаю?Любая помощь приветствуется.
Обновление: Как сказал Хосе Давид Ароэсти в комментариях , я должен изменить его на exists
и удалить update
иdelete
, чтобы работать должным образом, и из приложения это отражает то, что он должен делать.Но тогда как мне update
и delete
документ?
Например, когда я использую приведенные ниже правила в симуляторе, оба выполняются, как ожидалось, но когда я тестирую его изустройство, я всегда могу создать документ, даже если он существует:
allow create: if !exists(/databases/$(database)/documents/messages/$(message));
allow update: if get(/databases/$(database)/documents/messages/$(message)).data.timestamp
< request.resource.data.timestamp;
Возможно ли это?