在Firebase中实现删除tweet和like/upvote功能
Implementing remove tweet and like/upvote functionality in Firebase
继续这个话题,在HN: https://news.ycombinator.com/item?id=5462769
通读firefeed规则文件回答了我很多问题,除了这两个:
- 不允许编辑现有的推文("。写":"! data.exists()")。你怎样才能使它不可编辑,但可以被作者删除?
- 你如何安全地处理喜欢/不喜欢或赞成/反对?如果用户之前没有修改过这个,那么在验证时写入,验证增加/减少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确保唯一投票
为了确保投票是唯一的,您只需按用户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的需要。
- 使用指令的angular js中的Like和different
- 我有可能防止黑客使用网络控制台用JavaScript重复调用upvote(AJAX)函数吗
- 如何忽略单词like“”中的未使用空格;测试-文本”;同时构建html标签
- 禁用facebook在like按钮启动edge.create事件
- 将所有带有 id like 的元素放入数组中
- Facebook Like Box在Rails 4中刷新之前不会显示
- 在Backbone.js中用param-like:id指定根url并能够访问它
- 按文本数组选择下拉值,其中%like%jQuery
- 正在使用LIKE safe从SQL注入构建查询
- Like Unlike toggle button with jQuery's AJAX
- 更改Facebook Like Code中的URL
- 如何获得Facebook Like Box"黑暗方案”;正确工作?(背景是透明的.)
- Open docx Sharepoint LIke
- Facebook Like Box获胜;t出现(引导程序)
- 检测何时加载Facebook Like Button
- 使用内置的 like 操作 (og.likes) 检查当前用户是否喜欢某个 URL
- 如何在Sheetrock中使用LIKE运算符
- Momen.js Instagram like日期格式
- 在切换按钮中间找到元素[Upvote/Downvote/unvote like SO]
- 在Firebase中实现删除tweet和like/upvote功能