在Firebase中实现删除tweet和like/upvote功能

Implementing remove tweet and like/upvote functionality in Firebase

本文关键字:like upvote 功能 tweet Firebase 实现 删除      更新时间:2023-09-26

继续这个话题,在HN: https://news.ycombinator.com/item?id=5462769

通读firefeed规则文件回答了我很多问题,除了这两个:

  1. 不允许编辑现有的推文("。写":"! data.exists()")。你怎样才能使它不可编辑,但可以被作者删除?
  2. 你如何安全地处理喜欢/不喜欢或赞成/反对?如果用户之前没有修改过这个,那么在验证时写入,验证增加/减少1 ?这怎么可能呢?会有编辑这个的人的子列表吗?我只是对这个特定的用例很好奇,因为它在许多应用程序中似乎很常见,但在我看来,在firebase中实现起来真的很复杂吗?

1。不可编辑但可被作者删除

".write": "!data.exists() || (!newData.exists() && data.child('author') === auth.id)"

2。喜欢/Upvoting

在客户端,使用一个允许你安全地增加值的事务:

ref.transaction(function(currentValue) {
   return (currentValue||0)+1;
}, function(error) {
   if( error ) /* failed too many times */
   else /* it worked */
});

安全性也很简单:

".validate": "newData.isNumber() && newData.val() === data.val()+1"

2.5确保唯一投票

我不确定这是什么意思;这些记录不能被编辑,如果可以的话,大概也只有作者能这样做;所以我真的不理解"modified"在这个上下文中的意思:"如果用户以前没有修改过这个?"这怎么可能呢?"

为了确保投票是唯一的,您只需按用户ID存储它们。用户可以通过删除记录来删除他们的投票。

我建议将它们存储在一个单独的路径中,而不是火花,并且仍然保持一个简单的增量(正在被投票的消息),因为您不想每次获取火花时都必须检索整个选民列表。

安全规则看起来像这样:

"votes": {
    "$spark_id": {
       "$vote": {
          ".read": "$vote === auth.id",
          ".write": "$vote === auth.id", 
          // to allow downvoting in addition to up or delete, just add -1 here
          ".validate": "newData.val() === 1 || newData.val() === null"
       }
    }
}

现在为增量的验证规则添加一个检查:

".validate": "!root.child('votes').child($spark_id).child(auth.id).exists() && newData.isNumber() && newData.val() === data.val()+1"

现在Firebase Functions已经向公众发布了(测试版),这似乎是一个不错的选择:https://firebase.googleblog.com/2017/03/introducing-cloud-functions-for-firebase.html

这个想法是允许每个用户通过键将他们的名字添加到推文的"upvoters"集合中。他们可以创建或删除他们的条目——但是只能有一个,因为它是按密钥的,安全规则只允许控制他们的一个密钥。

当查找"upvote count"发生时,客户端可以获得upvoters的完整列表并计数。但是,为了性能起见,我们创建了一个Firebase Function,每当添加或删除upvote条目时都会触发该函数。

它所做的就是增加或减少推特上的"upvote count"属性。这与之前相同,除了我们制定了只允许云托管函数修改此字段的安全规则。因此,修改始终是可信和安全的,并且消除了客户机接收upvoters列表以获取upvote-count的需要。