Рассмотрим этот тип болта, называемый ChatMessage
Путь
path /chats/{cid}/{mid} is ChatMessage {
read() { auth.uid != null }
write() { this.uid == auth.uid }
}
Тип
type ChatMessage {
uid: String,
message: String,
date_created: Number,
date_modified: Number,
validate() { this.message != null && this.date_modified != null }
}
Скомпилированные правила
{
"rules": {
"chats": {
"$cid": {
"$mid": {
".validate": "((newData.hasChildren(['uid', 'message', 'date_created', 'date_modified']) && newData.child('message').val() != null) && newData.child('date_modified').val() != null)",
"uid": {
".validate": "newData.isString()"
},
"message": {
".validate": "newData.isString()"
},
"date_created": {
".validate": "newData.isNumber()"
},
"date_modified": {
".validate": "newData.isNumber()"
},
"$other": {
".validate": "false"
},
".read": "auth.uid != null",
".write": "newData.child('uid').val() == auth.uid"
}
}
}
}
}
Что я нашелявляется то, что это
newData.hasChildren(['uid', 'message', 'date_created', 'date_modified'])
применяется только для операций создания, и операции обновления с частичными данными разрешены.Это нормально!
Однако этот
newData.child('message').val() != null) &&
newData.child('date_modified').val() != null
не блокирует обновление, содержащее только message
или date_modified
.Цель состоит в том, чтобы сделать так, чтобы пользователь мог обновлять свой чат только в том случае, если он предоставил message
и date_modified.
. Есть ли способ добиться этого без использования облачных функций для обновления чата, когда сообщениеобновлен?