diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 791927e40..1374395ba 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,5 +1,9 @@ ## Upcoming +✅ Added + +- Added support for `Channel.messageCount` field. + 🐞 Fixed - Fixed `ChannelState.memberCount`, `ChannelState.config` and `ChannelState.extraData` getting reset diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 22e4a8c04..7e4e46e65 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -416,6 +416,24 @@ class Channel { return state!.channelStateStream.map((cs) => cs.channel?.memberCount); } + /// Channel message count. + /// + /// Note: This field is only populated if the `count_messages` option is + /// enabled for your app. + int? get messageCount { + _checkInitialized(); + return state!._channelState.channel?.messageCount; + } + + /// Channel message count as a stream. + /// + /// Note: This field is only populated if the `count_messages` option is + /// enabled for your app. + Stream get messageCountStream { + _checkInitialized(); + return state!.channelStateStream.map((cs) => cs.channel?.messageCount); + } + /// Channel id. String? get id => state?._channelState.channel?.id ?? _id; @@ -2165,6 +2183,8 @@ class ChannelClientState { _listenChannelUpdated(); + _listenChannelMessageCount(); + _listenMemberAdded(); _listenMemberRemoved(); @@ -2334,6 +2354,23 @@ class ChannelClientState { })); } + void _listenChannelMessageCount() { + _subscriptions.add(_channel.on().listen( + (Event e) { + final messageCount = e.channelMessageCount; + if (messageCount == null) return; + + updateChannelState( + channelState.copyWith( + channel: channelState.channel?.copyWith( + messageCount: messageCount, + ), + ), + ); + }, + )); + } + void _listenChannelTruncated() { _subscriptions.add(_channel .on(EventType.channelTruncated, EventType.notificationChannelTruncated) diff --git a/packages/stream_chat/lib/src/core/models/channel_model.dart b/packages/stream_chat/lib/src/core/models/channel_model.dart index d55f0e42b..8501a0bb4 100644 --- a/packages/stream_chat/lib/src/core/models/channel_model.dart +++ b/packages/stream_chat/lib/src/core/models/channel_model.dart @@ -31,6 +31,7 @@ class ChannelModel { bool? disabled, bool? hidden, DateTime? truncatedAt, + this.messageCount, }) : assert( (cid != null && cid.contains(':')) || (id != null && type != null), 'provide either a cid or an id and type', @@ -151,6 +152,13 @@ class ChannelModel { return null; } + /// The total number of messages in the channel. + /// + /// Note: This field is only populated if the `count_messages` option is + /// enabled for your app. + @JsonKey(includeToJson: false) + final int? messageCount; + /// Known top level fields. /// Useful for [Serializer] methods. static const topLevelFields = [ @@ -169,6 +177,7 @@ class ChannelModel { 'members', 'team', 'cooldown', + 'message_count', ]; /// Serialize to json @@ -197,6 +206,7 @@ class ChannelModel { bool? disabled, bool? hidden, DateTime? truncatedAt, + int? messageCount, }) => ChannelModel( id: id ?? this.id, @@ -223,6 +233,7 @@ class ChannelModel { // ignore: cast_nullable_to_non_nullable : DateTime.parse(extraData?['truncated_at'] as String)) ?? this.truncatedAt, + messageCount: messageCount ?? this.messageCount, ); /// Returns a new [ChannelModel] that is a combination of this channelModel @@ -249,6 +260,7 @@ class ChannelModel { disabled: other.disabled, hidden: other.hidden, truncatedAt: other.truncatedAt, + messageCount: other.messageCount, ); } } diff --git a/packages/stream_chat/lib/src/core/models/channel_model.g.dart b/packages/stream_chat/lib/src/core/models/channel_model.g.dart index eff3bad62..119cff0ad 100644 --- a/packages/stream_chat/lib/src/core/models/channel_model.g.dart +++ b/packages/stream_chat/lib/src/core/models/channel_model.g.dart @@ -39,6 +39,7 @@ ChannelModel _$ChannelModelFromJson(Map json) => ChannelModel( extraData: json['extra_data'] as Map? ?? const {}, team: json['team'] as String?, cooldown: (json['cooldown'] as num?)?.toInt() ?? 0, + messageCount: (json['message_count'] as num?)?.toInt(), ); Map _$ChannelModelToJson(ChannelModel instance) => diff --git a/packages/stream_chat/lib/src/core/models/event.dart b/packages/stream_chat/lib/src/core/models/event.dart index 75e0211b4..8e2733a3b 100644 --- a/packages/stream_chat/lib/src/core/models/event.dart +++ b/packages/stream_chat/lib/src/core/models/event.dart @@ -43,6 +43,7 @@ class Event { this.reminder, this.pushPreference, this.channelPushPreference, + this.channelMessageCount, this.extraData = const {}, this.isLocal = true, }) : createdAt = createdAt?.toUtc() ?? DateTime.now().toUtc(); @@ -162,6 +163,9 @@ class Event { /// Push notification preferences for the current user for this channel. final ChannelPushPreference? channelPushPreference; + /// The total number of messages in the channel. + final int? channelMessageCount; + /// Map of custom channel extraData final Map extraData; @@ -203,6 +207,7 @@ class Event { 'reminder', 'push_preference', 'channel_push_preference', + 'channel_message_count', ]; /// Serialize to json @@ -246,6 +251,7 @@ class Event { MessageReminder? reminder, PushPreference? pushPreference, ChannelPushPreference? channelPushPreference, + int? channelMessageCount, Map? extraData, }) => Event( @@ -284,6 +290,7 @@ class Event { pushPreference: pushPreference ?? this.pushPreference, channelPushPreference: channelPushPreference ?? this.channelPushPreference, + channelMessageCount: channelMessageCount ?? this.channelMessageCount, isLocal: isLocal, extraData: extraData ?? this.extraData, ); diff --git a/packages/stream_chat/lib/src/core/models/event.g.dart b/packages/stream_chat/lib/src/core/models/event.g.dart index 1623dc143..66b5b5bd0 100644 --- a/packages/stream_chat/lib/src/core/models/event.g.dart +++ b/packages/stream_chat/lib/src/core/models/event.g.dart @@ -76,6 +76,7 @@ Event _$EventFromJson(Map json) => Event( ? null : ChannelPushPreference.fromJson( json['channel_push_preference'] as Map), + channelMessageCount: (json['channel_message_count'] as num?)?.toInt(), extraData: json['extra_data'] as Map? ?? const {}, isLocal: json['is_local'] as bool? ?? false, ); @@ -124,6 +125,8 @@ Map _$EventToJson(Event instance) => { 'push_preference': value, if (instance.channelPushPreference?.toJson() case final value?) 'channel_push_preference': value, + if (instance.channelMessageCount case final value?) + 'channel_message_count': value, 'extra_data': instance.extraData, }; diff --git a/packages/stream_chat/test/src/client/channel_test.dart b/packages/stream_chat/test/src/client/channel_test.dart index 8034264ae..de680785a 100644 --- a/packages/stream_chat/test/src/client/channel_test.dart +++ b/packages/stream_chat/test/src/client/channel_test.dart @@ -5637,5 +5637,165 @@ void main() { }, ); }); + + group('Channel message count events', () { + const channelId = 'test-channel-id'; + const channelType = 'test-channel-type'; + late Channel channel; + + setUp(() { + final channelState = _generateChannelState(channelId, channelType); + channel = Channel.fromState(client, channelState); + }); + + tearDown(() { + channel.dispose(); + }); + + test( + 'should update channel messageCount when event contains channelMessageCount', + () async { + // Verify initial state - no messageCount + expect(channel.messageCount, isNull); + + // Create event with channelMessageCount + final messageCountEvent = Event( + cid: channel.cid, + type: EventType.messageNew, + channelMessageCount: 42, + ); + + // Dispatch event + client.addEvent(messageCountEvent); + + // Wait for the event to be processed + await Future.delayed(Duration.zero); + + // Verify channel messageCount was updated + expect(channel.messageCount, equals(42)); + }, + ); + + test( + 'should update channel messageCount from message.new and message.deleted events', + () async { + // Test with message.new event - count increases + final messageNewEvent = Event( + cid: channel.cid, + type: EventType.messageNew, + message: Message( + id: 'new-message-1', + text: 'Hello world!', + user: User(id: 'user-1'), + ), + channelMessageCount: 1, + ); + + client.addEvent(messageNewEvent); + await Future.delayed(Duration.zero); + expect(channel.messageCount, equals(1)); + + // Test with another message.new event - count increases + final messageNewEvent2 = Event( + cid: channel.cid, + type: EventType.messageNew, + message: Message( + id: 'new-message-2', + text: 'Second message', + user: User(id: 'user-2'), + ), + channelMessageCount: 2, + ); + + client.addEvent(messageNewEvent2); + await Future.delayed(Duration.zero); + expect(channel.messageCount, equals(2)); + + // Test with message.deleted event - count decreases + final messageDeletedEvent = Event( + cid: channel.cid, + type: EventType.messageDeleted, + message: Message( + id: 'new-message-1', + text: 'Hello world!', + user: User(id: 'user-1'), + ), + channelMessageCount: 1, + ); + + client.addEvent(messageDeletedEvent); + await Future.delayed(Duration.zero); + expect(channel.messageCount, equals(1)); + }, + ); + + test( + 'should preserve other channel properties when updating messageCount', + () async { + // Set initial channel state with some properties + final initialChannel = channel.state?.channelState.channel?.copyWith( + extraData: {'name': 'Test Channel'}, + memberCount: 5, + frozen: true, + ); + + if (initialChannel != null) { + channel.state?.updateChannelState( + channel.state!.channelState.copyWith(channel: initialChannel), + ); + } + + // Verify initial state + expect(channel.name, 'Test Channel'); + expect(channel.memberCount, equals(5)); + expect(channel.frozen, equals(true)); + expect(channel.messageCount, isNull); + + // Update messageCount via event + final messageCountEvent = Event( + cid: channel.cid, + type: EventType.messageNew, + channelMessageCount: 100, + ); + + client.addEvent(messageCountEvent); + await Future.delayed(Duration.zero); + + // Verify messageCount was updated while preserving other properties + expect(channel.messageCount, equals(100)); + expect(channel.name, 'Test Channel'); + expect(channel.memberCount, equals(5)); + expect(channel.frozen, equals(true)); + }, + ); + + test( + 'should provide messageCountStream for reactive updates', + () async { + expectLater( + channel.messageCountStream.distinct(), + emitsInOrder([null, 1, 5, 10]), + ); + + // Update messageCount multiple times + final counts = [1, 5, 10]; + for (final count in counts) { + final event = Event( + cid: channel.cid, + type: EventType.messageNew, + message: Message( + id: 'msg-$count', + text: 'Message $count', + user: User(id: 'user-1'), + ), + channelMessageCount: count, + ); + + client.addEvent(event); + await Future.delayed(Duration.zero); + } + }, + ); + }); }); } diff --git a/packages/stream_chat_persistence/CHANGELOG.md b/packages/stream_chat_persistence/CHANGELOG.md index 071895d6e..8d343e8a1 100644 --- a/packages/stream_chat_persistence/CHANGELOG.md +++ b/packages/stream_chat_persistence/CHANGELOG.md @@ -1,3 +1,7 @@ +## Upcoming + +- Added support for `Channel.messageCount` field. + ## 9.17.0 - Updated `stream_chat` dependency to [`9.17.0`](https://pub.dev/packages/stream_chat/changelog). diff --git a/packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart b/packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart index 5dc89d8a7..e7f4bd141 100644 --- a/packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart +++ b/packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart @@ -55,7 +55,7 @@ class DriftChatDatabase extends _$DriftChatDatabase { // you should bump this number whenever you change or add a table definition. @override - int get schemaVersion => 23; + int get schemaVersion => 24; @override MigrationStrategy get migration => MigrationStrategy( diff --git a/packages/stream_chat_persistence/lib/src/db/drift_chat_database.g.dart b/packages/stream_chat_persistence/lib/src/db/drift_chat_database.g.dart index 15faa9ab6..61174cd02 100644 --- a/packages/stream_chat_persistence/lib/src/db/drift_chat_database.g.dart +++ b/packages/stream_chat_persistence/lib/src/db/drift_chat_database.g.dart @@ -81,6 +81,12 @@ class $ChannelsTable extends Channels type: DriftSqlType.int, requiredDuringInsert: false, defaultValue: const Constant(0)); + static const VerificationMeta _messageCountMeta = + const VerificationMeta('messageCount'); + @override + late final GeneratedColumn messageCount = GeneratedColumn( + 'message_count', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); static const VerificationMeta _createdByIdMeta = const VerificationMeta('createdById'); @override @@ -106,6 +112,7 @@ class $ChannelsTable extends Channels updatedAt, deletedAt, memberCount, + messageCount, createdById, extraData ]; @@ -164,6 +171,12 @@ class $ChannelsTable extends Channels memberCount.isAcceptableOrUnknown( data['member_count']!, _memberCountMeta)); } + if (data.containsKey('message_count')) { + context.handle( + _messageCountMeta, + messageCount.isAcceptableOrUnknown( + data['message_count']!, _messageCountMeta)); + } if (data.containsKey('created_by_id')) { context.handle( _createdByIdMeta, @@ -203,6 +216,8 @@ class $ChannelsTable extends Channels .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), memberCount: attachedDatabase.typeMapping .read(DriftSqlType.int, data['${effectivePrefix}member_count'])!, + messageCount: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}message_count']), createdById: attachedDatabase.typeMapping .read(DriftSqlType.string, data['${effectivePrefix}created_by_id']), extraData: $ChannelsTable.$converterextraDatan.fromSql(attachedDatabase @@ -262,6 +277,9 @@ class ChannelEntity extends DataClass implements Insertable { /// The count of this channel members final int memberCount; + /// The count of messages in this channel + final int? messageCount; + /// The id of the user that created this channel final String? createdById; @@ -279,6 +297,7 @@ class ChannelEntity extends DataClass implements Insertable { required this.updatedAt, this.deletedAt, required this.memberCount, + this.messageCount, this.createdById, this.extraData}); @override @@ -305,6 +324,9 @@ class ChannelEntity extends DataClass implements Insertable { map['deleted_at'] = Variable(deletedAt); } map['member_count'] = Variable(memberCount); + if (!nullToAbsent || messageCount != null) { + map['message_count'] = Variable(messageCount); + } if (!nullToAbsent || createdById != null) { map['created_by_id'] = Variable(createdById); } @@ -331,6 +353,7 @@ class ChannelEntity extends DataClass implements Insertable { updatedAt: serializer.fromJson(json['updatedAt']), deletedAt: serializer.fromJson(json['deletedAt']), memberCount: serializer.fromJson(json['memberCount']), + messageCount: serializer.fromJson(json['messageCount']), createdById: serializer.fromJson(json['createdById']), extraData: serializer.fromJson?>(json['extraData']), ); @@ -350,6 +373,7 @@ class ChannelEntity extends DataClass implements Insertable { 'updatedAt': serializer.toJson(updatedAt), 'deletedAt': serializer.toJson(deletedAt), 'memberCount': serializer.toJson(memberCount), + 'messageCount': serializer.toJson(messageCount), 'createdById': serializer.toJson(createdById), 'extraData': serializer.toJson?>(extraData), }; @@ -367,6 +391,7 @@ class ChannelEntity extends DataClass implements Insertable { DateTime? updatedAt, Value deletedAt = const Value.absent(), int? memberCount, + Value messageCount = const Value.absent(), Value createdById = const Value.absent(), Value?> extraData = const Value.absent()}) => ChannelEntity( @@ -384,6 +409,8 @@ class ChannelEntity extends DataClass implements Insertable { updatedAt: updatedAt ?? this.updatedAt, deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, memberCount: memberCount ?? this.memberCount, + messageCount: + messageCount.present ? messageCount.value : this.messageCount, createdById: createdById.present ? createdById.value : this.createdById, extraData: extraData.present ? extraData.value : this.extraData, ); @@ -405,6 +432,9 @@ class ChannelEntity extends DataClass implements Insertable { deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, memberCount: data.memberCount.present ? data.memberCount.value : this.memberCount, + messageCount: data.messageCount.present + ? data.messageCount.value + : this.messageCount, createdById: data.createdById.present ? data.createdById.value : this.createdById, extraData: data.extraData.present ? data.extraData.value : this.extraData, @@ -425,6 +455,7 @@ class ChannelEntity extends DataClass implements Insertable { ..write('updatedAt: $updatedAt, ') ..write('deletedAt: $deletedAt, ') ..write('memberCount: $memberCount, ') + ..write('messageCount: $messageCount, ') ..write('createdById: $createdById, ') ..write('extraData: $extraData') ..write(')')) @@ -444,6 +475,7 @@ class ChannelEntity extends DataClass implements Insertable { updatedAt, deletedAt, memberCount, + messageCount, createdById, extraData); @override @@ -461,6 +493,7 @@ class ChannelEntity extends DataClass implements Insertable { other.updatedAt == this.updatedAt && other.deletedAt == this.deletedAt && other.memberCount == this.memberCount && + other.messageCount == this.messageCount && other.createdById == this.createdById && other.extraData == this.extraData); } @@ -477,6 +510,7 @@ class ChannelsCompanion extends UpdateCompanion { final Value updatedAt; final Value deletedAt; final Value memberCount; + final Value messageCount; final Value createdById; final Value?> extraData; final Value rowid; @@ -492,6 +526,7 @@ class ChannelsCompanion extends UpdateCompanion { this.updatedAt = const Value.absent(), this.deletedAt = const Value.absent(), this.memberCount = const Value.absent(), + this.messageCount = const Value.absent(), this.createdById = const Value.absent(), this.extraData = const Value.absent(), this.rowid = const Value.absent(), @@ -508,6 +543,7 @@ class ChannelsCompanion extends UpdateCompanion { this.updatedAt = const Value.absent(), this.deletedAt = const Value.absent(), this.memberCount = const Value.absent(), + this.messageCount = const Value.absent(), this.createdById = const Value.absent(), this.extraData = const Value.absent(), this.rowid = const Value.absent(), @@ -527,6 +563,7 @@ class ChannelsCompanion extends UpdateCompanion { Expression? updatedAt, Expression? deletedAt, Expression? memberCount, + Expression? messageCount, Expression? createdById, Expression? extraData, Expression? rowid, @@ -543,6 +580,7 @@ class ChannelsCompanion extends UpdateCompanion { if (updatedAt != null) 'updated_at': updatedAt, if (deletedAt != null) 'deleted_at': deletedAt, if (memberCount != null) 'member_count': memberCount, + if (messageCount != null) 'message_count': messageCount, if (createdById != null) 'created_by_id': createdById, if (extraData != null) 'extra_data': extraData, if (rowid != null) 'rowid': rowid, @@ -561,6 +599,7 @@ class ChannelsCompanion extends UpdateCompanion { Value? updatedAt, Value? deletedAt, Value? memberCount, + Value? messageCount, Value? createdById, Value?>? extraData, Value? rowid}) { @@ -576,6 +615,7 @@ class ChannelsCompanion extends UpdateCompanion { updatedAt: updatedAt ?? this.updatedAt, deletedAt: deletedAt ?? this.deletedAt, memberCount: memberCount ?? this.memberCount, + messageCount: messageCount ?? this.messageCount, createdById: createdById ?? this.createdById, extraData: extraData ?? this.extraData, rowid: rowid ?? this.rowid, @@ -621,6 +661,9 @@ class ChannelsCompanion extends UpdateCompanion { if (memberCount.present) { map['member_count'] = Variable(memberCount.value); } + if (messageCount.present) { + map['message_count'] = Variable(messageCount.value); + } if (createdById.present) { map['created_by_id'] = Variable(createdById.value); } @@ -648,6 +691,7 @@ class ChannelsCompanion extends UpdateCompanion { ..write('updatedAt: $updatedAt, ') ..write('deletedAt: $deletedAt, ') ..write('memberCount: $memberCount, ') + ..write('messageCount: $messageCount, ') ..write('createdById: $createdById, ') ..write('extraData: $extraData, ') ..write('rowid: $rowid') @@ -8435,6 +8479,7 @@ typedef $$ChannelsTableCreateCompanionBuilder = ChannelsCompanion Function({ Value updatedAt, Value deletedAt, Value memberCount, + Value messageCount, Value createdById, Value?> extraData, Value rowid, @@ -8451,6 +8496,7 @@ typedef $$ChannelsTableUpdateCompanionBuilder = ChannelsCompanion Function({ Value updatedAt, Value deletedAt, Value memberCount, + Value messageCount, Value createdById, Value?> extraData, Value rowid, @@ -8569,6 +8615,9 @@ class $$ChannelsTableFilterComposer ColumnFilters get memberCount => $composableBuilder( column: $table.memberCount, builder: (column) => ColumnFilters(column)); + ColumnFilters get messageCount => $composableBuilder( + column: $table.messageCount, builder: (column) => ColumnFilters(column)); + ColumnFilters get createdById => $composableBuilder( column: $table.createdById, builder: (column) => ColumnFilters(column)); @@ -8707,6 +8756,10 @@ class $$ChannelsTableOrderingComposer ColumnOrderings get memberCount => $composableBuilder( column: $table.memberCount, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get messageCount => $composableBuilder( + column: $table.messageCount, + builder: (column) => ColumnOrderings(column)); + ColumnOrderings get createdById => $composableBuilder( column: $table.createdById, builder: (column) => ColumnOrderings(column)); @@ -8757,6 +8810,9 @@ class $$ChannelsTableAnnotationComposer GeneratedColumn get memberCount => $composableBuilder( column: $table.memberCount, builder: (column) => column); + GeneratedColumn get messageCount => $composableBuilder( + column: $table.messageCount, builder: (column) => column); + GeneratedColumn get createdById => $composableBuilder( column: $table.createdById, builder: (column) => column); @@ -8887,6 +8943,7 @@ class $$ChannelsTableTableManager extends RootTableManager< Value updatedAt = const Value.absent(), Value deletedAt = const Value.absent(), Value memberCount = const Value.absent(), + Value messageCount = const Value.absent(), Value createdById = const Value.absent(), Value?> extraData = const Value.absent(), Value rowid = const Value.absent(), @@ -8903,6 +8960,7 @@ class $$ChannelsTableTableManager extends RootTableManager< updatedAt: updatedAt, deletedAt: deletedAt, memberCount: memberCount, + messageCount: messageCount, createdById: createdById, extraData: extraData, rowid: rowid, @@ -8919,6 +8977,7 @@ class $$ChannelsTableTableManager extends RootTableManager< Value updatedAt = const Value.absent(), Value deletedAt = const Value.absent(), Value memberCount = const Value.absent(), + Value messageCount = const Value.absent(), Value createdById = const Value.absent(), Value?> extraData = const Value.absent(), Value rowid = const Value.absent(), @@ -8935,6 +8994,7 @@ class $$ChannelsTableTableManager extends RootTableManager< updatedAt: updatedAt, deletedAt: deletedAt, memberCount: memberCount, + messageCount: messageCount, createdById: createdById, extraData: extraData, rowid: rowid, diff --git a/packages/stream_chat_persistence/lib/src/entity/channels.dart b/packages/stream_chat_persistence/lib/src/entity/channels.dart index 351883578..3b0bbdf76 100644 --- a/packages/stream_chat_persistence/lib/src/entity/channels.dart +++ b/packages/stream_chat_persistence/lib/src/entity/channels.dart @@ -39,6 +39,9 @@ class Channels extends Table { /// The count of this channel members IntColumn get memberCount => integer().withDefault(const Constant(0))(); + /// The count of messages in this channel + IntColumn get messageCount => integer().nullable()(); + /// The id of the user that created this channel TextColumn get createdById => text().nullable()(); diff --git a/packages/stream_chat_persistence/lib/src/mapper/channel_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/channel_mapper.dart index 18865d822..89c4e19f9 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/channel_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/channel_mapper.dart @@ -15,6 +15,7 @@ extension ChannelEntityX on ChannelEntity { createdAt: createdAt, updatedAt: updatedAt, memberCount: memberCount, + messageCount: messageCount, cid: cid, lastMessageAt: lastMessageAt, deletedAt: deletedAt, @@ -55,6 +56,7 @@ extension ChannelModelX on ChannelModel { updatedAt: updatedAt, deletedAt: deletedAt, memberCount: memberCount, + messageCount: messageCount, createdById: createdBy?.id, extraData: extraData, ); diff --git a/packages/stream_chat_persistence/test/src/mapper/channel_mapper_test.dart b/packages/stream_chat_persistence/test/src/mapper/channel_mapper_test.dart index 88c617bd6..071d4d895 100644 --- a/packages/stream_chat_persistence/test/src/mapper/channel_mapper_test.dart +++ b/packages/stream_chat_persistence/test/src/mapper/channel_mapper_test.dart @@ -22,6 +22,7 @@ void main() { updatedAt: DateTime.now(), deletedAt: DateTime.now(), memberCount: 33, + messageCount: 42, createdById: user.id, extraData: {'test_extra_data': 'testData'}, ); @@ -36,6 +37,7 @@ void main() { expect(channelModel.createdAt, isSameDateAs(entity.createdAt)); expect(channelModel.updatedAt, isSameDateAs(entity.updatedAt)); expect(channelModel.memberCount, entity.memberCount); + expect(channelModel.messageCount, entity.messageCount); expect(channelModel.cid, entity.cid); expect(channelModel.lastMessageAt, isSameDateAs(entity.lastMessageAt)); expect(channelModel.deletedAt, isSameDateAs(entity.deletedAt)); @@ -77,6 +79,7 @@ void main() { expect(channelModel.createdAt, isSameDateAs(entity.createdAt)); expect(channelModel.updatedAt, isSameDateAs(entity.updatedAt)); expect(channelModel.memberCount, entity.memberCount); + expect(channelModel.messageCount, entity.messageCount); expect(channelModel.cid, entity.cid); expect(channelModel.lastMessageAt, isSameDateAs(entity.lastMessageAt)); expect(channelModel.deletedAt, isSameDateAs(entity.deletedAt)); @@ -99,6 +102,7 @@ void main() { updatedAt: DateTime.now(), deletedAt: DateTime.now(), memberCount: 33, + messageCount: 75, createdBy: createdBy, extraData: {'test_extra_data': 'testData'}, ); @@ -115,6 +119,7 @@ void main() { expect(channelEntity.createdAt, isSameDateAs(model.createdAt)); expect(channelEntity.updatedAt, isSameDateAs(model.updatedAt)); expect(channelEntity.memberCount, model.memberCount); + expect(channelEntity.messageCount, model.messageCount); expect(channelEntity.cid, model.cid); expect(channelEntity.lastMessageAt, isSameDateAs(model.lastMessageAt)); expect(channelEntity.deletedAt, isSameDateAs(model.deletedAt));