我很难弄清楚如何验证更新相互依赖的多位置更新。
考虑以下结构:
"votes": {
"$post_id": {
"$answer_id": {
"$user_id": {
".write": "...",
".validate": "..."
}
}
}
}
"users": {
"$user_id": {
"votes": {
"up": {
".write": "...",
".validate": "..."
},
"down": {
".write": "...",
".validate": "..."
}
}
}
}
用户可以使用-1 / +1对帖子的答案进行投票(或删除他们的投票,因此也使用null)。到目前为止这么好,我可以验证没问题。当我想验证用户的上/下投票计数器时,我的问题出现了。
示例场景:用户A使用+1对答案进行投票,这也会使用户B的up
计数器增加1.如何验证up
字段以使其仅增加(或当有一个实际的新投票时,它会减少。
还有一些情况,例如用户已经投票+1,然后直接将其更改为-1。我很难验证这样的更新。
我应该考虑添加服务器层并通过服务器执行每一次更新吗?或者我的方法完全错误(或数据结构?)。添加服务器层几乎可以解决每个验证问题,但也会增加一个故障点,所以我试图避免这种情况。
修改
更新功能
function vote(postID: string, answerID: string, author: string, oldVal: number, newVal: number): firebase.Promise<void> {
let voteValue: number = newVal == 0 ? null : newVal; // -1, 0, 1, could be changed to boolean
return this.ref.child(`users/${author}/votes`).once('value', count => {
let updates = {};
updates[`votes/${postID}/${answerID}/${this.authService.current.$key}`] = voteValue;
if (voteValue == 1) {
updates[`users/${author}/votes/up`] = ++count.val().up;
if (oldVal == -1) {
updates[`users/${author}/votes/down`] = --count.val().down;
}
}
if (voteValue == -1) {
updates[`users/${author}/votes/down`] = ++count.val().down;
if (oldVal == 1) {
updates[`users/${author}/votes/up`] = --count.val().up;
}
}
if (voteValue == null && oldVal == -1) {
updates[`users/${author}/votes/down`] = --count.val().down;
}
if (voteValue == null && oldVal == 1) {
updates[`users/${author}/votes/up`] = --count.val().up;
}
this.ref.update(updates);
});
}
如果答案作者的当前投票数为0/0且另一位用户赞成其中一个答案,则会创建如下更新:
"votes/-KM0CMCIQuBsGWQAjhRQ/-KM0CVmhK_7JQcxtdixl/fxpxj1Ky4yVpEeeB5PZviMjqNZv1": 1
"users/spAnCEKTTjX1GgdybQZIlXRI9IG2/votes/up": 1