Firebase多位置更新验证

时间:2016-07-07 21:52:29

标签: firebase firebase-realtime-database firebase-security

我很难弄清楚如何验证更新相互依赖的多位置更新。

考虑以下结构:

"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

0 个答案:

没有答案