import 'package:moor/moor.dart'; import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/members.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'member_dao.g.dart'; /// The Data Access Object for operations in [Members] table. @UseDao(tables: [Members, Users]) class MemberDao extends DatabaseAccessor with _$MemberDaoMixin { /// Creates a new member dao instance MemberDao(MoorChatDatabase db) : super(db); /// Get all members where [Members.channelCid] matches [cid] Future> getMembersByCid(String cid) async => (select(members).join([ leftOuterJoin(users, members.userId.equalsExp(users.id)), ]) ..where(members.channelCid.equals(cid)) ..orderBy([OrderingTerm.asc(members.createdAt)])) .map((row) { final userEntity = row.readTable(users); final memberEntity = row.readTable(members); return memberEntity.toMember(user: userEntity.toUser()); }).get(); /// Updates all the members using the new [memberList] data Future updateMembers(String cid, List memberList) => bulkUpdateMembers({cid: memberList}); /// Bulk updates the members data of multiple channels Future bulkUpdateMembers(Map> channelWithMembers) { final entities = channelWithMembers.entries .map((entry) => entry.value.map( (member) => member.toEntity(cid: entry.key), )) .expand((it) => it) .toList(growable: false); return batch((batch) => batch.insertAllOnConflictUpdate(members, entities)); } /// Deletes all the members whose [Members.channelCid] is present in [cids] Future deleteMemberByCids(List cids) async => batch((it) { it.deleteWhere( members, (m) => m.channelCid.isIn(cids), ); }); }