Как реализовать функцию, позволяющую просматривать сообщения только подписчикам, если запись только подписчикам? - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь реализовать функцию в своем приложении блога, где пользователи могут сделать пост "только для подписчиков". Если это только подписчики, то пост может видеть только подписчик, а если нет, то все могут его видеть. На данный момент я принял решение, но я не знаю, насколько это эффективно, как делать это в правилах безопасности моей базы данных. Я понятия не имею, написание функции в правилах базы данных.

Я попытался реализовать эту функцию, добавив правило в самом исходном коде с помощью оператора 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 прочитанная в каждом посте. Поскольку в ленте будет много постов, это приведет к большому количеству прочитанных сообщений.

Также я хочу реализовать функцию блокировки, но я не работал над этим, потому что понятия не имею, как это сделать.

1 Ответ

0 голосов
/ 03 июня 2019

Что я хотел бы сделать, это проверить, за кем следует пользователь при загрузке приложения (если есть подключение к Интернету) и сохранить его в базе данных sqlite.Затем, когда он проверяет, является ли сообщение «Только для подписчиков», вы можете проверить из базы данных sqlite локально, без необходимости вызывать базу данных.Этот метод будет означать, что вы будете получать только один вызов базы данных при каждом открытии приложения.

...