喜欢/不喜欢Firebase的功能

时间:2018-01-17 11:27:55

标签: firebase 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

同样不喜欢。但对于如此小的功能,这听起来真的很复杂。也许有可能在用户/投票的情况下挥动额外的收藏而不会失去这种安全级别?或者使用http-triggers可以帮助解决这个问题?对于某些类似PHP的语言,这个功能会容易得多,所以我现在吓坏了。

2 个答案:

答案 0 :(得分:5)

以下是我的假设。

  1. 您有一个具有唯一ID的帖子,我们称之为post_id
  2. 您的用户拥有唯一ID,请将其称为user_id
  3. 有3种有效状态:(未定义),(喜欢),(不喜欢)
  4. 基本流程如下

    要存储喜欢/不喜欢的内容,您需要创建一个名为feelings的集合,该集合使用post_id +':' + user_id作为其文档id(这样可以很容易查找)。

    feelings中的文档有一个名为state的字段,其中存储-1表示不喜欢,1表示不喜欢。

    正如您所提到的,您可以简单地将此值设置或覆盖到用户期望的任何值。如果他们决定消除他们的感觉'并且不喜欢或不喜欢发出删除命令(这比写入状态设置为0更便宜。)

    使用云功能收听feelings集合,并根据此状态的更改(或创建/删除)更新帖子文档,例如/ dislike count。

    安全规则可以强制执行只允许-11的状态,如果您使用的是Firebase身份验证,则可以轻松强制执行仅允许匹配user_id的用户能改变状态。

    你现在有什么?

    您现在拥有一个具有以下属性的系统:

    • 用户可以喜欢和不喜欢帖子
    • 用户可以移除和/或更改他们的喜欢/不喜欢
    • 用户只能喜欢或不喜欢一个帖子 - 他们不能多次这样做
    • 只能将有效状态(例如,不喜欢)写入数据库
    • 只有用户可以更新喜欢/不喜欢
    • 可扩展:无论是10个帖子,还是数百万个帖子,此系统都可以使用

    奖金积分

    使用您注册更新计数的相同Cloud Functions事件,您还可以使用此事件在like和dislike数组中添加或删除用户ID列表。这样您就可以列出喜欢或不喜欢帖子的用户,而无需查询feelings集合中的每个单独文档

    另外请记住,Cloud Functions对单个事件的触发次数不大。如果您希望保证计数的准确性,请使代码具有幂等性,或者只是手动触发“重新计算”。如果您或某个用户​​检测到计数似乎不合适,您可以触发该过程。

答案 1 :(得分:0)

如果有人想知道实时数据库!

enter image description here

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
                            });
                        });
                
            }
        });