diff --git a/packages/stream_chat_persistence/analysis_options.yaml b/packages/stream_chat_persistence/analysis_options.yaml new file mode 100644 index 00000000..7e4b00fa --- /dev/null +++ b/packages/stream_chat_persistence/analysis_options.yaml @@ -0,0 +1,147 @@ +analyzer: + exclude: + - lib/**/*.g.dart + - lib/**/*.freezed.dart + - example/* + - test/* +linter: + rules: + - always_use_package_imports + - avoid_empty_else + - avoid_relative_lib_imports + - avoid_slow_async_io + - avoid_types_as_parameter_names + - cancel_subscriptions + - close_sinks + - control_flow_in_finally + - diagnostic_describe_all_properties + - empty_statements + - hash_and_equals + - invariant_booleans + - iterable_contains_unrelated_type + - list_remove_unrelated_type + - literal_only_boolean_expressions + - no_adjacent_strings_in_list + - no_duplicate_case_values + - no_logic_in_create_state + - prefer_void_to_null + - test_types_in_equals + - throw_in_finally + - unnecessary_statements + - unrelated_type_equality_checks + - omit_local_variable_types + - use_key_in_widget_constructors + - valid_regexps + - always_declare_return_types + - always_put_required_named_parameters_first + - always_require_non_null_named_parameters + - annotate_overrides + - avoid_bool_literals_in_conditional_expressions + - avoid_catching_errors + - avoid_init_to_null + - avoid_null_checks_in_equality_operators + - avoid_positional_boolean_parameters + - avoid_private_typedef_functions + - avoid_redundant_argument_values + - avoid_return_types_on_setters + - avoid_returning_null + - avoid_returning_null_for_void + - avoid_shadowing_type_parameters + - avoid_single_cascade_in_expression_statements + - avoid_unnecessary_containers + - avoid_unused_constructor_parameters + - await_only_futures + - camel_case_extensions + - camel_case_types + - cascade_invocations + + - constant_identifier_names + - curly_braces_in_flow_control_structures + - directives_ordering + - empty_catches + - empty_constructor_bodies + - exhaustive_cases + - file_names + - implementation_imports + - join_return_with_assignment + - leading_newlines_in_multiline_strings + - library_names + - library_prefixes + - lines_longer_than_80_chars + - missing_whitespace_between_adjacent_strings + - non_constant_identifier_names + - null_closures + - one_member_abstracts + - only_throw_errors + - package_api_docs + - package_prefixed_library_names + - parameter_assignments + - prefer_adjacent_string_concatenation + - prefer_asserts_in_initializer_lists + - prefer_asserts_with_message + - prefer_collection_literals + - prefer_conditional_assignment + - prefer_const_constructors + - prefer_const_constructors_in_immutables + - prefer_const_declarations + - prefer_const_literals_to_create_immutables + - prefer_constructors_over_static_methods + - prefer_contains + - prefer_equal_for_default_values + - prefer_expression_function_bodies + - prefer_final_fields + - prefer_final_in_for_each + - prefer_final_locals + - prefer_function_declarations_over_variables + - prefer_generic_function_type_aliases + - prefer_if_elements_to_conditional_expressions + - prefer_if_null_operators + - prefer_initializing_formals + - prefer_inlined_adds + - prefer_int_literals + - prefer_interpolation_to_compose_strings + - prefer_is_empty + - prefer_is_not_empty + - prefer_is_not_operator + - prefer_null_aware_operators + - prefer_single_quotes + - prefer_spread_collections + - prefer_typing_uninitialized_variables + - provide_deprecation_message + - public_member_api_docs + - recursive_getters + - sized_box_for_whitespace + - slash_for_doc_comments + - sort_child_properties_last + - sort_constructors_first + - sort_unnamed_constructors_first + + - type_annotate_public_apis + - type_init_formals + - unnecessary_await_in_return + - unnecessary_brace_in_string_interps + - unnecessary_const + - unnecessary_getters_setters + - unnecessary_lambdas + - unnecessary_new + - unnecessary_null_aware_assignments + - unnecessary_null_in_if_null_operators + - unnecessary_nullable_for_final_variable_declarations + - unnecessary_parenthesis + - unnecessary_raw_strings + - unnecessary_string_escapes + - unnecessary_string_interpolations + - unnecessary_this + - use_is_even_rather_than_modulo + - use_late_for_private_fields_and_variables + - use_rethrow_when_possible + - use_setters_to_change_properties + - use_to_and_as_if_applicable + - package_names + - sort_pub_dependencies + + # To be added when null-safe: + # - cast_nullable_to_non_nullable + #- unnecessary_null_checks + # - tighten_type_of_initializing_formals + # - null_check_on_nullable_type_parameter \ No newline at end of file diff --git a/packages/stream_chat_persistence/lib/src/converter/list_converter.dart b/packages/stream_chat_persistence/lib/src/converter/list_converter.dart index d14642ce..cbb8ec05 100644 --- a/packages/stream_chat_persistence/lib/src/converter/list_converter.dart +++ b/packages/stream_chat_persistence/lib/src/converter/list_converter.dart @@ -6,7 +6,7 @@ import 'package:moor/moor.dart'; /// by the sqlite backend. class ListConverter extends TypeConverter, String> { @override - List mapToDart(fromDb) { + List mapToDart(String fromDb) { if (fromDb == null) { return null; } @@ -14,7 +14,7 @@ class ListConverter extends TypeConverter, String> { } @override - String mapToSql(value) { + String mapToSql(List value) { if (value == null) { return null; } diff --git a/packages/stream_chat_persistence/lib/src/converter/map_converter.dart b/packages/stream_chat_persistence/lib/src/converter/map_converter.dart index 6e7a648d..b11eb5b8 100644 --- a/packages/stream_chat_persistence/lib/src/converter/map_converter.dart +++ b/packages/stream_chat_persistence/lib/src/converter/map_converter.dart @@ -6,7 +6,7 @@ import 'package:moor/moor.dart'; /// by the sqlite backend. class MapConverter extends TypeConverter, String> { @override - Map mapToDart(fromDb) { + Map mapToDart(String fromDb) { if (fromDb == null) { return null; } @@ -14,7 +14,7 @@ class MapConverter extends TypeConverter, String> { } @override - String mapToSql(value) { + String mapToSql(Map value) { if (value == null) { return null; } diff --git a/packages/stream_chat_persistence/lib/src/dao/channel_dao.dart b/packages/stream_chat_persistence/lib/src/dao/channel_dao.dart index 57ec95d3..e75cead6 100644 --- a/packages/stream_chat_persistence/lib/src/dao/channel_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/channel_dao.dart @@ -3,7 +3,7 @@ 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/channels.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'channel_dao.g.dart'; @@ -15,15 +15,14 @@ class ChannelDao extends DatabaseAccessor ChannelDao(MoorChatDatabase db) : super(db); /// Get channel by cid - Future getChannelByCid(String cid) async { - return (select(channels)..where((c) => c.cid.equals(cid))).join([ - leftOuterJoin(users, channels.createdById.equalsExp(users.id)), - ]).map((rows) { - final channel = rows.readTable(channels); - final createdBy = rows.readTable(users); - return channel.toChannelModel(createdBy: createdBy?.toUser()); - }).getSingle(); - } + Future getChannelByCid(String cid) async => + (select(channels)..where((c) => c.cid.equals(cid))).join([ + leftOuterJoin(users, channels.createdById.equalsExp(users.id)), + ]).map((rows) { + final channel = rows.readTable(channels); + final createdBy = rows.readTable(users); + return channel.toChannelModel(createdBy: createdBy?.toUser()); + }).getSingle(); /// Delete all channels by matching cid in [cids] /// @@ -31,27 +30,22 @@ class ChannelDao extends DatabaseAccessor /// 1. Channel Reads /// 2. Channel Members /// 3. Channel Messages -> Messages Reactions - Future deleteChannelByCids(List cids) async { - return (delete(channels)..where((tbl) => tbl.cid.isIn(cids))).go(); - } + Future deleteChannelByCids(List cids) async => + (delete(channels)..where((tbl) => tbl.cid.isIn(cids))).go(); /// Get the channel cids saved in the storage - Future> get cids { - return (select(channels) - ..orderBy([(c) => OrderingTerm.desc(c.lastMessageAt)]) - ..limit(250)) - .map((c) => c.cid) - .get(); - } + Future> get cids => (select(channels) + ..orderBy([(c) => OrderingTerm.desc(c.lastMessageAt)]) + ..limit(250)) + .map((c) => c.cid) + .get(); /// Updates all the channels using the new [channelList] data - Future updateChannels(List channelList) { - return batch( - (it) => it.insertAll( - channels, - channelList.map((c) => c.toEntity()).toList(), - mode: InsertMode.insertOrReplace, - ), - ); - } + Future updateChannels(List channelList) => batch( + (it) => it.insertAll( + channels, + channelList.map((c) => c.toEntity()).toList(), + mode: InsertMode.insertOrReplace, + ), + ); } diff --git a/packages/stream_chat_persistence/lib/src/dao/channel_query_dao.dart b/packages/stream_chat_persistence/lib/src/dao/channel_query_dao.dart index b5f6fe59..785b5946 100644 --- a/packages/stream_chat_persistence/lib/src/dao/channel_query_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/channel_query_dao.dart @@ -7,7 +7,7 @@ import 'package:stream_chat_persistence/src/entity/channel_queries.dart'; import 'package:stream_chat_persistence/src/entity/channels.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'channel_query_dao.g.dart'; @@ -31,31 +31,31 @@ class ChannelQueryDao extends DatabaseAccessor /// the list of matching rows will be deleted Future updateChannelQueries( Map filter, - List cids, + List cids, { bool clearQueryCache, - ) async { - return transaction(() async { - final hash = _computeHash(filter); - if (clearQueryCache) { + }) async => + transaction(() async { + final hash = _computeHash(filter); + if (clearQueryCache) { + await batch((it) { + it.deleteWhere( + channelQueries, + (c) => c.queryHash.equals(hash), + ); + }); + } + await batch((it) { - it.deleteWhere( + it.insertAll( channelQueries, - (c) => c.queryHash.equals(hash), + cids + .map((cid) => + ChannelQueryEntity(queryHash: hash, channelCid: cid)) + .toList(), + mode: InsertMode.insertOrReplace, ); }); - } - - await batch((it) { - it.insertAll( - channelQueries, - cids.map((cid) { - return ChannelQueryEntity(queryHash: hash, channelCid: cid); - }).toList(), - mode: InsertMode.insertOrReplace, - ); }); - }); - } /// Get list of channels by filter, sort and paginationParams Future> getChannels({ @@ -70,7 +70,7 @@ class ChannelQueryDao extends DatabaseAccessor ); } return true; - }()); + }(), ''); final hash = _computeHash(filter); final cachedChannelCids = await (select(channelQueries) @@ -89,10 +89,11 @@ class ChannelQueryDao extends DatabaseAccessor })).get(); final possibleSortingFields = cachedChannels.fold>( - ChannelModel.topLevelFields, (previousValue, element) { - return {...previousValue, ...element.extraData.keys}.toList(); - }); + ChannelModel.topLevelFields, + (previousValue, element) => + {...previousValue, ...element.extraData.keys}.toList()); + // ignore: parameter_assignments sort = sort ?.where((s) => possibleSortingFields.contains(s.field)) ?.toList(growable: false); diff --git a/packages/stream_chat_persistence/lib/src/dao/connection_event_dao.dart b/packages/stream_chat_persistence/lib/src/dao/connection_event_dao.dart index 92764b10..94b0d333 100644 --- a/packages/stream_chat_persistence/lib/src/dao/connection_event_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/connection_event_dao.dart @@ -4,7 +4,7 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/connection_events.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'connection_event_dao.g.dart'; @@ -16,43 +16,38 @@ class ConnectionEventDao extends DatabaseAccessor ConnectionEventDao(MoorChatDatabase db) : super(db); /// Get the latest stored connection event - Future get connectionEvent { - return select(connectionEvents).map((eventEntity) { - return eventEntity.toEvent(); - }).getSingle(); - } + Future get connectionEvent => select(connectionEvents) + .map((eventEntity) => eventEntity.toEvent()) + .getSingle(); /// Get the latest stored lastSyncAt - Future get lastSyncAt { - return select(connectionEvents).getSingle().then((r) => r?.lastSyncAt); - } + Future get lastSyncAt => + select(connectionEvents).getSingle().then((r) => r?.lastSyncAt); /// Update stored connection event with latest data - Future updateConnectionEvent(Event event) async { - return transaction(() async { - final connectionInfo = await select(connectionEvents).getSingle(); - await into(connectionEvents).insert( - ConnectionEventEntity( - id: 1, - lastSyncAt: connectionInfo?.lastSyncAt, - lastEventAt: event.createdAt ?? connectionInfo?.lastEventAt, - totalUnreadCount: - event.totalUnreadCount ?? connectionInfo?.totalUnreadCount, - ownUser: event.me?.toJson() ?? connectionInfo?.ownUser, - unreadChannels: - event.unreadChannels ?? connectionInfo?.unreadChannels, - ), - mode: InsertMode.insertOrReplace, - ); - }); - } + Future updateConnectionEvent(Event event) async => + transaction(() async { + final connectionInfo = await select(connectionEvents).getSingle(); + await into(connectionEvents).insert( + ConnectionEventEntity( + id: 1, + lastSyncAt: connectionInfo?.lastSyncAt, + lastEventAt: event.createdAt ?? connectionInfo?.lastEventAt, + totalUnreadCount: + event.totalUnreadCount ?? connectionInfo?.totalUnreadCount, + ownUser: event.me?.toJson() ?? connectionInfo?.ownUser, + unreadChannels: + event.unreadChannels ?? connectionInfo?.unreadChannels, + ), + mode: InsertMode.insertOrReplace, + ); + }); /// Update stored lastSyncAt with latest data - Future updateLastSyncAt(DateTime lastSyncAt) async { - return (update(connectionEvents)..where((tbl) => tbl.id.equals(1))).write( - ConnectionEventsCompanion( - lastSyncAt: Value(lastSyncAt), - ), - ); - } + Future updateLastSyncAt(DateTime lastSyncAt) async => + (update(connectionEvents)..where((tbl) => tbl.id.equals(1))).write( + ConnectionEventsCompanion( + lastSyncAt: Value(lastSyncAt), + ), + ); } diff --git a/packages/stream_chat_persistence/lib/src/dao/dao.dart b/packages/stream_chat_persistence/lib/src/dao/dao.dart index 31953630..53c2f372 100644 --- a/packages/stream_chat_persistence/lib/src/dao/dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/dao.dart @@ -1,9 +1,9 @@ -export 'user_dao.dart'; export 'channel_dao.dart'; +export 'channel_query_dao.dart'; +export 'connection_event_dao.dart'; +export 'member_dao.dart'; export 'message_dao.dart'; export 'pinned_message_dao.dart'; -export 'member_dao.dart'; -export 'connection_event_dao.dart'; export 'reaction_dao.dart'; export 'read_dao.dart'; -export 'channel_query_dao.dart'; +export 'user_dao.dart'; 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 ed30a931..e6c03996 100644 --- a/packages/stream_chat_persistence/lib/src/dao/member_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/member_dao.dart @@ -5,7 +5,7 @@ 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 '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'member_dao.g.dart'; @@ -17,37 +17,33 @@ class MemberDao extends DatabaseAccessor MemberDao(MoorChatDatabase db) : super(db); /// Get all members where [Members.channelCid] matches [cid] - Future> getMembersByCid(String cid) async { - return (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(); - } + 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) async { - return batch( - (it) => it.insertAll( - members, - memberList.map((m) => m.toEntity(cid: cid)).toList(), - mode: InsertMode.insertOrReplace, - ), - ); - } + Future updateMembers(String cid, List memberList) async => + batch( + (it) => it.insertAll( + members, + memberList.map((m) => m.toEntity(cid: cid)).toList(), + mode: InsertMode.insertOrReplace, + ), + ); /// 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), - ); - }); - } + Future deleteMemberByCids(List cids) async => 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 204daaed..0be4446b 100644 --- a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart @@ -4,7 +4,7 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/messages.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'message_dao.g.dart'; @@ -25,17 +25,15 @@ class MessageDao extends DatabaseAccessor /// /// This will automatically delete the following linked records /// 1. Message Reactions - Future deleteMessageByIds(List messageIds) { - return (delete(messages)..where((tbl) => tbl.id.isIn(messageIds))).go(); - } + Future deleteMessageByIds(List messageIds) => + (delete(messages)..where((tbl) => tbl.id.isIn(messageIds))).go(); /// Removes all the messages by matching [Messages.channelCid] in [cids] /// /// This will automatically delete the following linked records /// 1. Message Reactions - Future deleteMessageByCids(List cids) async { - return (delete(messages)..where((tbl) => tbl.channelCid.isIn(cids))).go(); - } + Future deleteMessageByCids(List cids) async => + (delete(messages)..where((tbl) => tbl.channelCid.isIn(cids))).go(); Future _messageFromJoinRow(TypedResult rows) async { final userEntity = rows.readTable(_users); @@ -60,31 +58,29 @@ class MessageDao extends DatabaseAccessor } /// 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)), - leftOuterJoin( - _pinnedByUsers, messages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), - ]) - ..where(messages.id.equals(id))) - .map(_messageFromJoinRow) - .getSingle(); - } + Future getMessageById(String id) async => + await (select(messages).join([ + leftOuterJoin(_users, messages.userId.equalsExp(_users.id)), + leftOuterJoin(_pinnedByUsers, + messages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), + ]) + ..where(messages.id.equals(id))) + .map(_messageFromJoinRow) + .getSingle(); /// Returns all the messages of a particular thread by matching /// [Messages.channelCid] with [cid] - Future> getThreadMessages(String cid) async { - return Future.wait(await (select(messages).join([ - leftOuterJoin(users, messages.userId.equalsExp(_users.id)), - leftOuterJoin( - _pinnedByUsers, messages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), - ]) - ..where(messages.channelCid.equals(cid)) - ..where(isNotNull(messages.parentId)) - ..orderBy([OrderingTerm.asc(messages.createdAt)])) - .map(_messageFromJoinRow) - .get()); - } + Future> getThreadMessages(String cid) async => + Future.wait(await (select(messages).join([ + leftOuterJoin(users, messages.userId.equalsExp(_users.id)), + leftOuterJoin(_pinnedByUsers, + messages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), + ]) + ..where(messages.channelCid.equals(cid)) + ..where(isNotNull(messages.parentId)) + ..orderBy([OrderingTerm.asc(messages.createdAt)])) + .map(_messageFromJoinRow) + .get()); /// Returns all the messages of a particular thread by matching /// [Messages.parentId] with [parentId] diff --git a/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart b/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart index edf8e438..5e0ae721 100644 --- a/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart @@ -4,7 +4,7 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/pinned_messages.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'pinned_message_dao.g.dart'; @@ -25,19 +25,15 @@ class PinnedMessageDao extends DatabaseAccessor /// /// This will automatically delete the following linked records /// 1. Message Reactions - Future deleteMessageByIds(List messageIds) { - return (delete(pinnedMessages)..where((tbl) => tbl.id.isIn(messageIds))) - .go(); - } + Future deleteMessageByIds(List messageIds) => + (delete(pinnedMessages)..where((tbl) => tbl.id.isIn(messageIds))).go(); /// Removes all the messages by matching [PinnedMessages.channelCid] in [cids] /// /// This will automatically delete the following linked records /// 1. Message Reactions - Future deleteMessageByCids(List cids) async { - return (delete(pinnedMessages)..where((tbl) => tbl.channelCid.isIn(cids))) - .go(); - } + Future deleteMessageByCids(List cids) async => + (delete(pinnedMessages)..where((tbl) => tbl.channelCid.isIn(cids))).go(); Future _messageFromJoinRow(TypedResult rows) async { final userEntity = rows.readTable(users); @@ -62,31 +58,29 @@ class PinnedMessageDao extends DatabaseAccessor } /// Returns a single message by matching the [PinnedMessages.id] with [id] - Future getMessageById(String id) async { - return await (select(pinnedMessages).join([ - leftOuterJoin(_users, pinnedMessages.userId.equalsExp(_users.id)), - leftOuterJoin(_pinnedByUsers, - pinnedMessages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), - ]) - ..where(pinnedMessages.id.equals(id))) - .map(_messageFromJoinRow) - .getSingle(); - } + Future getMessageById(String id) async => + await (select(pinnedMessages).join([ + leftOuterJoin(_users, pinnedMessages.userId.equalsExp(_users.id)), + leftOuterJoin(_pinnedByUsers, + pinnedMessages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), + ]) + ..where(pinnedMessages.id.equals(id))) + .map(_messageFromJoinRow) + .getSingle(); /// Returns all the messages of a particular thread by matching /// [PinnedMessages.channelCid] with [cid] - Future> getThreadMessages(String cid) async { - return Future.wait(await (select(pinnedMessages).join([ - leftOuterJoin(_users, pinnedMessages.userId.equalsExp(_users.id)), - leftOuterJoin(_pinnedByUsers, - pinnedMessages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), - ]) - ..where(pinnedMessages.channelCid.equals(cid)) - ..where(isNotNull(pinnedMessages.parentId)) - ..orderBy([OrderingTerm.asc(pinnedMessages.createdAt)])) - .map(_messageFromJoinRow) - .get()); - } + Future> getThreadMessages(String cid) async => + Future.wait(await (select(pinnedMessages).join([ + leftOuterJoin(_users, pinnedMessages.userId.equalsExp(_users.id)), + leftOuterJoin(_pinnedByUsers, + pinnedMessages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), + ]) + ..where(pinnedMessages.channelCid.equals(cid)) + ..where(isNotNull(pinnedMessages.parentId)) + ..orderBy([OrderingTerm.asc(pinnedMessages.createdAt)])) + .map(_messageFromJoinRow) + .get()); /// Returns all the messages of a particular thread by matching /// [PinnedMessages.parentId] with [parentId] 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 99053fca..ef06326a 100644 --- a/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart @@ -3,7 +3,7 @@ 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/reactions.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'reaction_dao.g.dart'; @@ -16,18 +16,17 @@ class ReactionDao extends DatabaseAccessor /// Returns all the reactions of a particular message by matching /// [Reactions.messageId] with [messageId] - Future> getReactions(String messageId) { - return (select(reactions).join([ - leftOuterJoin(users, reactions.userId.equalsExp(users.id)), - ]) - ..where(reactions.messageId.equals(messageId)) - ..orderBy([OrderingTerm.asc(reactions.createdAt)])) - .map((rows) { - final userEntity = rows.readTable(users); - final reactionEntity = rows.readTable(reactions); - return reactionEntity.toReaction(user: userEntity?.toUser()); - }).get(); - } + Future> getReactions(String messageId) => + (select(reactions).join([ + leftOuterJoin(users, reactions.userId.equalsExp(users.id)), + ]) + ..where(reactions.messageId.equals(messageId)) + ..orderBy([OrderingTerm.asc(reactions.createdAt)])) + .map((rows) { + final userEntity = rows.readTable(users); + final reactionEntity = rows.readTable(reactions); + return reactionEntity.toReaction(user: userEntity?.toUser()); + }).get(); /// Returns all the reactions of a particular message /// added by a particular user by matching @@ -42,23 +41,21 @@ class ReactionDao extends DatabaseAccessor } /// Updates the reactions data with the new [reactionList] data - Future updateReactions(List reactionList) { - return batch((it) { - it.insertAll( - reactions, - reactionList.map((r) => r.toEntity()).toList(), - mode: InsertMode.insertOrReplace, - ); - }); - } + Future updateReactions(List reactionList) => batch((it) { + it.insertAll( + reactions, + reactionList.map((r) => r.toEntity()).toList(), + mode: InsertMode.insertOrReplace, + ); + }); - /// 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), - ); - }); - } + /// Deletes all the reactions whose [Reactions.messageId] is + /// present in [messageIds] + Future deleteReactionsByMessageIds(List messageIds) => + 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 c78cab07..95e23d8b 100644 --- a/packages/stream_chat_persistence/lib/src/dao/read_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/read_dao.dart @@ -3,7 +3,7 @@ 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 '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'read_dao.g.dart'; @@ -14,30 +14,26 @@ class ReadDao extends DatabaseAccessor with _$ReadDaoMixin { ReadDao(MoorChatDatabase db) : super(db); /// Get all reads where [Reads.channelCid] matches [cid] - Future> getReadsByCid(String cid) async { - return (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(); - } + 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) { - return batch( - (it) => it.insertAll( - reads, - readList.map((r) => r.toEntity(cid: cid)).toList(), - mode: InsertMode.insertOrReplace, - ), - ); - } + Future updateReads(String cid, List readList) => batch( + (it) => it.insertAll( + reads, + readList.map((r) => r.toEntity(cid: cid)).toList(), + mode: InsertMode.insertOrReplace, + ), + ); } diff --git a/packages/stream_chat_persistence/lib/src/dao/user_dao.dart b/packages/stream_chat_persistence/lib/src/dao/user_dao.dart index 795c7968..65ce1521 100644 --- a/packages/stream_chat_persistence/lib/src/dao/user_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/user_dao.dart @@ -2,7 +2,7 @@ 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/users.dart'; -import '../mapper/user_mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/user_mapper.dart'; part 'user_dao.g.dart'; @@ -13,13 +13,11 @@ class UserDao extends DatabaseAccessor with _$UserDaoMixin { UserDao(MoorChatDatabase db) : super(db); /// Updates the users data with the new [userList] data - Future updateUsers(List userList) { - return batch( - (it) => it.insertAll( - users, - userList.map((u) => u.toEntity()).toList(), - mode: InsertMode.insertOrReplace, - ), - ); - } + Future updateUsers(List userList) => batch( + (it) => it.insertAll( + users, + userList.map((u) => u.toEntity()).toList(), + mode: InsertMode.insertOrReplace, + ), + ); } diff --git a/packages/stream_chat_persistence/lib/src/db/moor_chat_database.dart b/packages/stream_chat_persistence/lib/src/db/moor_chat_database.dart index 57348330..cc3e86b3 100644 --- a/packages/stream_chat_persistence/lib/src/db/moor_chat_database.dart +++ b/packages/stream_chat_persistence/lib/src/db/moor_chat_database.dart @@ -13,15 +13,12 @@ LazyDatabase _openConnection( String userId, { bool logStatements = false, bool persistOnDisk = true, -}) { - return LazyDatabase(() async { - return await SharedDB.constructDatabase( - userId, - logStatements: logStatements, - persistOnDisk: persistOnDisk, - ); - }); -} +}) => + LazyDatabase(() async => SharedDB.constructDatabase( + userId, + logStatements: logStatements, + persistOnDisk: persistOnDisk, + )); /// A chat database implemented using moor @UseMoor(tables: [ diff --git a/packages/stream_chat_persistence/lib/src/db/shared/native_db.dart b/packages/stream_chat_persistence/lib/src/db/shared/native_db.dart index 9580ae50..7592247e 100644 --- a/packages/stream_chat_persistence/lib/src/db/shared/native_db.dart +++ b/packages/stream_chat_persistence/lib/src/db/shared/native_db.dart @@ -9,7 +9,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:stream_chat_persistence/src/stream_chat_persistence_client.dart'; import 'package:stream_chat_persistence/stream_chat_persistence.dart'; -import '../moor_chat_database.dart'; +import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// A Helper class to construct new instances of [MoorChatDatabase] specifically /// for native platform applications @@ -40,12 +40,10 @@ class SharedDB { } static void _startBackground(_IsolateStartRequest request) { - final executor = LazyDatabase(() async { - return VmDatabase( - File(request.targetPath), - logStatements: request.logStatements, - ); - }); + final executor = LazyDatabase(() async => VmDatabase( + File(request.targetPath), + logStatements: request.logStatements, + )); final moorIsolate = MoorIsolate.inCurrent( () => DatabaseConnection.fromExecutor(executor), ); @@ -69,7 +67,7 @@ class SharedDB { ), ); - return (await receivePort.first as MoorIsolate); + return await receivePort.first as MoorIsolate; } /// Returns a new instance of [MoorChatDatabase] using the factory constructor @@ -84,7 +82,7 @@ class SharedDB { return MoorChatDatabase.connect( userId, DatabaseConnection.delayed(Future(() async { - MoorIsolate isolate = await _createMoorIsolate( + final isolate = await _createMoorIsolate( dbName, logStatements: logStatements, ); @@ -95,13 +93,13 @@ class SharedDB { } class _IsolateStartRequest { - final SendPort sendMoorIsolate; - final String targetPath; - final bool logStatements; - const _IsolateStartRequest( this.sendMoorIsolate, this.targetPath, { this.logStatements = false, }); + + final SendPort sendMoorIsolate; + final String targetPath; + final bool logStatements; } diff --git a/packages/stream_chat_persistence/lib/src/db/shared/unsupported_db.dart b/packages/stream_chat_persistence/lib/src/db/shared/unsupported_db.dart index 811e5cc7..3a764d24 100644 --- a/packages/stream_chat_persistence/lib/src/db/shared/unsupported_db.dart +++ b/packages/stream_chat_persistence/lib/src/db/shared/unsupported_db.dart @@ -12,7 +12,8 @@ class SharedDB { bool logStatements = false, bool persistOnDisk = true, }) { - throw 'Unsupported Platform'; + throw UnsupportedError( + 'No implementation of the constructDatabase api provided'); } /// Return a new instance of moor chat database. @@ -22,6 +23,7 @@ class SharedDB { String userId, { bool logStatements = false, }) { - throw 'Unsupported Platform'; + throw UnsupportedError( + 'No implementation of the constructMoorChatDatabase api provided'); } } diff --git a/packages/stream_chat_persistence/lib/src/db/shared/web_db.dart b/packages/stream_chat_persistence/lib/src/db/shared/web_db.dart index f44a41ec..32b108ba 100644 --- a/packages/stream_chat_persistence/lib/src/db/shared/web_db.dart +++ b/packages/stream_chat_persistence/lib/src/db/shared/web_db.dart @@ -1,7 +1,7 @@ import 'package:moor/moor_web.dart'; import 'package:stream_chat_persistence/src/stream_chat_persistence_client.dart'; -import '../moor_chat_database.dart'; +import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// A Helper class to construct new instances of [MoorChatDatabase] specifically /// for Web applications diff --git a/packages/stream_chat_persistence/lib/src/entity/entity.dart b/packages/stream_chat_persistence/lib/src/entity/entity.dart index ca9d04cb..d5218768 100644 --- a/packages/stream_chat_persistence/lib/src/entity/entity.dart +++ b/packages/stream_chat_persistence/lib/src/entity/entity.dart @@ -1,9 +1,9 @@ +export 'channel_queries.dart'; export 'channels.dart'; +export 'connection_events.dart'; +export 'members.dart'; export 'messages.dart'; export 'pinned_messages.dart'; export 'reactions.dart'; -export 'users.dart'; -export 'members.dart'; export 'reads.dart'; -export 'channel_queries.dart'; -export 'connection_events.dart'; +export 'users.dart'; diff --git a/packages/stream_chat_persistence/lib/src/entity/pinned_messages.dart b/packages/stream_chat_persistence/lib/src/entity/pinned_messages.dart index f6956f54..de081552 100644 --- a/packages/stream_chat_persistence/lib/src/entity/pinned_messages.dart +++ b/packages/stream_chat_persistence/lib/src/entity/pinned_messages.dart @@ -1,6 +1,6 @@ import 'package:moor/moor.dart'; -import 'messages.dart'; +import 'package:stream_chat_persistence/src/entity/messages.dart'; /// Represents a [PinnedMessages] table in [MoorChatDatabase]. @DataClassName('PinnedMessageEntity') 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 3e2520fb..5c8e3e2a 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/channel_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/channel_mapper.dart @@ -29,34 +29,31 @@ extension ChannelEntityX on ChannelEntity { List reads, List messages, List pinnedMessages, - }) { - return ChannelState( - members: members, - read: reads, - messages: messages, - pinnedMessages: pinnedMessages, - channel: toChannelModel(createdBy: createdBy), - ); - } + }) => + ChannelState( + members: members, + read: reads, + messages: messages, + pinnedMessages: pinnedMessages, + channel: toChannelModel(createdBy: createdBy), + ); } /// Useful mapping functions for [ChannelModel] extension ChannelModelX on ChannelModel { /// Maps a [ChannelModel] into [ChannelEntity] - ChannelEntity toEntity() { - return ChannelEntity( - id: id, - type: type, - cid: cid, - config: config.toJson(), - frozen: frozen, - lastMessageAt: lastMessageAt, - createdAt: createdAt, - updatedAt: updatedAt, - deletedAt: deletedAt, - memberCount: memberCount, - createdById: createdBy.id, - extraData: extraData, - ); - } + ChannelEntity toEntity() => ChannelEntity( + id: id, + type: type, + cid: cid, + config: config.toJson(), + frozen: frozen, + lastMessageAt: lastMessageAt, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + memberCount: memberCount, + createdById: createdBy.id, + extraData: extraData, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/event_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/event_mapper.dart index 7bc1739c..fc2a57ba 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/event_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/event_mapper.dart @@ -4,11 +4,9 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// Useful mapping functions for [ConnectionEventEntity] extension ConnectionEventX on ConnectionEventEntity { /// Maps a [ConnectionEventEntity] into [Event] - Event toEvent() { - return Event( - me: ownUser != null ? OwnUser.fromJson(ownUser) : null, - totalUnreadCount: totalUnreadCount, - unreadChannels: unreadChannels, - ); - } + Event toEvent() => Event( + me: ownUser != null ? OwnUser.fromJson(ownUser) : null, + totalUnreadCount: totalUnreadCount, + unreadChannels: unreadChannels, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/mapper.dart index cdc31e05..66bf3cda 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/mapper.dart @@ -1,8 +1,8 @@ -export 'user_mapper.dart'; -export 'reaction_mapper.dart'; export 'channel_mapper.dart'; export 'event_mapper.dart'; export 'member_mapper.dart'; -export 'read_mapper.dart'; export 'message_mapper.dart'; export 'pinned_message_mapper.dart'; +export 'reaction_mapper.dart'; +export 'read_mapper.dart'; +export 'user_mapper.dart'; diff --git a/packages/stream_chat_persistence/lib/src/mapper/member_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/member_mapper.dart index 2d32c9f1..cbdcc297 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/member_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/member_mapper.dart @@ -4,39 +4,35 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// Useful mapping functions for [MemberEntity] extension MemberEntityX on MemberEntity { /// Maps a [MemberEntity] into [Member] - Member toMember({User user}) { - return Member( - user: user, - userId: userId, - banned: banned, - shadowBanned: shadowBanned, - updatedAt: updatedAt, - createdAt: createdAt, - role: role, - inviteAcceptedAt: inviteAcceptedAt, - invited: invited, - inviteRejectedAt: inviteRejectedAt, - isModerator: isModerator, - ); - } + Member toMember({User user}) => Member( + user: user, + userId: userId, + banned: banned, + shadowBanned: shadowBanned, + updatedAt: updatedAt, + createdAt: createdAt, + role: role, + inviteAcceptedAt: inviteAcceptedAt, + invited: invited, + inviteRejectedAt: inviteRejectedAt, + isModerator: isModerator, + ); } /// Useful mapping functions for [Member] extension MemberX on Member { /// Maps a [Member] into [MemberEntity] - MemberEntity toEntity({String cid}) { - return MemberEntity( - userId: user?.id, - banned: banned, - shadowBanned: shadowBanned, - channelCid: cid, - createdAt: createdAt, - isModerator: isModerator, - inviteRejectedAt: inviteRejectedAt, - invited: invited, - inviteAcceptedAt: inviteAcceptedAt, - role: role, - updatedAt: updatedAt, - ); - } + MemberEntity toEntity({String cid}) => MemberEntity( + userId: user?.id, + banned: banned, + shadowBanned: shadowBanned, + channelCid: cid, + createdAt: createdAt, + isModerator: isModerator, + inviteRejectedAt: inviteRejectedAt, + invited: invited, + inviteAcceptedAt: inviteAcceptedAt, + role: role, + updatedAt: updatedAt, + ); } 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 5acf1a84..fdf93cc5 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart @@ -12,70 +12,66 @@ extension MessageEntityX on MessageEntity { List latestReactions, List ownReactions, Message quotedMessage, - }) { - return Message( - shadowed: shadowed, - latestReactions: latestReactions, - ownReactions: ownReactions, - attachments: attachments?.map((it) { - final json = jsonDecode(it); - return Attachment.fromData(json); - })?.toList(), - createdAt: createdAt, - extraData: extraData, - updatedAt: updatedAt, - id: id, - type: type, - status: status, - command: command, - parentId: parentId, - quotedMessageId: quotedMessageId, - quotedMessage: quotedMessage, - reactionCounts: reactionCounts, - reactionScores: reactionScores, - replyCount: replyCount, - showInChannel: showInChannel, - text: messageText, - user: user, - deletedAt: deletedAt, - pinned: pinned, - pinnedAt: pinnedAt, - pinExpires: pinExpires, - pinnedBy: pinnedBy, - ); - } + }) => + Message( + shadowed: shadowed, + latestReactions: latestReactions, + ownReactions: ownReactions, + attachments: attachments?.map((it) { + final json = jsonDecode(it); + return Attachment.fromData(json); + })?.toList(), + createdAt: createdAt, + extraData: extraData, + updatedAt: updatedAt, + id: id, + type: type, + status: status, + command: command, + parentId: parentId, + quotedMessageId: quotedMessageId, + quotedMessage: quotedMessage, + reactionCounts: reactionCounts, + reactionScores: reactionScores, + replyCount: replyCount, + showInChannel: showInChannel, + text: messageText, + user: user, + deletedAt: deletedAt, + pinned: pinned, + pinnedAt: pinnedAt, + pinExpires: pinExpires, + pinnedBy: pinnedBy, + ); } /// Useful mapping functions for [Message] extension MessageX on Message { /// Maps a [Message] into [MessageEntity] - MessageEntity toEntity({String cid}) { - return MessageEntity( - id: id, - attachments: attachments?.map((it) { - return jsonEncode(it.toData()); - })?.toList(), - channelCid: cid, - type: type, - parentId: parentId, - quotedMessageId: quotedMessageId, - command: command, - createdAt: createdAt, - shadowed: shadowed, - showInChannel: showInChannel, - replyCount: replyCount, - reactionScores: reactionScores, - reactionCounts: reactionCounts, - status: status, - updatedAt: updatedAt, - extraData: extraData, - userId: user?.id, - deletedAt: deletedAt, - messageText: text, - pinned: pinned, - pinnedAt: pinnedAt, - pinExpires: pinExpires, - pinnedByUserId: pinnedBy?.id, - ); - } + MessageEntity toEntity({String cid}) => MessageEntity( + id: id, + attachments: + attachments?.map((it) => jsonEncode(it.toData()))?.toList(), + channelCid: cid, + type: type, + parentId: parentId, + quotedMessageId: quotedMessageId, + command: command, + createdAt: createdAt, + shadowed: shadowed, + showInChannel: showInChannel, + replyCount: replyCount, + reactionScores: reactionScores, + reactionCounts: reactionCounts, + status: status, + updatedAt: updatedAt, + extraData: extraData, + userId: user?.id, + deletedAt: deletedAt, + messageText: text, + pinned: pinned, + pinnedAt: pinnedAt, + pinExpires: pinExpires, + pinnedByUserId: pinnedBy?.id, + ); } 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 1abe896f..ec2a0e91 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 @@ -12,70 +12,66 @@ extension PinnedMessageEntityX on PinnedMessageEntity { List latestReactions, List ownReactions, Message quotedMessage, - }) { - return Message( - shadowed: shadowed, - latestReactions: latestReactions, - ownReactions: ownReactions, - attachments: attachments?.map((it) { - final json = jsonDecode(it); - return Attachment.fromData(json); - })?.toList(), - createdAt: createdAt, - extraData: extraData, - updatedAt: updatedAt, - id: id, - type: type, - status: status, - command: command, - parentId: parentId, - quotedMessageId: quotedMessageId, - quotedMessage: quotedMessage, - reactionCounts: reactionCounts, - reactionScores: reactionScores, - replyCount: replyCount, - showInChannel: showInChannel, - text: messageText, - user: user, - deletedAt: deletedAt, - pinned: pinned, - pinnedAt: pinnedAt, - pinExpires: pinExpires, - pinnedBy: pinnedBy, - ); - } + }) => + Message( + shadowed: shadowed, + latestReactions: latestReactions, + ownReactions: ownReactions, + attachments: attachments?.map((it) { + final json = jsonDecode(it); + return Attachment.fromData(json); + })?.toList(), + createdAt: createdAt, + extraData: extraData, + updatedAt: updatedAt, + id: id, + type: type, + status: status, + command: command, + parentId: parentId, + quotedMessageId: quotedMessageId, + quotedMessage: quotedMessage, + reactionCounts: reactionCounts, + reactionScores: reactionScores, + replyCount: replyCount, + showInChannel: showInChannel, + text: messageText, + user: user, + deletedAt: deletedAt, + pinned: pinned, + pinnedAt: pinnedAt, + pinExpires: pinExpires, + pinnedBy: pinnedBy, + ); } /// Useful mapping functions for [Message] extension PMessageX on Message { /// Maps a [Message] into [PinnedMessageEntity] - PinnedMessageEntity toPinnedEntity({String cid}) { - return PinnedMessageEntity( - id: id, - attachments: attachments?.map((it) { - return jsonEncode(it.toData()); - })?.toList(), - channelCid: cid, - type: type, - parentId: parentId, - quotedMessageId: quotedMessageId, - command: command, - createdAt: createdAt, - shadowed: shadowed, - showInChannel: showInChannel, - replyCount: replyCount, - reactionScores: reactionScores, - reactionCounts: reactionCounts, - status: status, - updatedAt: updatedAt, - extraData: extraData, - userId: user?.id, - deletedAt: deletedAt, - messageText: text, - pinned: pinned, - pinnedAt: pinnedAt, - pinExpires: pinExpires, - pinnedByUserId: pinnedBy?.id, - ); - } + PinnedMessageEntity toPinnedEntity({String cid}) => PinnedMessageEntity( + id: id, + attachments: + attachments?.map((it) => jsonEncode(it.toData()))?.toList(), + channelCid: cid, + type: type, + parentId: parentId, + quotedMessageId: quotedMessageId, + command: command, + createdAt: createdAt, + shadowed: shadowed, + showInChannel: showInChannel, + replyCount: replyCount, + reactionScores: reactionScores, + reactionCounts: reactionCounts, + status: status, + updatedAt: updatedAt, + extraData: extraData, + userId: user?.id, + deletedAt: deletedAt, + messageText: text, + pinned: pinned, + pinnedAt: pinnedAt, + pinExpires: pinExpires, + pinnedByUserId: pinnedBy?.id, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/reaction_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/reaction_mapper.dart index d265fcb7..20842307 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/reaction_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/reaction_mapper.dart @@ -4,30 +4,26 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// Useful mapping functions for [ReactionEntity] extension ReactionEntityX on ReactionEntity { /// Maps a [ReactionEntity] into [Reaction] - Reaction toReaction({User user}) { - return Reaction( - extraData: extraData, - type: type, - createdAt: createdAt, - userId: userId, - user: user, - messageId: messageId, - score: score, - ); - } + Reaction toReaction({User user}) => Reaction( + extraData: extraData, + type: type, + createdAt: createdAt, + userId: userId, + user: user, + messageId: messageId, + score: score, + ); } /// Useful mapping functions for [Reaction] extension ReactionX on Reaction { /// Maps a [Reaction] into [ReactionEntity] - ReactionEntity toEntity() { - return ReactionEntity( - extraData: extraData, - type: type, - createdAt: createdAt, - userId: userId, - messageId: messageId, - score: score, - ); - } + ReactionEntity toEntity() => ReactionEntity( + extraData: extraData, + type: type, + createdAt: createdAt, + userId: userId, + messageId: messageId, + score: score, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/read_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/read_mapper.dart index c79cf8d5..9664030e 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/read_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/read_mapper.dart @@ -4,24 +4,20 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// Useful mapping functions for [ReadEntity] extension ReadEntityX on ReadEntity { /// Maps a [ReadEntity] into [Read] - Read toRead({User user}) { - return Read( - user: user, - lastRead: lastRead, - unreadMessages: unreadMessages, - ); - } + Read toRead({User user}) => Read( + user: user, + lastRead: lastRead, + unreadMessages: unreadMessages, + ); } /// Useful mapping functions for [Read] extension ReadX on Read { /// Maps a [Read] into [ReadEntity] - ReadEntity toEntity({String cid}) { - return ReadEntity( - lastRead: lastRead, - userId: user?.id, - channelCid: cid, - unreadMessages: unreadMessages, - ); - } + ReadEntity toEntity({String cid}) => ReadEntity( + lastRead: lastRead, + userId: user?.id, + channelCid: cid, + unreadMessages: unreadMessages, + ); } 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 b1e53786..533a45b1 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/user_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/user_mapper.dart @@ -4,33 +4,29 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// Useful mapping functions for [UserEntity] extension UserEntityX on UserEntity { /// Maps a [UserEntity] into [User] - User toUser() { - return User( - id: id, - updatedAt: updatedAt, - role: role, - online: online, - lastActive: lastActive, - extraData: extraData, - banned: banned, - createdAt: createdAt, - ); - } + User toUser() => User( + id: id, + updatedAt: updatedAt, + role: role, + online: online, + lastActive: lastActive, + extraData: extraData, + banned: banned, + createdAt: createdAt, + ); } /// Useful mapping functions for [User] extension UserX on User { /// Maps a [User] into [UserEntity] - UserEntity toEntity() { - return UserEntity( - id: id, - role: role, - createdAt: createdAt, - updatedAt: updatedAt, - lastActive: lastActive, - online: online, - banned: banned, - extraData: extraData, - ); - } + UserEntity toEntity() => UserEntity( + id: id, + role: role, + createdAt: createdAt, + updatedAt: updatedAt, + lastActive: lastActive, + online: online, + banned: banned, + extraData: extraData, + ); } 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 832eabbd..e7ee060b 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 @@ -3,8 +3,8 @@ import 'package:meta/meta.dart'; import 'package:mutex/mutex.dart'; import 'package:stream_chat/stream_chat.dart'; -import 'db/moor_chat_database.dart'; -import 'db/shared/shared_db.dart'; +import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; +import 'package:stream_chat_persistence/src/db/shared/shared_db.dart'; /// Various connection modes on which [StreamChatPersistenceClient] can work enum ConnectionMode { @@ -15,7 +15,7 @@ enum ConnectionMode { background, } -final levelEmojiMapper = { +final _levelEmojiMapper = { Level.INFO: 'ℹ️', Level.WARNING: '⚠️', Level.SEVERE: '🚨', @@ -29,8 +29,8 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { ConnectionMode connectionMode = ConnectionMode.regular, Level logLevel = Level.WARNING, LogHandlerFunction logHandlerFunction, - }) : assert(connectionMode != null), - assert(logLevel != null), + }) : assert(connectionMode != null, 'ConnectionMode cannot be null'), + assert(logLevel != null, 'LogLevel cannot be null'), _connectionMode = connectionMode, _logger = Logger.detached('💽')..level = logLevel { _logger.onRecord.listen(logHandlerFunction ?? _defaultLogHandler); @@ -56,8 +56,10 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { ///``` LogHandlerFunction logHandlerFunction; + /// [MoorChatDatabase] instance used by this client. @visibleForTesting MoorChatDatabase db; + final Logger _logger; final ConnectionMode _connectionMode; final _mutex = ReadWriteMutex(); @@ -65,13 +67,13 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { void _defaultLogHandler(LogRecord record) { print( '(${record.time}) ' - '${levelEmojiMapper[record.level] ?? record.level.name} ' + '${_levelEmojiMapper[record.level] ?? record.level.name} ' '${record.loggerName} ${record.message}', ); if (record.stackTrace != null) print(record.stackTrace); } - Future readProtected(Future Function() f) async { + Future _readProtected(Future Function() f) async { T ret; await _mutex.protectRead(() async { if (db == null) { @@ -103,299 +105,256 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { } @override - Future getConnectionInfo() { - return readProtected(() { - _logger.info('getConnectionInfo'); - return db.connectionEventDao.connectionEvent; - }); - } + Future getConnectionInfo() => _readProtected(() { + _logger.info('getConnectionInfo'); + return db.connectionEventDao.connectionEvent; + }); @override - Future updateConnectionInfo(Event event) { - return readProtected(() { - _logger.info('updateConnectionInfo'); - return db.connectionEventDao.updateConnectionEvent(event); - }); - } + Future updateConnectionInfo(Event event) => _readProtected(() { + _logger.info('updateConnectionInfo'); + return db.connectionEventDao.updateConnectionEvent(event); + }); @override - Future updateLastSyncAt(DateTime lastSyncAt) { - return readProtected(() { - _logger.info('updateLastSyncAt'); - return db.connectionEventDao.updateLastSyncAt(lastSyncAt); - }); - } + Future updateLastSyncAt(DateTime lastSyncAt) => _readProtected(() { + _logger.info('updateLastSyncAt'); + return db.connectionEventDao.updateLastSyncAt(lastSyncAt); + }); @override - Future getLastSyncAt() { - return readProtected(() { - _logger.info('getLastSyncAt'); - return db.connectionEventDao.lastSyncAt; - }); - } + Future getLastSyncAt() => _readProtected(() { + _logger.info('getLastSyncAt'); + return db.connectionEventDao.lastSyncAt; + }); @override - Future deleteChannels(List cids) { - return readProtected(() { - _logger.info('deleteChannels'); - return db.channelDao.deleteChannelByCids(cids); - }); - } + Future deleteChannels(List cids) => _readProtected(() { + _logger.info('deleteChannels'); + return db.channelDao.deleteChannelByCids(cids); + }); @override - Future> getChannelCids() { - return readProtected(() { - _logger.info('getChannelCids'); - return db.channelDao.cids; - }); - } + Future> getChannelCids() => _readProtected(() { + _logger.info('getChannelCids'); + return db.channelDao.cids; + }); @override - Future deleteMessageByIds(List messageIds) { - return readProtected(() { - _logger.info('deleteMessageByIds'); - return db.messageDao.deleteMessageByIds(messageIds); - }); - } + Future deleteMessageByIds(List messageIds) => + _readProtected(() { + _logger.info('deleteMessageByIds'); + return db.messageDao.deleteMessageByIds(messageIds); + }); @override - Future deletePinnedMessageByIds(List messageIds) { - return readProtected(() { - _logger.info('deletePinnedMessageByIds'); - return db.pinnedMessageDao.deleteMessageByIds(messageIds); - }); - } + Future deletePinnedMessageByIds(List messageIds) => + _readProtected(() { + _logger.info('deletePinnedMessageByIds'); + return db.pinnedMessageDao.deleteMessageByIds(messageIds); + }); @override - Future deleteMessageByCids(List cids) { - return readProtected(() { - _logger.info('deleteMessageByCids'); - return db.messageDao.deleteMessageByCids(cids); - }); - } + Future deleteMessageByCids(List cids) => _readProtected(() { + _logger.info('deleteMessageByCids'); + return db.messageDao.deleteMessageByCids(cids); + }); @override - Future deletePinnedMessageByCids(List cids) { - return readProtected(() { - _logger.info('deletePinnedMessageByCids'); - return db.pinnedMessageDao.deleteMessageByCids(cids); - }); - } + Future deletePinnedMessageByCids(List cids) => + _readProtected(() { + _logger.info('deletePinnedMessageByCids'); + return db.pinnedMessageDao.deleteMessageByCids(cids); + }); @override - Future> getMembersByCid(String cid) { - return readProtected(() { - _logger.info('getMembersByCid'); - return db.memberDao.getMembersByCid(cid); - }); - } + Future> getMembersByCid(String cid) => _readProtected(() { + _logger.info('getMembersByCid'); + return db.memberDao.getMembersByCid(cid); + }); @override - Future getChannelByCid(String cid) { - return readProtected(() { - _logger.info('getChannelByCid'); - return db.channelDao.getChannelByCid(cid); - }); - } + Future getChannelByCid(String cid) => _readProtected(() { + _logger.info('getChannelByCid'); + return db.channelDao.getChannelByCid(cid); + }); @override Future> getMessagesByCid( String cid, { PaginationParams messagePagination, - }) { - return readProtected(() { - _logger.info('getMessagesByCid'); - return db.messageDao.getMessagesByCid( - cid, - messagePagination: messagePagination, - ); - }); - } + }) => + _readProtected(() { + _logger.info('getMessagesByCid'); + return db.messageDao.getMessagesByCid( + cid, + messagePagination: messagePagination, + ); + }); @override Future> getPinnedMessagesByCid( String cid, { PaginationParams messagePagination, - }) { - return readProtected(() { - _logger.info('getPinnedMessagesByCid'); - return db.pinnedMessageDao.getMessagesByCid( - cid, - messagePagination: messagePagination, - ); - }); - } + }) => + _readProtected(() { + _logger.info('getPinnedMessagesByCid'); + return db.pinnedMessageDao.getMessagesByCid( + cid, + messagePagination: messagePagination, + ); + }); @override - Future> getReadsByCid(String cid) { - return readProtected(() { - _logger.info('getReadsByCid'); - return db.readDao.getReadsByCid(cid); - }); - } + Future> getReadsByCid(String cid) => _readProtected(() { + _logger.info('getReadsByCid'); + return db.readDao.getReadsByCid(cid); + }); @override - Future>> getChannelThreads(String cid) async { - return readProtected(() async { - _logger.info('getChannelThreads'); - final messages = await db.messageDao.getThreadMessages(cid); - final messageByParentIdDictionary = >{}; - for (final message in messages) { - final parentId = message.parentId; - messageByParentIdDictionary[parentId] = [ - ...messageByParentIdDictionary[parentId] ?? [], - message - ]; - } - return messageByParentIdDictionary; - }); - } + Future>> getChannelThreads(String cid) async => + _readProtected(() async { + _logger.info('getChannelThreads'); + final messages = await db.messageDao.getThreadMessages(cid); + final messageByParentIdDictionary = >{}; + for (final message in messages) { + final parentId = message.parentId; + messageByParentIdDictionary[parentId] = [ + ...messageByParentIdDictionary[parentId] ?? [], + message + ]; + } + return messageByParentIdDictionary; + }); @override Future> getReplies( String parentId, { PaginationParams options, - }) { - return readProtected(() async { - _logger.info('getReplies'); - return db.messageDao.getThreadMessagesByParentId( - parentId, - options: options, - ); - }); - } + }) => + _readProtected(() async { + _logger.info('getReplies'); + return db.messageDao.getThreadMessagesByParentId( + parentId, + options: options, + ); + }); @override Future> getChannelStates({ Map filter, List> sort = const [], PaginationParams paginationParams, - }) async { - return readProtected(() async { - _logger.info('getChannelStates'); - final channels = await db.channelQueryDao.getChannels( - filter: filter, - sort: sort, - paginationParams: paginationParams, - ); - return Future.wait(channels.map((e) => getChannelStateByCid(e.cid))); - }); - } + }) async => + _readProtected(() async { + _logger.info('getChannelStates'); + final channels = await db.channelQueryDao.getChannels( + filter: filter, + sort: sort, + paginationParams: paginationParams, + ); + return Future.wait(channels.map((e) => getChannelStateByCid(e.cid))); + }); @override Future updateChannelQueries( Map filter, List cids, bool clearQueryCache, - ) { - return readProtected(() async { - _logger.info('updateChannelQueries'); - return db.channelQueryDao.updateChannelQueries( - filter, - cids, - clearQueryCache, - ); - }); - } - - @override - Future updateChannels(List channels) { - return readProtected(() async { - _logger.info('updateChannels'); - return db.channelDao.updateChannels(channels); - }); - } - - @override - Future updateMembers(String cid, List members) { - return readProtected(() async { - _logger.info('updateMembers'); - return db.memberDao.updateMembers(cid, members); - }); - } - - @override - Future updateMessages(String cid, List messages) { - return readProtected(() async { - _logger.info('updateMessages'); - return db.messageDao.updateMessages(cid, messages); - }); - } - - @override - Future updatePinnedMessages(String cid, List messages) { - return readProtected(() async { - _logger.info('updatePinnedMessages'); - return db.pinnedMessageDao.updateMessages(cid, messages); - }); - } - - @override - Future updateReactions(List reactions) { - return readProtected(() async { - _logger.info('updateReactions'); - return db.reactionDao.updateReactions(reactions); - }); - } - - @override - Future updateReads(String cid, List reads) { - return readProtected(() async { - _logger.info('updateReads'); - return db.readDao.updateReads(cid, reads); - }); - } - - @override - Future updateUsers(List users) { - return readProtected(() async { - _logger.info('updateUsers'); - return db.userDao.updateUsers(users); - }); - } - - @override - Future deleteReactionsByMessageId(List messageIds) { - return readProtected(() async { - _logger.info('deleteReactionsByMessageId'); - return db.reactionDao.deleteReactionsByMessageIds(messageIds); - }); - } - - @override - Future deleteMembersByCids(List cids) { - return readProtected(() async { - _logger.info('deleteMembersByCids'); - return db.memberDao.deleteMemberByCids(cids); - }); - } - - @override - Future updateChannelStates(List channelStates) { - return readProtected(() async { - return db.transaction(() async { - await super.updateChannelStates(channelStates); + ) => + _readProtected(() async { + _logger.info('updateChannelQueries'); + return db.channelQueryDao.updateChannelQueries( + filter, + cids, + clearQueryCache: clearQueryCache, + ); }); - }); - } @override - Future disconnect({bool flush = false}) async { - return _mutex.protectWrite(() async { - _logger.info('disconnect'); - if (db != null) { - _logger.info('Disconnecting'); - if (flush) { - _logger.info('Flushing'); - await db.batch((batch) { - db.allTables.forEach((table) { - db.delete(table).go(); + Future updateChannels(List channels) => + _readProtected(() async { + _logger.info('updateChannels'); + return db.channelDao.updateChannels(channels); + }); + + @override + Future updateMembers(String cid, List members) => + _readProtected(() async { + _logger.info('updateMembers'); + return db.memberDao.updateMembers(cid, members); + }); + + @override + Future updateMessages(String cid, List messages) => + _readProtected(() async { + _logger.info('updateMessages'); + return db.messageDao.updateMessages(cid, messages); + }); + + @override + Future updatePinnedMessages(String cid, List messages) => + _readProtected(() async { + _logger.info('updatePinnedMessages'); + return db.pinnedMessageDao.updateMessages(cid, messages); + }); + + @override + Future updateReactions(List reactions) => + _readProtected(() async { + _logger.info('updateReactions'); + return db.reactionDao.updateReactions(reactions); + }); + + @override + Future updateReads(String cid, List reads) => + _readProtected(() async { + _logger.info('updateReads'); + return db.readDao.updateReads(cid, reads); + }); + + @override + Future updateUsers(List users) => _readProtected(() async { + _logger.info('updateUsers'); + return db.userDao.updateUsers(users); + }); + + @override + Future deleteReactionsByMessageId(List messageIds) => + _readProtected(() async { + _logger.info('deleteReactionsByMessageId'); + return db.reactionDao.deleteReactionsByMessageIds(messageIds); + }); + + @override + Future deleteMembersByCids(List cids) => + _readProtected(() async { + _logger.info('deleteMembersByCids'); + return db.memberDao.deleteMemberByCids(cids); + }); + + @override + Future updateChannelStates(List channelStates) => + _readProtected(() async => db.transaction(() async { + await super.updateChannelStates(channelStates); + })); + + @override + Future disconnect({bool flush = false}) async => + _mutex.protectWrite(() async { + _logger.info('disconnect'); + if (db != null) { + _logger.info('Disconnecting'); + if (flush) { + _logger.info('Flushing'); + await db.batch((batch) { + db.allTables.forEach((table) { + db.delete(table).go(); + }); }); - }); + } + await db.disconnect(); + db = null; } - await db.disconnect(); - db = null; - } - }); - } + }); } diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index 06f991e1..a91ac666 100644 --- a/packages/stream_chat_persistence/pubspec.yaml +++ b/packages/stream_chat_persistence/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: path_provider: ^1.6.27 sqlite3_flutter_libs: ^0.4.0+1 stream_chat: - git: + git: url: https://github.com/GetStream/stream-chat-flutter.git ref: develop path: packages/stream_chat