Tel*_*ion 2 database data-modeling firebase google-cloud-platform google-cloud-firestore
该系统本身很容易理解,但难以实现。而且,出于安全原因,我开始思考如何做到这一点。
我当时想让该功能在前端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
Run Code Online (Sandbox Code Playgroud)
一样不喜欢。但是对于这么小的功能,听起来确实很复杂。也许可以在不失去安全级别的情况下,通过用户/投票来进行额外的收集?还是使用http-triggers可以在某种程度上帮助您?在某些类似PHP的语言上,此功能会容易得多,所以我现在很害怕。
post_iduser_id要存储喜欢/不喜欢,您创建一个名为的集合,该集合feelings使用post_id+':'+ user_id作为其文档ID(这使查找起来很容易)。
文档中feelings有一个称为的字段,用于state存储-1“不喜欢”,1“喜欢”。
正如您提到的,您可以简单地将此值设置或覆盖为用户所需的值。如果他们决定删除自己的“感觉”并且不喜欢或不喜欢,则发出删除命令(这比进行将状态设置为0的写操作便宜)。
使用Cloud Functions可以侦听feelings集合并根据此状态如何更改(或创建/删除)来更新帖子文档的喜欢/不喜欢计数。
安全规则只能强制执行-1和的状态1,如果您使用的是Firebase Auth,则可以强制实施仅允许用户匹配的user_id状态更改。
您现在拥有一个具有以下属性的系统:
使用您注册的同一Cloud Functions事件更新计数,您还可以使用此事件在“喜欢”和“不喜欢”数组中的用户ID列表中添加或删除。这样一来,您就可以列出喜欢或不喜欢该帖子的用户,而不必查询feelings集合中的每个文档
还请记住,Cloud Functions具有很小的机会针对单个事件多次触发。如果您希望保证计数准确,可以使代码幂等,也可以只是进行手动触发的“重新计数”过程,如果您或用户检测到计数似乎相差一倍,则可以触发该计数。
| 归档时间: |
|
| 查看次数: |
1208 次 |
| 最近记录: |