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/reads.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'read_dao.g.dart'; /// The Data Access Object for operations in [Reads] table. @UseDao(tables: [Reads, Users]) 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] Future> getReadsByCid(String cid) async => (select(reads).join([ leftOuterJoin(users, reads.userId.equalsExp(users.id)), ]) ..where(reads.channelCid.equals(cid)) ..orderBy([ OrderingTerm.asc(reads.lastRead), ])) .map((row) { final userEntity = row.readTable(users); final readEntity = row.readTable(reads); return readEntity.toRead(user: userEntity.toUser()); }).get(); /// Updates the read data of a particular channel with /// the new [readList] data Future updateReads(String cid, List readList) => bulkUpdateReads({cid: readList}); /// Bulk updates the reads data of multiple channels Future bulkUpdateReads(Map> channelWithReads) { final entities = channelWithReads.entries .map((entry) => entry.value.map( (read) => read.toEntity(cid: entry.key), )) .expand((it) => it) .toList(growable: false); return batch((batch) => batch.insertAllOnConflictUpdate(reads, entities)); } }