如果帖子仅是关注者,如何实现仅关注者才能看到帖子的功能?

时间:2019-06-03 11:33:07

标签: flutter google-cloud-firestore firebase-security-rules

我正在尝试在博客应用中实现一项功能,用户可以在其中发布“仅关注者”帖子。如果仅关注者,则只有关注者可以看到该帖子,否则,每个人都可以看到它。目前,我提出了一个解决方案,但是如果它是一种有效的方法,例如在数据库的安全规则中执行此操作,那么我就不会这样做。我不知道在数据库规则中编写函数。

我试图通过在源代码本身中添加一条带有if-else语句的规则来实现此功能。

Future _checkFollowing() async {
    List<DocumentSnapshot> _checkFollow = [];
    Query q = Firestore.instance
        .collection('user')
        .document(ownerId)
        .collection('followers')
        .where('profileId', isEqualTo: uid);

    QuerySnapshot querySnapshot = await q.getDocuments();
    _checkFollow = querySnapshot.documents;
    if (_checkFollow.length == 1) {
      setState(() {
        isFollowing = true;
      });
    } else if (_checkFollow.length == 0) {
      setState(() {
        isFollowing = false;
      });
    }
  }
if (followersOnlyPost) {
   if (isFollowing) {
      return buildPost();
    } else if (!isFollowing) {
      return null;
    }
 } else if (!followersOnlyPost) {
    return buildPost();     
 }

我对数据库中的每个用户都有一个followers子集合。 一个帖子集合,其中每个帖子中都有一个followers-only布尔字段。 这就是我创建帖子文档的方式

Firestore.instance.runTransaction((transaction) {
      var reference = Firestore.instance.collection('all_posts');

      reference.add({
        'timestamp': DateTime.now(),
        'likes': {},
        'followersOnly': false,
        'bookmarks': {},
        'likesCount': 0,
        'ownerId': uid,
      }).then((DocumentReference doc) {
        String docId = doc.documentID;
        reference.document(docId).updateData({"postId": docId});});

我的代码可以实现我想要的功能,但是对于每个帖子,都会调用函数_checkFollowing,因此,每个帖子都将其视为1读取。 由于Feed中会有很多帖子,因此会导致大量的阅读计数。

我也想实现块功能,但是我还没有实现,因为我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

我要做的是在加载应用程序时检查用户的关注对象(如果有互联网连接),并将其存储在sqlite数据库中。然后,当它检查帖子是否为“仅关注者”时,您可以从sqlite数据库中进行本地检查,而不必调用数据库。这种方法意味着每次打开应用程序时,您只会得到一个数据库调用。