diff --git a/packages/dart_client/lib/src/db/chat_persistence_client.dart b/packages/dart_client/lib/src/db/chat_persistence_client.dart index 19a9164e..070bf37f 100644 --- a/packages/dart_client/lib/src/db/chat_persistence_client.dart +++ b/packages/dart_client/lib/src/db/chat_persistence_client.dart @@ -129,6 +129,12 @@ abstract class ChatPersistenceClient { /// Future updateReactions(List reactions); + /// + Future deleteReactionsByMessageId(List messageIds); + + /// + Future deleteMembersByCids(List cids); + /// Future updateChannelState(ChannelState channelState) { return updateChannelStates([channelState]); @@ -181,13 +187,26 @@ abstract class ChatPersistenceClient { return updateMembers(cid, members.toList(growable: false)); }).toList(growable: false); + final deleteReactions = deleteReactionsByMessageId(channelStates + .expand((it) => it.messages) + .map((m) => m.id) + .toList(growable: false)); + + final deleteMembers = deleteMembersByCids( + channelStates.map((it) => it.channel.cid).toList(growable: false), + ); + + await Future.wait([ + deleteReactions, + deleteMembers, + ]); await Future.wait([ ...updateMessagesFuture, ...updateReadsFuture, ...updateMembersFuture, + updateUsers(users.toList(growable: false)), updateChannels(channels.toList(growable: false)), updateReactions(reactions.toList(growable: false)), - updateUsers(users.toList(growable: false)), ]); } } diff --git a/packages/stream_chat_persistence/lib/src/dao/member_dao.dart b/packages/stream_chat_persistence/lib/src/dao/member_dao.dart index c535af9a..ed30a931 100644 --- a/packages/stream_chat_persistence/lib/src/dao/member_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/member_dao.dart @@ -16,7 +16,7 @@ class MemberDao extends DatabaseAccessor /// Creates a new member dao instance MemberDao(MoorChatDatabase db) : super(db); - /// Get all members where [members.channelCid] matches [cid] + /// Get all members where [Members.channelCid] matches [cid] Future> getMembersByCid(String cid) async { return (select(members).join([ leftOuterJoin(users, members.userId.equalsExp(users.id)), @@ -40,4 +40,14 @@ class MemberDao extends DatabaseAccessor ), ); } + + /// Deletes all the members whose [Members.channelCid] is present in [cids] + Future deleteMemberByCids(List cids) async { + return batch((it) { + it.deleteWhere( + members, + (m) => m.channelCid.isIn(cids), + ); + }); + } } diff --git a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart index 57aa055d..8acdbfd4 100644 --- a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart @@ -16,7 +16,7 @@ class MessageDao extends DatabaseAccessor final MoorChatDatabase _db; - /// Removes all the messages by matching [messages.id] in [messageIds] + /// Removes all the messages by matching [Messages.id] in [messageIds] /// /// This will automatically delete the following linked records /// 1. Message Reactions @@ -24,7 +24,7 @@ class MessageDao extends DatabaseAccessor return (delete(messages)..where((tbl) => tbl.id.isIn(messageIds))).go(); } - /// Removes all the messages by matching [messages.channelCid] in [cids] + /// Removes all the messages by matching [Messages.channelCid] in [cids] /// /// This will automatically delete the following linked records /// 1. Message Reactions @@ -52,7 +52,7 @@ class MessageDao extends DatabaseAccessor ); } - /// Returns a single message by matching the [messages.id] with [id] + /// Returns a single message by matching the [Messages.id] with [id] Future getMessageById(String id) async { return await (select(messages).join([ leftOuterJoin(users, messages.userId.equalsExp(users.id)), @@ -63,7 +63,7 @@ class MessageDao extends DatabaseAccessor } /// Returns all the messages of a particular thread by matching - /// [messages.channelCid] with [cid] + /// [Messages.channelCid] with [cid] Future> getThreadMessages(String cid) async { return Future.wait(await (select(messages).join([ leftOuterJoin(users, messages.userId.equalsExp(users.id)), @@ -76,7 +76,7 @@ class MessageDao extends DatabaseAccessor } /// Returns all the messages of a particular thread by matching - /// [messages.parentId] with [parentId] + /// [Messages.parentId] with [parentId] Future> getThreadMessagesByParentId( String parentId, { PaginationParams options, @@ -97,7 +97,7 @@ class MessageDao extends DatabaseAccessor } /// Returns all the messages of a channel by matching - /// [messages.channelCid] with [parentId] + /// [Messages.channelCid] with [parentId] Future> getMessagesByCid( String cid, { PaginationParams messagePagination, diff --git a/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart b/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart index 249bd011..99053fca 100644 --- a/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart @@ -15,7 +15,7 @@ class ReactionDao extends DatabaseAccessor ReactionDao(MoorChatDatabase db) : super(db); /// Returns all the reactions of a particular message by matching - /// [reactions.messageId] with [messageId] + /// [Reactions.messageId] with [messageId] Future> getReactions(String messageId) { return (select(reactions).join([ leftOuterJoin(users, reactions.userId.equalsExp(users.id)), @@ -31,8 +31,8 @@ class ReactionDao extends DatabaseAccessor /// Returns all the reactions of a particular message /// added by a particular user by matching - /// [reactions.messageId] with [messageId] and - /// [reactions.userId] with [userId] + /// [Reactions.messageId] with [messageId] and + /// [Reactions.userId] with [userId] Future> getReactionsByUserId( String messageId, String userId, @@ -51,4 +51,14 @@ class ReactionDao extends DatabaseAccessor ); }); } + + /// Deletes all the reactions whose [Reactions.messageId] is present in [messageIds] + Future deleteReactionsByMessageIds(List messageIds) { + return batch((it) { + it.deleteWhere( + reactions, + (r) => r.messageId.isIn(messageIds), + ); + }); + } } diff --git a/packages/stream_chat_persistence/lib/src/dao/read_dao.dart b/packages/stream_chat_persistence/lib/src/dao/read_dao.dart index 00af6b6d..c78cab07 100644 --- a/packages/stream_chat_persistence/lib/src/dao/read_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/read_dao.dart @@ -13,7 +13,7 @@ class ReadDao extends DatabaseAccessor with _$ReadDaoMixin { /// Creates a new read dao instance ReadDao(MoorChatDatabase db) : super(db); - /// Get all reads where [reads.channelCid] matches [cid] + /// Get all reads where [Reads.channelCid] matches [cid] Future> getReadsByCid(String cid) async { return (select(reads).join([ leftOuterJoin(users, reads.userId.equalsExp(users.id)), diff --git a/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart b/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart index d36ed1b2..ebad74f8 100644 --- a/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart +++ b/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart @@ -193,6 +193,16 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { return _db.userDao.updateUsers(users); } + @override + Future deleteReactionsByMessageId(List messageIds) { + return _db.reactionDao.deleteReactionsByMessageIds(messageIds); + } + + @override + Future deleteMembersByCids(List cids) { + return _db.memberDao.deleteMemberByCids(cids); + } + @override Future disconnect({bool flush = false}) async { if (_db != null) {