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