У меня есть коллекция пользователей, в которой каждый документ содержит поле имени и карту доступа.
"users" :[
{
"mHbVq5TUY7brlleejClKm71NBGI2": {
"name": "Bob Johnson",
"access": {
"X0w1VaVIljR1Nc5u3Sbo" : true
}
}
]
Я бы хотел, чтобы правила Firestore позволяли создавать новый документ, только если его еще нетсуществует и только если лицо, выполняющее действие, подтвердило свою электронную почту.Для обновления только пользователь, владеющий этим узлом, может выполнить обновление, имя должно быть строкой, и карта доступа не может быть изменена.Я протестировал свое обновление и создал правила в симуляторе, и они работали, как и ожидалось.Однако, когда я запускаю .set (), он полностью перезаписывает весь мой узел и удаляет карту доступа, чего у меня не может быть.Я предполагаю, что .set () на самом деле выполняет обновление и, таким образом, соответствует моим критериям обновления.Итак, как мне помешать кому-либо полностью перезаписать мой узел?Заранее спасибо ... код ниже.
--- КОД ВЫПОЛНЯЕТ ПЕРЕЗАПИСЬ
db.collection("users").doc("mHbVq5TUY7brlleejClKm71NBGI2").set(
{
name: "Bill Swanson",
}
).catch(err => {
console.log(err.message)
})
--- ПРАВИЛА
function incomingData() {
return request.resource.data
}
function emailVerified() {
return request.auth.token.email_verified;
}
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
function userExists(user_Id) {
return exists(/databases/$(database)/documents/users/$(user_Id));
}
allow create: if !userExists(userId) && emailVerified();
allow update: if request.auth.uid == userId
&& !('access' in incomingData())
&& request.resource.data.name is string;
allow read: if request.auth.uid != null;
}
}
}