From 658f7f2504d0674a89a276b885d92cfd627f2573 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Tue, 27 Jul 2021 20:06:06 +0530 Subject: [PATCH] feat(persistence): add support for message.i18n Signed-off-by: xsahil03x --- .../lib/src/db/moor_chat_database.g.dart | 159 +++++++++++++++--- .../lib/src/entity/messages.dart | 3 + .../lib/src/entity/users.dart | 3 + .../lib/src/mapper/message_mapper.dart | 2 + .../lib/src/mapper/pinned_message_mapper.dart | 4 + .../lib/src/mapper/user_mapper.dart | 2 + .../test/src/dao/message_dao_test.dart | 21 ++- .../test/src/dao/user_dao_test.dart | 1 + .../test/src/mapper/message_mapper_test.dart | 16 +- .../mapper/pinned_message_mapper_test.dart | 16 +- .../test/src/mapper/user_mapper_test.dart | 4 + 11 files changed, 205 insertions(+), 26 deletions(-) diff --git a/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart b/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart index 6a5bc38a..6274e932 100644 --- a/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart +++ b/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart @@ -647,6 +647,9 @@ class MessageEntity extends DataClass implements Insertable { /// The channel cid of which this message is part of final String? channelCid; + /// A Map of [messageText] translations. + final Map? i18n; + /// Message custom extraData final Map? extraData; MessageEntity( @@ -673,6 +676,7 @@ class MessageEntity extends DataClass implements Insertable { this.pinExpires, this.pinnedByUserId, this.channelCid, + this.i18n, this.extraData}); factory MessageEntity.fromData( Map data, GeneratedDatabase db, @@ -725,7 +729,9 @@ class MessageEntity extends DataClass implements Insertable { .mapFromDatabaseResponse(data['${effectivePrefix}pinned_by_user_id']), channelCid: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}channel_cid']), - extraData: $MessagesTable.$converter5.mapToDart(const StringType() + i18n: $MessagesTable.$converter5.mapToDart(const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}i18n'])), + extraData: $MessagesTable.$converter6.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}extra_data'])), ); } @@ -797,8 +803,12 @@ class MessageEntity extends DataClass implements Insertable { if (!nullToAbsent || channelCid != null) { map['channel_cid'] = Variable(channelCid); } - if (!nullToAbsent || extraData != null) { + if (!nullToAbsent || i18n != null) { final converter = $MessagesTable.$converter5; + map['i18n'] = Variable(converter.mapToSql(i18n)); + } + if (!nullToAbsent || extraData != null) { + final converter = $MessagesTable.$converter6; map['extra_data'] = Variable(converter.mapToSql(extraData)); } return map; @@ -833,6 +843,7 @@ class MessageEntity extends DataClass implements Insertable { pinExpires: serializer.fromJson(json['pinExpires']), pinnedByUserId: serializer.fromJson(json['pinnedByUserId']), channelCid: serializer.fromJson(json['channelCid']), + i18n: serializer.fromJson?>(json['i18n']), extraData: serializer.fromJson?>(json['extraData']), ); } @@ -863,6 +874,7 @@ class MessageEntity extends DataClass implements Insertable { 'pinExpires': serializer.toJson(pinExpires), 'pinnedByUserId': serializer.toJson(pinnedByUserId), 'channelCid': serializer.toJson(channelCid), + 'i18n': serializer.toJson?>(i18n), 'extraData': serializer.toJson?>(extraData), }; } @@ -891,6 +903,7 @@ class MessageEntity extends DataClass implements Insertable { Value pinExpires = const Value.absent(), Value pinnedByUserId = const Value.absent(), Value channelCid = const Value.absent(), + Value?> i18n = const Value.absent(), Value?> extraData = const Value.absent()}) => MessageEntity( id: id ?? this.id, @@ -922,6 +935,7 @@ class MessageEntity extends DataClass implements Insertable { pinnedByUserId: pinnedByUserId.present ? pinnedByUserId.value : this.pinnedByUserId, channelCid: channelCid.present ? channelCid.value : this.channelCid, + i18n: i18n.present ? i18n.value : this.i18n, extraData: extraData.present ? extraData.value : this.extraData, ); @override @@ -950,6 +964,7 @@ class MessageEntity extends DataClass implements Insertable { ..write('pinExpires: $pinExpires, ') ..write('pinnedByUserId: $pinnedByUserId, ') ..write('channelCid: $channelCid, ') + ..write('i18n: $i18n, ') ..write('extraData: $extraData') ..write(')')) .toString(); @@ -998,7 +1013,7 @@ class MessageEntity extends DataClass implements Insertable { .hashCode, $mrjc( pinned.hashCode, - $mrjc(pinnedAt.hashCode, $mrjc(pinExpires.hashCode, $mrjc(pinnedByUserId.hashCode, $mrjc(channelCid.hashCode, extraData.hashCode)))))))))))))))))))))))); + $mrjc(pinnedAt.hashCode, $mrjc(pinExpires.hashCode, $mrjc(pinnedByUserId.hashCode, $mrjc(channelCid.hashCode, $mrjc(i18n.hashCode, extraData.hashCode))))))))))))))))))))))))); @override bool operator ==(Object other) => identical(this, other) || @@ -1026,6 +1041,7 @@ class MessageEntity extends DataClass implements Insertable { other.pinExpires == this.pinExpires && other.pinnedByUserId == this.pinnedByUserId && other.channelCid == this.channelCid && + other.i18n == this.i18n && other.extraData == this.extraData); } @@ -1053,6 +1069,7 @@ class MessagesCompanion extends UpdateCompanion { final Value pinExpires; final Value pinnedByUserId; final Value channelCid; + final Value?> i18n; final Value?> extraData; const MessagesCompanion({ this.id = const Value.absent(), @@ -1078,6 +1095,7 @@ class MessagesCompanion extends UpdateCompanion { this.pinExpires = const Value.absent(), this.pinnedByUserId = const Value.absent(), this.channelCid = const Value.absent(), + this.i18n = const Value.absent(), this.extraData = const Value.absent(), }); MessagesCompanion.insert({ @@ -1104,6 +1122,7 @@ class MessagesCompanion extends UpdateCompanion { this.pinExpires = const Value.absent(), this.pinnedByUserId = const Value.absent(), this.channelCid = const Value.absent(), + this.i18n = const Value.absent(), this.extraData = const Value.absent(), }) : id = Value(id), attachments = Value(attachments), @@ -1132,6 +1151,7 @@ class MessagesCompanion extends UpdateCompanion { Expression? pinExpires, Expression? pinnedByUserId, Expression? channelCid, + Expression?>? i18n, Expression?>? extraData, }) { return RawValuesInsertable({ @@ -1158,6 +1178,7 @@ class MessagesCompanion extends UpdateCompanion { if (pinExpires != null) 'pin_expires': pinExpires, if (pinnedByUserId != null) 'pinned_by_user_id': pinnedByUserId, if (channelCid != null) 'channel_cid': channelCid, + if (i18n != null) 'i18n': i18n, if (extraData != null) 'extra_data': extraData, }); } @@ -1186,6 +1207,7 @@ class MessagesCompanion extends UpdateCompanion { Value? pinExpires, Value? pinnedByUserId, Value? channelCid, + Value?>? i18n, Value?>? extraData}) { return MessagesCompanion( id: id ?? this.id, @@ -1211,6 +1233,7 @@ class MessagesCompanion extends UpdateCompanion { pinExpires: pinExpires ?? this.pinExpires, pinnedByUserId: pinnedByUserId ?? this.pinnedByUserId, channelCid: channelCid ?? this.channelCid, + i18n: i18n ?? this.i18n, extraData: extraData ?? this.extraData, ); } @@ -1296,8 +1319,12 @@ class MessagesCompanion extends UpdateCompanion { if (channelCid.present) { map['channel_cid'] = Variable(channelCid.value); } - if (extraData.present) { + if (i18n.present) { final converter = $MessagesTable.$converter5; + map['i18n'] = Variable(converter.mapToSql(i18n.value)); + } + if (extraData.present) { + final converter = $MessagesTable.$converter6; map['extra_data'] = Variable(converter.mapToSql(extraData.value)); } @@ -1330,6 +1357,7 @@ class MessagesCompanion extends UpdateCompanion { ..write('pinExpires: $pinExpires, ') ..write('pinnedByUserId: $pinnedByUserId, ') ..write('channelCid: $channelCid, ') + ..write('i18n: $i18n, ') ..write('extraData: $extraData') ..write(')')) .toString(); @@ -1468,11 +1496,16 @@ class $MessagesTable extends Messages requiredDuringInsert: false, $customConstraints: 'NULLABLE REFERENCES channels(cid) ON DELETE CASCADE'); + final VerificationMeta _i18nMeta = const VerificationMeta('i18n'); + late final GeneratedColumnWithTypeConverter, String?> + i18n = GeneratedColumn('i18n', aliasedName, true, + typeName: 'TEXT', requiredDuringInsert: false) + .withConverter>($MessagesTable.$converter5); final VerificationMeta _extraDataMeta = const VerificationMeta('extraData'); late final GeneratedColumnWithTypeConverter, String?> extraData = GeneratedColumn('extra_data', aliasedName, true, typeName: 'TEXT', requiredDuringInsert: false) - .withConverter>($MessagesTable.$converter5); + .withConverter>($MessagesTable.$converter6); @override List get $columns => [ id, @@ -1498,6 +1531,7 @@ class $MessagesTable extends Messages pinExpires, pinnedByUserId, channelCid, + i18n, extraData ]; @override @@ -1601,6 +1635,7 @@ class $MessagesTable extends Messages channelCid.isAcceptableOrUnknown( data['channel_cid']!, _channelCidMeta)); } + context.handle(_i18nMeta, const VerificationResult.success()); context.handle(_extraDataMeta, const VerificationResult.success()); return context; } @@ -1628,7 +1663,9 @@ class $MessagesTable extends Messages MapConverter(); static TypeConverter, String> $converter4 = MapConverter(); - static TypeConverter, String> $converter5 = + static TypeConverter, String> $converter5 = + MapConverter(); + static TypeConverter, String> $converter6 = MapConverter(); } @@ -1704,6 +1741,9 @@ class PinnedMessageEntity extends DataClass /// The channel cid of which this message is part of final String? channelCid; + /// A Map of [messageText] translations. + final Map? i18n; + /// Message custom extraData final Map? extraData; PinnedMessageEntity( @@ -1730,6 +1770,7 @@ class PinnedMessageEntity extends DataClass this.pinExpires, this.pinnedByUserId, this.channelCid, + this.i18n, this.extraData}); factory PinnedMessageEntity.fromData( Map data, GeneratedDatabase db, @@ -1785,7 +1826,9 @@ class PinnedMessageEntity extends DataClass .mapFromDatabaseResponse(data['${effectivePrefix}pinned_by_user_id']), channelCid: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}channel_cid']), - extraData: $PinnedMessagesTable.$converter5.mapToDart(const StringType() + i18n: $PinnedMessagesTable.$converter5.mapToDart(const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}i18n'])), + extraData: $PinnedMessagesTable.$converter6.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}extra_data'])), ); } @@ -1857,8 +1900,12 @@ class PinnedMessageEntity extends DataClass if (!nullToAbsent || channelCid != null) { map['channel_cid'] = Variable(channelCid); } - if (!nullToAbsent || extraData != null) { + if (!nullToAbsent || i18n != null) { final converter = $PinnedMessagesTable.$converter5; + map['i18n'] = Variable(converter.mapToSql(i18n)); + } + if (!nullToAbsent || extraData != null) { + final converter = $PinnedMessagesTable.$converter6; map['extra_data'] = Variable(converter.mapToSql(extraData)); } return map; @@ -1893,6 +1940,7 @@ class PinnedMessageEntity extends DataClass pinExpires: serializer.fromJson(json['pinExpires']), pinnedByUserId: serializer.fromJson(json['pinnedByUserId']), channelCid: serializer.fromJson(json['channelCid']), + i18n: serializer.fromJson?>(json['i18n']), extraData: serializer.fromJson?>(json['extraData']), ); } @@ -1923,6 +1971,7 @@ class PinnedMessageEntity extends DataClass 'pinExpires': serializer.toJson(pinExpires), 'pinnedByUserId': serializer.toJson(pinnedByUserId), 'channelCid': serializer.toJson(channelCid), + 'i18n': serializer.toJson?>(i18n), 'extraData': serializer.toJson?>(extraData), }; } @@ -1951,6 +2000,7 @@ class PinnedMessageEntity extends DataClass Value pinExpires = const Value.absent(), Value pinnedByUserId = const Value.absent(), Value channelCid = const Value.absent(), + Value?> i18n = const Value.absent(), Value?> extraData = const Value.absent()}) => PinnedMessageEntity( id: id ?? this.id, @@ -1982,6 +2032,7 @@ class PinnedMessageEntity extends DataClass pinnedByUserId: pinnedByUserId.present ? pinnedByUserId.value : this.pinnedByUserId, channelCid: channelCid.present ? channelCid.value : this.channelCid, + i18n: i18n.present ? i18n.value : this.i18n, extraData: extraData.present ? extraData.value : this.extraData, ); @override @@ -2010,6 +2061,7 @@ class PinnedMessageEntity extends DataClass ..write('pinExpires: $pinExpires, ') ..write('pinnedByUserId: $pinnedByUserId, ') ..write('channelCid: $channelCid, ') + ..write('i18n: $i18n, ') ..write('extraData: $extraData') ..write(')')) .toString(); @@ -2058,7 +2110,7 @@ class PinnedMessageEntity extends DataClass .hashCode, $mrjc( pinned.hashCode, - $mrjc(pinnedAt.hashCode, $mrjc(pinExpires.hashCode, $mrjc(pinnedByUserId.hashCode, $mrjc(channelCid.hashCode, extraData.hashCode)))))))))))))))))))))))); + $mrjc(pinnedAt.hashCode, $mrjc(pinExpires.hashCode, $mrjc(pinnedByUserId.hashCode, $mrjc(channelCid.hashCode, $mrjc(i18n.hashCode, extraData.hashCode))))))))))))))))))))))))); @override bool operator ==(Object other) => identical(this, other) || @@ -2086,6 +2138,7 @@ class PinnedMessageEntity extends DataClass other.pinExpires == this.pinExpires && other.pinnedByUserId == this.pinnedByUserId && other.channelCid == this.channelCid && + other.i18n == this.i18n && other.extraData == this.extraData); } @@ -2113,6 +2166,7 @@ class PinnedMessagesCompanion extends UpdateCompanion { final Value pinExpires; final Value pinnedByUserId; final Value channelCid; + final Value?> i18n; final Value?> extraData; const PinnedMessagesCompanion({ this.id = const Value.absent(), @@ -2138,6 +2192,7 @@ class PinnedMessagesCompanion extends UpdateCompanion { this.pinExpires = const Value.absent(), this.pinnedByUserId = const Value.absent(), this.channelCid = const Value.absent(), + this.i18n = const Value.absent(), this.extraData = const Value.absent(), }); PinnedMessagesCompanion.insert({ @@ -2164,6 +2219,7 @@ class PinnedMessagesCompanion extends UpdateCompanion { this.pinExpires = const Value.absent(), this.pinnedByUserId = const Value.absent(), this.channelCid = const Value.absent(), + this.i18n = const Value.absent(), this.extraData = const Value.absent(), }) : id = Value(id), attachments = Value(attachments), @@ -2192,6 +2248,7 @@ class PinnedMessagesCompanion extends UpdateCompanion { Expression? pinExpires, Expression? pinnedByUserId, Expression? channelCid, + Expression?>? i18n, Expression?>? extraData, }) { return RawValuesInsertable({ @@ -2218,6 +2275,7 @@ class PinnedMessagesCompanion extends UpdateCompanion { if (pinExpires != null) 'pin_expires': pinExpires, if (pinnedByUserId != null) 'pinned_by_user_id': pinnedByUserId, if (channelCid != null) 'channel_cid': channelCid, + if (i18n != null) 'i18n': i18n, if (extraData != null) 'extra_data': extraData, }); } @@ -2246,6 +2304,7 @@ class PinnedMessagesCompanion extends UpdateCompanion { Value? pinExpires, Value? pinnedByUserId, Value? channelCid, + Value?>? i18n, Value?>? extraData}) { return PinnedMessagesCompanion( id: id ?? this.id, @@ -2271,6 +2330,7 @@ class PinnedMessagesCompanion extends UpdateCompanion { pinExpires: pinExpires ?? this.pinExpires, pinnedByUserId: pinnedByUserId ?? this.pinnedByUserId, channelCid: channelCid ?? this.channelCid, + i18n: i18n ?? this.i18n, extraData: extraData ?? this.extraData, ); } @@ -2356,8 +2416,12 @@ class PinnedMessagesCompanion extends UpdateCompanion { if (channelCid.present) { map['channel_cid'] = Variable(channelCid.value); } - if (extraData.present) { + if (i18n.present) { final converter = $PinnedMessagesTable.$converter5; + map['i18n'] = Variable(converter.mapToSql(i18n.value)); + } + if (extraData.present) { + final converter = $PinnedMessagesTable.$converter6; map['extra_data'] = Variable(converter.mapToSql(extraData.value)); } @@ -2390,6 +2454,7 @@ class PinnedMessagesCompanion extends UpdateCompanion { ..write('pinExpires: $pinExpires, ') ..write('pinnedByUserId: $pinnedByUserId, ') ..write('channelCid: $channelCid, ') + ..write('i18n: $i18n, ') ..write('extraData: $extraData') ..write(')')) .toString(); @@ -2529,12 +2594,17 @@ class $PinnedMessagesTable extends PinnedMessages requiredDuringInsert: false, $customConstraints: 'NULLABLE REFERENCES channels(cid) ON DELETE CASCADE'); + final VerificationMeta _i18nMeta = const VerificationMeta('i18n'); + late final GeneratedColumnWithTypeConverter, String?> + i18n = GeneratedColumn('i18n', aliasedName, true, + typeName: 'TEXT', requiredDuringInsert: false) + .withConverter>($PinnedMessagesTable.$converter5); final VerificationMeta _extraDataMeta = const VerificationMeta('extraData'); late final GeneratedColumnWithTypeConverter, String?> extraData = GeneratedColumn('extra_data', aliasedName, true, typeName: 'TEXT', requiredDuringInsert: false) .withConverter>( - $PinnedMessagesTable.$converter5); + $PinnedMessagesTable.$converter6); @override List get $columns => [ id, @@ -2560,6 +2630,7 @@ class $PinnedMessagesTable extends PinnedMessages pinExpires, pinnedByUserId, channelCid, + i18n, extraData ]; @override @@ -2664,6 +2735,7 @@ class $PinnedMessagesTable extends PinnedMessages channelCid.isAcceptableOrUnknown( data['channel_cid']!, _channelCidMeta)); } + context.handle(_i18nMeta, const VerificationResult.success()); context.handle(_extraDataMeta, const VerificationResult.success()); return context; } @@ -2691,7 +2763,9 @@ class $PinnedMessagesTable extends PinnedMessages MapConverter(); static TypeConverter, String> $converter4 = MapConverter(); - static TypeConverter, String> $converter5 = + static TypeConverter, String> $converter5 = + MapConverter(); + static TypeConverter, String> $converter6 = MapConverter(); } @@ -3030,6 +3104,9 @@ class UserEntity extends DataClass implements Insertable { /// User role final String? role; + /// The language this user prefers. + final String language; + /// Date of user creation final DateTime createdAt; @@ -3050,6 +3127,7 @@ class UserEntity extends DataClass implements Insertable { UserEntity( {required this.id, this.role, + required this.language, required this.createdAt, required this.updatedAt, this.lastActive, @@ -3064,6 +3142,8 @@ class UserEntity extends DataClass implements Insertable { .mapFromDatabaseResponse(data['${effectivePrefix}id'])!, role: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}role']), + language: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}language'])!, createdAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}created_at'])!, updatedAt: const DateTimeType() @@ -3085,6 +3165,7 @@ class UserEntity extends DataClass implements Insertable { if (!nullToAbsent || role != null) { map['role'] = Variable(role); } + map['language'] = Variable(language); map['created_at'] = Variable(createdAt); map['updated_at'] = Variable(updatedAt); if (!nullToAbsent || lastActive != null) { @@ -3105,6 +3186,7 @@ class UserEntity extends DataClass implements Insertable { return UserEntity( id: serializer.fromJson(json['id']), role: serializer.fromJson(json['role']), + language: serializer.fromJson(json['language']), createdAt: serializer.fromJson(json['createdAt']), updatedAt: serializer.fromJson(json['updatedAt']), lastActive: serializer.fromJson(json['lastActive']), @@ -3119,6 +3201,7 @@ class UserEntity extends DataClass implements Insertable { return { 'id': serializer.toJson(id), 'role': serializer.toJson(role), + 'language': serializer.toJson(language), 'createdAt': serializer.toJson(createdAt), 'updatedAt': serializer.toJson(updatedAt), 'lastActive': serializer.toJson(lastActive), @@ -3131,6 +3214,7 @@ class UserEntity extends DataClass implements Insertable { UserEntity copyWith( {String? id, Value role = const Value.absent(), + String? language, DateTime? createdAt, DateTime? updatedAt, Value lastActive = const Value.absent(), @@ -3140,6 +3224,7 @@ class UserEntity extends DataClass implements Insertable { UserEntity( id: id ?? this.id, role: role.present ? role.value : this.role, + language: language ?? this.language, createdAt: createdAt ?? this.createdAt, updatedAt: updatedAt ?? this.updatedAt, lastActive: lastActive.present ? lastActive.value : this.lastActive, @@ -3152,6 +3237,7 @@ class UserEntity extends DataClass implements Insertable { return (StringBuffer('UserEntity(') ..write('id: $id, ') ..write('role: $role, ') + ..write('language: $language, ') ..write('createdAt: $createdAt, ') ..write('updatedAt: $updatedAt, ') ..write('lastActive: $lastActive, ') @@ -3168,19 +3254,24 @@ class UserEntity extends DataClass implements Insertable { $mrjc( role.hashCode, $mrjc( - createdAt.hashCode, + language.hashCode, $mrjc( - updatedAt.hashCode, + createdAt.hashCode, $mrjc( - lastActive.hashCode, - $mrjc(online.hashCode, - $mrjc(banned.hashCode, extraData.hashCode)))))))); + updatedAt.hashCode, + $mrjc( + lastActive.hashCode, + $mrjc( + online.hashCode, + $mrjc( + banned.hashCode, extraData.hashCode))))))))); @override bool operator ==(Object other) => identical(this, other) || (other is UserEntity && other.id == this.id && other.role == this.role && + other.language == this.language && other.createdAt == this.createdAt && other.updatedAt == this.updatedAt && other.lastActive == this.lastActive && @@ -3192,6 +3283,7 @@ class UserEntity extends DataClass implements Insertable { class UsersCompanion extends UpdateCompanion { final Value id; final Value role; + final Value language; final Value createdAt; final Value updatedAt; final Value lastActive; @@ -3201,6 +3293,7 @@ class UsersCompanion extends UpdateCompanion { const UsersCompanion({ this.id = const Value.absent(), this.role = const Value.absent(), + this.language = const Value.absent(), this.createdAt = const Value.absent(), this.updatedAt = const Value.absent(), this.lastActive = const Value.absent(), @@ -3211,6 +3304,7 @@ class UsersCompanion extends UpdateCompanion { UsersCompanion.insert({ required String id, this.role = const Value.absent(), + this.language = const Value.absent(), this.createdAt = const Value.absent(), this.updatedAt = const Value.absent(), this.lastActive = const Value.absent(), @@ -3222,6 +3316,7 @@ class UsersCompanion extends UpdateCompanion { static Insertable custom({ Expression? id, Expression? role, + Expression? language, Expression? createdAt, Expression? updatedAt, Expression? lastActive, @@ -3232,6 +3327,7 @@ class UsersCompanion extends UpdateCompanion { return RawValuesInsertable({ if (id != null) 'id': id, if (role != null) 'role': role, + if (language != null) 'language': language, if (createdAt != null) 'created_at': createdAt, if (updatedAt != null) 'updated_at': updatedAt, if (lastActive != null) 'last_active': lastActive, @@ -3244,6 +3340,7 @@ class UsersCompanion extends UpdateCompanion { UsersCompanion copyWith( {Value? id, Value? role, + Value? language, Value? createdAt, Value? updatedAt, Value? lastActive, @@ -3253,6 +3350,7 @@ class UsersCompanion extends UpdateCompanion { return UsersCompanion( id: id ?? this.id, role: role ?? this.role, + language: language ?? this.language, createdAt: createdAt ?? this.createdAt, updatedAt: updatedAt ?? this.updatedAt, lastActive: lastActive ?? this.lastActive, @@ -3271,6 +3369,9 @@ class UsersCompanion extends UpdateCompanion { if (role.present) { map['role'] = Variable(role.value); } + if (language.present) { + map['language'] = Variable(language.value); + } if (createdAt.present) { map['created_at'] = Variable(createdAt.value); } @@ -3299,6 +3400,7 @@ class UsersCompanion extends UpdateCompanion { return (StringBuffer('UsersCompanion(') ..write('id: $id, ') ..write('role: $role, ') + ..write('language: $language, ') ..write('createdAt: $createdAt, ') ..write('updatedAt: $updatedAt, ') ..write('lastActive: $lastActive, ') @@ -3322,6 +3424,12 @@ class $UsersTable extends Users with TableInfo<$UsersTable, UserEntity> { late final GeneratedColumn role = GeneratedColumn( 'role', aliasedName, true, typeName: 'TEXT', requiredDuringInsert: false); + final VerificationMeta _languageMeta = const VerificationMeta('language'); + late final GeneratedColumn language = GeneratedColumn( + 'language', aliasedName, false, + typeName: 'TEXT', + requiredDuringInsert: false, + defaultValue: const Constant('en')); final VerificationMeta _createdAtMeta = const VerificationMeta('createdAt'); late final GeneratedColumn createdAt = GeneratedColumn( 'created_at', aliasedName, false, @@ -3358,8 +3466,17 @@ class $UsersTable extends Users with TableInfo<$UsersTable, UserEntity> { typeName: 'TEXT', requiredDuringInsert: true) .withConverter>($UsersTable.$converter0); @override - List get $columns => - [id, role, createdAt, updatedAt, lastActive, online, banned, extraData]; + List get $columns => [ + id, + role, + language, + createdAt, + updatedAt, + lastActive, + online, + banned, + extraData + ]; @override String get aliasedName => _alias ?? 'users'; @override @@ -3378,6 +3495,10 @@ class $UsersTable extends Users with TableInfo<$UsersTable, UserEntity> { context.handle( _roleMeta, role.isAcceptableOrUnknown(data['role']!, _roleMeta)); } + if (data.containsKey('language')) { + context.handle(_languageMeta, + language.isAcceptableOrUnknown(data['language']!, _languageMeta)); + } if (data.containsKey('created_at')) { context.handle(_createdAtMeta, createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta)); diff --git a/packages/stream_chat_persistence/lib/src/entity/messages.dart b/packages/stream_chat_persistence/lib/src/entity/messages.dart index 4006d6ce..0aef2b84 100644 --- a/packages/stream_chat_persistence/lib/src/entity/messages.dart +++ b/packages/stream_chat_persistence/lib/src/entity/messages.dart @@ -80,6 +80,9 @@ class Messages extends Table { TextColumn get channelCid => text().nullable().customConstraint( 'NULLABLE REFERENCES channels(cid) ON DELETE CASCADE')(); + /// A Map of [messageText] translations. + TextColumn get i18n => text().nullable().map(MapConverter())(); + /// Message custom extraData TextColumn get extraData => text().nullable().map(MapConverter())(); diff --git a/packages/stream_chat_persistence/lib/src/entity/users.dart b/packages/stream_chat_persistence/lib/src/entity/users.dart index 303092c9..49aae500 100644 --- a/packages/stream_chat_persistence/lib/src/entity/users.dart +++ b/packages/stream_chat_persistence/lib/src/entity/users.dart @@ -11,6 +11,9 @@ class Users extends Table { /// User role TextColumn get role => text().nullable()(); + /// The language this user prefers. + TextColumn get language => text().withDefault(const Constant('en'))(); + /// Date of user creation DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)(); diff --git a/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart index 558c6e45..85692296 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart @@ -44,6 +44,7 @@ extension MessageEntityX on MessageEntity { pinnedBy: pinnedBy, mentionedUsers: mentionedUsers.map((e) => User.fromJson(jsonDecode(e))).toList(), + i18n: i18n, ); } @@ -75,5 +76,6 @@ extension MessageX on Message { pinnedAt: pinnedAt, pinExpires: pinExpires, pinnedByUserId: pinnedBy?.id, + i18n: i18n, ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/pinned_message_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/pinned_message_mapper.dart index 1083e239..b1a7849a 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/pinned_message_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/pinned_message_mapper.dart @@ -42,6 +42,9 @@ extension PinnedMessageEntityX on PinnedMessageEntity { pinnedAt: pinnedAt, pinExpires: pinExpires, pinnedBy: pinnedBy, + mentionedUsers: + mentionedUsers.map((e) => User.fromJson(jsonDecode(e))).toList(), + i18n: i18n, ); } @@ -73,5 +76,6 @@ extension PMessageX on Message { pinnedAt: pinnedAt, pinExpires: pinExpires, pinnedByUserId: pinnedBy?.id, + i18n: i18n, ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/user_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/user_mapper.dart index 533a45b1..8b38a74d 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/user_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/user_mapper.dart @@ -7,6 +7,7 @@ extension UserEntityX on UserEntity { User toUser() => User( id: id, updatedAt: updatedAt, + language: language, role: role, online: online, lastActive: lastActive, @@ -22,6 +23,7 @@ extension UserX on User { UserEntity toEntity() => UserEntity( id: id, role: role, + language: language, createdAt: createdAt, updatedAt: updatedAt, lastActive: lastActive, diff --git a/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart index 54cc219a..fd0a43ce 100644 --- a/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart @@ -35,10 +35,15 @@ void main() { replyCount: index, updatedAt: DateTime.now(), extraData: const {'extra_test_field': 'extraTestData'}, - text: 'Dummy text #$index', + text: 'Hello #$index', pinned: math.Random().nextBool(), pinnedAt: DateTime.now(), pinnedBy: User(id: 'testUserId$index'), + i18n: { + 'en_text': 'Hello #$index', + 'hi_text': 'नमस्ते #$index', + 'language': 'en', + }, ), ); final quotedMessages = List.generate( @@ -52,11 +57,16 @@ void main() { replyCount: index, updatedAt: DateTime.now(), extraData: const {'extra_test_field': 'extraTestData'}, - text: 'Dummy text #$index', + text: 'Hello #$index', quotedMessageId: messages[index].id, pinned: math.Random().nextBool(), pinnedAt: DateTime.now(), pinnedBy: User(id: 'testUserId$index'), + i18n: { + 'en_text': 'Hello #$index', + 'hi_text': 'नमस्ते #$index', + 'language': 'en', + }, ), ); final threadMessages = List.generate( @@ -72,10 +82,15 @@ void main() { replyCount: index, updatedAt: DateTime.now(), extraData: const {'extra_test_field': 'extraTestData'}, - text: 'Dummy text #$index', + text: 'Hello #$index', pinned: math.Random().nextBool(), pinnedAt: DateTime.now(), pinnedBy: User(id: 'testUserId$index'), + i18n: { + 'en_text': 'Hello #$index', + 'hi_text': 'नमस्ते #$index', + 'language': 'en', + }, ), ); final allMessages = [ diff --git a/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart index ffb50edd..5b5d04d4 100644 --- a/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart @@ -22,6 +22,7 @@ void main() { (index) => User( id: 'testUserId$index', role: 'testRole', + language: 'hi', createdAt: DateTime.now(), updatedAt: DateTime.now(), lastActive: DateTime.now(), diff --git a/packages/stream_chat_persistence/test/src/mapper/message_mapper_test.dart b/packages/stream_chat_persistence/test/src/mapper/message_mapper_test.dart index 7d867deb..0f9e8cf6 100644 --- a/packages/stream_chat_persistence/test/src/mapper/message_mapper_test.dart +++ b/packages/stream_chat_persistence/test/src/mapper/message_mapper_test.dart @@ -56,11 +56,16 @@ void main() { extraData: {'extra_test_data': 'extraData'}, userId: user.id, deletedAt: DateTime.now(), - messageText: 'dummy text', + messageText: 'Hello', pinned: true, pinExpires: DateTime.now().toUtc(), pinnedAt: DateTime.now(), pinnedByUserId: user.id, + i18n: const { + 'en_text': 'Hello', + 'hi_text': 'नमस्ते', + 'language': 'en', + }, ); final message = entity.toMessage( user: user, @@ -99,6 +104,7 @@ void main() { expect(message.pinnedBy!.id, entity.pinnedByUserId); expect(message.reactionCounts, entity.reactionCounts); expect(message.reactionScores, entity.reactionScores); + expect(message.i18n, entity.i18n); for (var i = 0; i < message.attachments.length; i++) { final messageAttachment = message.attachments[i]; final entityAttachmentData = jsonDecode(entity.attachments[i]); @@ -156,11 +162,16 @@ void main() { extraData: const {'extra_test_data': 'extraData'}, user: user, deletedAt: DateTime.now(), - text: 'dummy text', + text: 'Hello', pinned: true, pinExpires: DateTime.now(), pinnedAt: DateTime.now(), pinnedBy: user, + i18n: const { + 'en_text': 'Hello', + 'hi_text': 'नमस्ते', + 'language': 'en', + }, ); final entity = message.toEntity(cid: cid); expect(entity, isA()); @@ -193,5 +204,6 @@ void main() { entity.attachments, message.attachments.map((it) => jsonEncode(it.toData())).toList(), ); + expect(entity.i18n, message.i18n); }); } diff --git a/packages/stream_chat_persistence/test/src/mapper/pinned_message_mapper_test.dart b/packages/stream_chat_persistence/test/src/mapper/pinned_message_mapper_test.dart index 8b5f4db4..5150df62 100644 --- a/packages/stream_chat_persistence/test/src/mapper/pinned_message_mapper_test.dart +++ b/packages/stream_chat_persistence/test/src/mapper/pinned_message_mapper_test.dart @@ -54,11 +54,16 @@ void main() { extraData: {'extra_test_data': 'extraData'}, userId: user.id, deletedAt: DateTime.now(), - messageText: 'dummy text', + messageText: 'Hello', pinned: true, pinExpires: DateTime.now().toUtc(), pinnedAt: DateTime.now(), pinnedByUserId: user.id, + i18n: const { + 'en_text': 'Hello', + 'hi_text': 'नमस्ते', + 'language': 'en', + }, ); final message = entity.toMessage( user: user, @@ -92,6 +97,7 @@ void main() { expect(message.pinnedBy!.id, entity.pinnedByUserId); expect(message.reactionCounts, entity.reactionCounts); expect(message.reactionScores, entity.reactionScores); + expect(message.i18n, entity.i18n); for (var i = 0; i < message.attachments.length; i++) { final messageAttachment = message.attachments[i]; final entityAttachmentData = jsonDecode(entity.attachments[i]); @@ -146,11 +152,16 @@ void main() { extraData: const {'extra_test_data': 'extraData'}, user: user, deletedAt: DateTime.now(), - text: 'dummy text', + text: 'Hello', pinned: true, pinExpires: DateTime.now(), pinnedAt: DateTime.now(), pinnedBy: user, + i18n: const { + 'en_text': 'Hello', + 'hi_text': 'नमस्ते', + 'language': 'en', + }, ); final entity = message.toPinnedEntity(cid: cid); expect(entity, isA()); @@ -181,5 +192,6 @@ void main() { entity.attachments, message.attachments.map((it) => jsonEncode(it.toData())).toList(), ); + expect(entity.i18n, message.i18n); }); } diff --git a/packages/stream_chat_persistence/test/src/mapper/user_mapper_test.dart b/packages/stream_chat_persistence/test/src/mapper/user_mapper_test.dart index 4454ad73..eca2a32a 100644 --- a/packages/stream_chat_persistence/test/src/mapper/user_mapper_test.dart +++ b/packages/stream_chat_persistence/test/src/mapper/user_mapper_test.dart @@ -11,6 +11,7 @@ void main() { final entity = UserEntity( id: 'testUserId', role: 'testType', + language: 'hi', createdAt: DateTime.now(), updatedAt: DateTime.now(), lastActive: DateTime.now(), @@ -22,6 +23,7 @@ void main() { expect(user, isA()); expect(user.id, entity.id); expect(user.role, entity.role); + expect(user.language, entity.language); expect(user.createdAt, isSameDateAs(entity.createdAt)); expect(user.updatedAt, isSameDateAs(entity.updatedAt)); expect(user.lastActive, isSameDateAs(entity.lastActive!)); @@ -34,6 +36,7 @@ void main() { final user = User( id: 'testUserId', role: 'testType', + language: 'hi', createdAt: DateTime.now(), updatedAt: DateTime.now(), lastActive: DateTime.now(), @@ -45,6 +48,7 @@ void main() { expect(entity, isA()); expect(entity.id, user.id); expect(entity.role, user.role); + expect(entity.language, user.language); expect(entity.createdAt, isSameDateAs(user.createdAt)); expect(entity.updatedAt, isSameDateAs(user.updatedAt)); expect(entity.lastActive, isSameDateAs(user.lastActive!));