系统本身很容易理解,但实施起来很棘手。此外,安全原因使我想到如何做到这一点。
我正在考虑让函数在前端firebase脚本中运行,只需执行所有操作,检查此用户是否已发布喜欢/不喜欢,并在用户单击时删除/添加/切换。问题在于这种方法的安全性:用户不能创建一个新的功能,不会检查是否发布了这样的功能?
如果可能的话,该系统应如何运作?现在我的逻辑:
Clicked like:
locally activate/deactivate like button and remove dislike active class if on
check docs for this user/doc like
`1`? -> remove this doc from collection
`0`? -> switch to `1`, because `0` is dislike
`undefined`? -> create doc with `vote: 1`
change (+1/-1 or +2/-2) the value of post votes fields
同样不喜欢。但对于如此小的功能,这听起来真的很复杂。也许有可能在用户/投票的情况下挥动额外的收藏而不会失去这种安全级别?或者使用http-triggers可以帮助解决这个问题?对于某些类似PHP的语言,这个功能会容易得多,所以我现在吓坏了。
答案 0 :(得分:5)
post_id
user_id
要存储喜欢/不喜欢的内容,您需要创建一个名为feelings
的集合,该集合使用post_id
+':' + user_id
作为其文档id(这样可以很容易查找)。
feelings
中的文档有一个名为state
的字段,其中存储-1
表示不喜欢,1
表示不喜欢。
正如您所提到的,您可以简单地将此值设置或覆盖到用户期望的任何值。如果他们决定消除他们的感觉'并且不喜欢或不喜欢发出删除命令(这比写入状态设置为0更便宜。)
使用云功能收听feelings
集合,并根据此状态的更改(或创建/删除)更新帖子文档,例如/ dislike count。
安全规则可以强制执行只允许-1
和1
的状态,如果您使用的是Firebase身份验证,则可以轻松强制执行仅允许匹配user_id
的用户能改变状态。
您现在拥有一个具有以下属性的系统:
使用您注册更新计数的相同Cloud Functions事件,您还可以使用此事件在like和dislike数组中添加或删除用户ID列表。这样您就可以列出喜欢或不喜欢帖子的用户,而无需查询feelings
集合中的每个单独文档
另外请记住,Cloud Functions对单个事件的触发次数不大。如果您希望保证计数的准确性,请使代码具有幂等性,或者只是手动触发“重新计算”。如果您或某个用户检测到计数似乎不合适,您可以触发该过程。
答案 1 :(得分:0)
如果有人想知道实时数据库!
var ref = firebase.database().ref(selectchapter + questionId + user_id);
ref.once("value", function (snapshot) {
var exists = snapshot.val() !== null;
if (!exists) {
firebase
.database()
.ref(
selectchapter +
questionId + user_id
)
.set({
status: 1
}).then(function () {
firebase.database().ref(q +
questionId + "likes").transaction(function (likes) {
return (likes || 0) + 1
});
});
}
});