style: Apply team linter in stream chat persistence (#331)
* lint(persistence): Apply team linter Signed-off-by: Sahil Kumar <[email protected]> * style: flutter format Signed-off-by: Sahil Kumar <[email protected]>
This commit is contained in:
@@ -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
|
||||
@@ -6,7 +6,7 @@ import 'package:moor/moor.dart';
|
||||
/// by the sqlite backend.
|
||||
class ListConverter<T> extends TypeConverter<List<T>, String> {
|
||||
@override
|
||||
List<T> mapToDart(fromDb) {
|
||||
List<T> mapToDart(String fromDb) {
|
||||
if (fromDb == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -14,7 +14,7 @@ class ListConverter<T> extends TypeConverter<List<T>, String> {
|
||||
}
|
||||
|
||||
@override
|
||||
String mapToSql(value) {
|
||||
String mapToSql(List<T> value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import 'package:moor/moor.dart';
|
||||
/// by the sqlite backend.
|
||||
class MapConverter<T> extends TypeConverter<Map<String, T>, String> {
|
||||
@override
|
||||
Map<String, T> mapToDart(fromDb) {
|
||||
Map<String, T> mapToDart(String fromDb) {
|
||||
if (fromDb == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -14,7 +14,7 @@ class MapConverter<T> extends TypeConverter<Map<String, T>, String> {
|
||||
}
|
||||
|
||||
@override
|
||||
String mapToSql(value) {
|
||||
String mapToSql(Map<String, T> value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -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<MoorChatDatabase>
|
||||
ChannelDao(MoorChatDatabase db) : super(db);
|
||||
|
||||
/// Get channel by cid
|
||||
Future<ChannelModel> 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<ChannelModel> 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<MoorChatDatabase>
|
||||
/// 1. Channel Reads
|
||||
/// 2. Channel Members
|
||||
/// 3. Channel Messages -> Messages Reactions
|
||||
Future<void> deleteChannelByCids(List<String> cids) async {
|
||||
return (delete(channels)..where((tbl) => tbl.cid.isIn(cids))).go();
|
||||
}
|
||||
Future<void> deleteChannelByCids(List<String> cids) async =>
|
||||
(delete(channels)..where((tbl) => tbl.cid.isIn(cids))).go();
|
||||
|
||||
/// Get the channel cids saved in the storage
|
||||
Future<List<String>> get cids {
|
||||
return (select(channels)
|
||||
..orderBy([(c) => OrderingTerm.desc(c.lastMessageAt)])
|
||||
..limit(250))
|
||||
.map((c) => c.cid)
|
||||
.get();
|
||||
}
|
||||
Future<List<String>> 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<void> updateChannels(List<ChannelModel> channelList) {
|
||||
return batch(
|
||||
(it) => it.insertAll(
|
||||
channels,
|
||||
channelList.map((c) => c.toEntity()).toList(),
|
||||
mode: InsertMode.insertOrReplace,
|
||||
),
|
||||
);
|
||||
}
|
||||
Future<void> updateChannels(List<ChannelModel> channelList) => batch(
|
||||
(it) => it.insertAll(
|
||||
channels,
|
||||
channelList.map((c) => c.toEntity()).toList(),
|
||||
mode: InsertMode.insertOrReplace,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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<MoorChatDatabase>
|
||||
/// the list of matching rows will be deleted
|
||||
Future<void> updateChannelQueries(
|
||||
Map<String, dynamic> filter,
|
||||
List<String> cids,
|
||||
List<String> 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, ChannelQueryEntity>(
|
||||
channelQueries,
|
||||
(c) => c.queryHash.equals(hash),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
await batch((it) {
|
||||
it.deleteWhere<ChannelQueries, ChannelQueryEntity>(
|
||||
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<List<ChannelModel>> getChannels({
|
||||
@@ -70,7 +70,7 @@ class ChannelQueryDao extends DatabaseAccessor<MoorChatDatabase>
|
||||
);
|
||||
}
|
||||
return true;
|
||||
}());
|
||||
}(), '');
|
||||
|
||||
final hash = _computeHash(filter);
|
||||
final cachedChannelCids = await (select(channelQueries)
|
||||
@@ -89,10 +89,11 @@ class ChannelQueryDao extends DatabaseAccessor<MoorChatDatabase>
|
||||
})).get();
|
||||
|
||||
final possibleSortingFields = cachedChannels.fold<List<String>>(
|
||||
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);
|
||||
|
||||
@@ -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<MoorChatDatabase>
|
||||
ConnectionEventDao(MoorChatDatabase db) : super(db);
|
||||
|
||||
/// Get the latest stored connection event
|
||||
Future<Event> get connectionEvent {
|
||||
return select(connectionEvents).map((eventEntity) {
|
||||
return eventEntity.toEvent();
|
||||
}).getSingle();
|
||||
}
|
||||
Future<Event> get connectionEvent => select(connectionEvents)
|
||||
.map((eventEntity) => eventEntity.toEvent())
|
||||
.getSingle();
|
||||
|
||||
/// Get the latest stored lastSyncAt
|
||||
Future<DateTime> get lastSyncAt {
|
||||
return select(connectionEvents).getSingle().then((r) => r?.lastSyncAt);
|
||||
}
|
||||
Future<DateTime> get lastSyncAt =>
|
||||
select(connectionEvents).getSingle().then((r) => r?.lastSyncAt);
|
||||
|
||||
/// Update stored connection event with latest data
|
||||
Future<void> 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<void> 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<int> updateLastSyncAt(DateTime lastSyncAt) async {
|
||||
return (update(connectionEvents)..where((tbl) => tbl.id.equals(1))).write(
|
||||
ConnectionEventsCompanion(
|
||||
lastSyncAt: Value(lastSyncAt),
|
||||
),
|
||||
);
|
||||
}
|
||||
Future<int> updateLastSyncAt(DateTime lastSyncAt) async =>
|
||||
(update(connectionEvents)..where((tbl) => tbl.id.equals(1))).write(
|
||||
ConnectionEventsCompanion(
|
||||
lastSyncAt: Value(lastSyncAt),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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<MoorChatDatabase>
|
||||
MemberDao(MoorChatDatabase db) : super(db);
|
||||
|
||||
/// Get all members where [Members.channelCid] matches [cid]
|
||||
Future<List<Member>> 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<List<Member>> 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<void> updateMembers(String cid, List<Member> memberList) async {
|
||||
return batch(
|
||||
(it) => it.insertAll(
|
||||
members,
|
||||
memberList.map((m) => m.toEntity(cid: cid)).toList(),
|
||||
mode: InsertMode.insertOrReplace,
|
||||
),
|
||||
);
|
||||
}
|
||||
Future<void> updateMembers(String cid, List<Member> 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<void> deleteMemberByCids(List<String> cids) async {
|
||||
return batch((it) {
|
||||
it.deleteWhere<Members, MemberEntity>(
|
||||
members,
|
||||
(m) => m.channelCid.isIn(cids),
|
||||
);
|
||||
});
|
||||
}
|
||||
Future<void> deleteMemberByCids(List<String> cids) async => batch((it) {
|
||||
it.deleteWhere<Members, MemberEntity>(
|
||||
members,
|
||||
(m) => m.channelCid.isIn(cids),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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<MoorChatDatabase>
|
||||
///
|
||||
/// This will automatically delete the following linked records
|
||||
/// 1. Message Reactions
|
||||
Future<void> deleteMessageByIds(List<String> messageIds) {
|
||||
return (delete(messages)..where((tbl) => tbl.id.isIn(messageIds))).go();
|
||||
}
|
||||
Future<void> deleteMessageByIds(List<String> 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<void> deleteMessageByCids(List<String> cids) async {
|
||||
return (delete(messages)..where((tbl) => tbl.channelCid.isIn(cids))).go();
|
||||
}
|
||||
Future<void> deleteMessageByCids(List<String> cids) async =>
|
||||
(delete(messages)..where((tbl) => tbl.channelCid.isIn(cids))).go();
|
||||
|
||||
Future<Message> _messageFromJoinRow(TypedResult rows) async {
|
||||
final userEntity = rows.readTable(_users);
|
||||
@@ -60,31 +58,29 @@ class MessageDao extends DatabaseAccessor<MoorChatDatabase>
|
||||
}
|
||||
|
||||
/// Returns a single message by matching the [Messages.id] with [id]
|
||||
Future<Message> 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<Message> 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<List<Message>> 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<List<Message>> 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]
|
||||
|
||||
@@ -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<MoorChatDatabase>
|
||||
///
|
||||
/// This will automatically delete the following linked records
|
||||
/// 1. Message Reactions
|
||||
Future<void> deleteMessageByIds(List<String> messageIds) {
|
||||
return (delete(pinnedMessages)..where((tbl) => tbl.id.isIn(messageIds)))
|
||||
.go();
|
||||
}
|
||||
Future<void> deleteMessageByIds(List<String> 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<void> deleteMessageByCids(List<String> cids) async {
|
||||
return (delete(pinnedMessages)..where((tbl) => tbl.channelCid.isIn(cids)))
|
||||
.go();
|
||||
}
|
||||
Future<void> deleteMessageByCids(List<String> cids) async =>
|
||||
(delete(pinnedMessages)..where((tbl) => tbl.channelCid.isIn(cids))).go();
|
||||
|
||||
Future<Message> _messageFromJoinRow(TypedResult rows) async {
|
||||
final userEntity = rows.readTable(users);
|
||||
@@ -62,31 +58,29 @@ class PinnedMessageDao extends DatabaseAccessor<MoorChatDatabase>
|
||||
}
|
||||
|
||||
/// Returns a single message by matching the [PinnedMessages.id] with [id]
|
||||
Future<Message> 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<Message> 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<List<Message>> 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<List<Message>> 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]
|
||||
|
||||
@@ -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<MoorChatDatabase>
|
||||
|
||||
/// Returns all the reactions of a particular message by matching
|
||||
/// [Reactions.messageId] with [messageId]
|
||||
Future<List<Reaction>> 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<List<Reaction>> 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<MoorChatDatabase>
|
||||
}
|
||||
|
||||
/// Updates the reactions data with the new [reactionList] data
|
||||
Future<void> updateReactions(List<Reaction> reactionList) {
|
||||
return batch((it) {
|
||||
it.insertAll(
|
||||
reactions,
|
||||
reactionList.map((r) => r.toEntity()).toList(),
|
||||
mode: InsertMode.insertOrReplace,
|
||||
);
|
||||
});
|
||||
}
|
||||
Future<void> updateReactions(List<Reaction> 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<void> deleteReactionsByMessageIds(List<String> messageIds) {
|
||||
return batch((it) {
|
||||
it.deleteWhere<Reactions, ReactionEntity>(
|
||||
reactions,
|
||||
(r) => r.messageId.isIn(messageIds),
|
||||
);
|
||||
});
|
||||
}
|
||||
/// Deletes all the reactions whose [Reactions.messageId] is
|
||||
/// present in [messageIds]
|
||||
Future<void> deleteReactionsByMessageIds(List<String> messageIds) =>
|
||||
batch((it) {
|
||||
it.deleteWhere<Reactions, ReactionEntity>(
|
||||
reactions,
|
||||
(r) => r.messageId.isIn(messageIds),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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<MoorChatDatabase> with _$ReadDaoMixin {
|
||||
ReadDao(MoorChatDatabase db) : super(db);
|
||||
|
||||
/// Get all reads where [Reads.channelCid] matches [cid]
|
||||
Future<List<Read>> 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<List<Read>> 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<void> updateReads(String cid, List<Read> readList) {
|
||||
return batch(
|
||||
(it) => it.insertAll(
|
||||
reads,
|
||||
readList.map((r) => r.toEntity(cid: cid)).toList(),
|
||||
mode: InsertMode.insertOrReplace,
|
||||
),
|
||||
);
|
||||
}
|
||||
Future<void> updateReads(String cid, List<Read> readList) => batch(
|
||||
(it) => it.insertAll(
|
||||
reads,
|
||||
readList.map((r) => r.toEntity(cid: cid)).toList(),
|
||||
mode: InsertMode.insertOrReplace,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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<MoorChatDatabase> with _$UserDaoMixin {
|
||||
UserDao(MoorChatDatabase db) : super(db);
|
||||
|
||||
/// Updates the users data with the new [userList] data
|
||||
Future<void> updateUsers(List<User> userList) {
|
||||
return batch(
|
||||
(it) => it.insertAll(
|
||||
users,
|
||||
userList.map((u) => u.toEntity()).toList(),
|
||||
mode: InsertMode.insertOrReplace,
|
||||
),
|
||||
);
|
||||
}
|
||||
Future<void> updateUsers(List<User> userList) => batch(
|
||||
(it) => it.insertAll(
|
||||
users,
|
||||
userList.map((u) => u.toEntity()).toList(),
|
||||
mode: InsertMode.insertOrReplace,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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: [
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -29,34 +29,31 @@ extension ChannelEntityX on ChannelEntity {
|
||||
List<Read> reads,
|
||||
List<Message> messages,
|
||||
List<Message> 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,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -12,70 +12,66 @@ extension MessageEntityX on MessageEntity {
|
||||
List<Reaction> latestReactions,
|
||||
List<Reaction> 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,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -12,70 +12,66 @@ extension PinnedMessageEntityX on PinnedMessageEntity {
|
||||
List<Reaction> latestReactions,
|
||||
List<Reaction> 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,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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<T> readProtected<T>(Future<T> Function() f) async {
|
||||
Future<T> _readProtected<T>(Future<T> Function() f) async {
|
||||
T ret;
|
||||
await _mutex.protectRead(() async {
|
||||
if (db == null) {
|
||||
@@ -103,299 +105,256 @@ class StreamChatPersistenceClient extends ChatPersistenceClient {
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Event> getConnectionInfo() {
|
||||
return readProtected(() {
|
||||
_logger.info('getConnectionInfo');
|
||||
return db.connectionEventDao.connectionEvent;
|
||||
});
|
||||
}
|
||||
Future<Event> getConnectionInfo() => _readProtected(() {
|
||||
_logger.info('getConnectionInfo');
|
||||
return db.connectionEventDao.connectionEvent;
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> updateConnectionInfo(Event event) {
|
||||
return readProtected(() {
|
||||
_logger.info('updateConnectionInfo');
|
||||
return db.connectionEventDao.updateConnectionEvent(event);
|
||||
});
|
||||
}
|
||||
Future<void> updateConnectionInfo(Event event) => _readProtected(() {
|
||||
_logger.info('updateConnectionInfo');
|
||||
return db.connectionEventDao.updateConnectionEvent(event);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> updateLastSyncAt(DateTime lastSyncAt) {
|
||||
return readProtected(() {
|
||||
_logger.info('updateLastSyncAt');
|
||||
return db.connectionEventDao.updateLastSyncAt(lastSyncAt);
|
||||
});
|
||||
}
|
||||
Future<void> updateLastSyncAt(DateTime lastSyncAt) => _readProtected(() {
|
||||
_logger.info('updateLastSyncAt');
|
||||
return db.connectionEventDao.updateLastSyncAt(lastSyncAt);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<DateTime> getLastSyncAt() {
|
||||
return readProtected(() {
|
||||
_logger.info('getLastSyncAt');
|
||||
return db.connectionEventDao.lastSyncAt;
|
||||
});
|
||||
}
|
||||
Future<DateTime> getLastSyncAt() => _readProtected(() {
|
||||
_logger.info('getLastSyncAt');
|
||||
return db.connectionEventDao.lastSyncAt;
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> deleteChannels(List<String> cids) {
|
||||
return readProtected(() {
|
||||
_logger.info('deleteChannels');
|
||||
return db.channelDao.deleteChannelByCids(cids);
|
||||
});
|
||||
}
|
||||
Future<void> deleteChannels(List<String> cids) => _readProtected(() {
|
||||
_logger.info('deleteChannels');
|
||||
return db.channelDao.deleteChannelByCids(cids);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<List<String>> getChannelCids() {
|
||||
return readProtected(() {
|
||||
_logger.info('getChannelCids');
|
||||
return db.channelDao.cids;
|
||||
});
|
||||
}
|
||||
Future<List<String>> getChannelCids() => _readProtected(() {
|
||||
_logger.info('getChannelCids');
|
||||
return db.channelDao.cids;
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> deleteMessageByIds(List<String> messageIds) {
|
||||
return readProtected(() {
|
||||
_logger.info('deleteMessageByIds');
|
||||
return db.messageDao.deleteMessageByIds(messageIds);
|
||||
});
|
||||
}
|
||||
Future<void> deleteMessageByIds(List<String> messageIds) =>
|
||||
_readProtected(() {
|
||||
_logger.info('deleteMessageByIds');
|
||||
return db.messageDao.deleteMessageByIds(messageIds);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> deletePinnedMessageByIds(List<String> messageIds) {
|
||||
return readProtected(() {
|
||||
_logger.info('deletePinnedMessageByIds');
|
||||
return db.pinnedMessageDao.deleteMessageByIds(messageIds);
|
||||
});
|
||||
}
|
||||
Future<void> deletePinnedMessageByIds(List<String> messageIds) =>
|
||||
_readProtected(() {
|
||||
_logger.info('deletePinnedMessageByIds');
|
||||
return db.pinnedMessageDao.deleteMessageByIds(messageIds);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> deleteMessageByCids(List<String> cids) {
|
||||
return readProtected(() {
|
||||
_logger.info('deleteMessageByCids');
|
||||
return db.messageDao.deleteMessageByCids(cids);
|
||||
});
|
||||
}
|
||||
Future<void> deleteMessageByCids(List<String> cids) => _readProtected(() {
|
||||
_logger.info('deleteMessageByCids');
|
||||
return db.messageDao.deleteMessageByCids(cids);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> deletePinnedMessageByCids(List<String> cids) {
|
||||
return readProtected(() {
|
||||
_logger.info('deletePinnedMessageByCids');
|
||||
return db.pinnedMessageDao.deleteMessageByCids(cids);
|
||||
});
|
||||
}
|
||||
Future<void> deletePinnedMessageByCids(List<String> cids) =>
|
||||
_readProtected(() {
|
||||
_logger.info('deletePinnedMessageByCids');
|
||||
return db.pinnedMessageDao.deleteMessageByCids(cids);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<List<Member>> getMembersByCid(String cid) {
|
||||
return readProtected(() {
|
||||
_logger.info('getMembersByCid');
|
||||
return db.memberDao.getMembersByCid(cid);
|
||||
});
|
||||
}
|
||||
Future<List<Member>> getMembersByCid(String cid) => _readProtected(() {
|
||||
_logger.info('getMembersByCid');
|
||||
return db.memberDao.getMembersByCid(cid);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<ChannelModel> getChannelByCid(String cid) {
|
||||
return readProtected(() {
|
||||
_logger.info('getChannelByCid');
|
||||
return db.channelDao.getChannelByCid(cid);
|
||||
});
|
||||
}
|
||||
Future<ChannelModel> getChannelByCid(String cid) => _readProtected(() {
|
||||
_logger.info('getChannelByCid');
|
||||
return db.channelDao.getChannelByCid(cid);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<List<Message>> 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<List<Message>> 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<List<Read>> getReadsByCid(String cid) {
|
||||
return readProtected(() {
|
||||
_logger.info('getReadsByCid');
|
||||
return db.readDao.getReadsByCid(cid);
|
||||
});
|
||||
}
|
||||
Future<List<Read>> getReadsByCid(String cid) => _readProtected(() {
|
||||
_logger.info('getReadsByCid');
|
||||
return db.readDao.getReadsByCid(cid);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<Map<String, List<Message>>> getChannelThreads(String cid) async {
|
||||
return readProtected(() async {
|
||||
_logger.info('getChannelThreads');
|
||||
final messages = await db.messageDao.getThreadMessages(cid);
|
||||
final messageByParentIdDictionary = <String, List<Message>>{};
|
||||
for (final message in messages) {
|
||||
final parentId = message.parentId;
|
||||
messageByParentIdDictionary[parentId] = [
|
||||
...messageByParentIdDictionary[parentId] ?? [],
|
||||
message
|
||||
];
|
||||
}
|
||||
return messageByParentIdDictionary;
|
||||
});
|
||||
}
|
||||
Future<Map<String, List<Message>>> getChannelThreads(String cid) async =>
|
||||
_readProtected(() async {
|
||||
_logger.info('getChannelThreads');
|
||||
final messages = await db.messageDao.getThreadMessages(cid);
|
||||
final messageByParentIdDictionary = <String, List<Message>>{};
|
||||
for (final message in messages) {
|
||||
final parentId = message.parentId;
|
||||
messageByParentIdDictionary[parentId] = [
|
||||
...messageByParentIdDictionary[parentId] ?? [],
|
||||
message
|
||||
];
|
||||
}
|
||||
return messageByParentIdDictionary;
|
||||
});
|
||||
|
||||
@override
|
||||
Future<List<Message>> 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<List<ChannelState>> getChannelStates({
|
||||
Map<String, dynamic> filter,
|
||||
List<SortOption<ChannelModel>> 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<void> updateChannelQueries(
|
||||
Map<String, dynamic> filter,
|
||||
List<String> cids,
|
||||
bool clearQueryCache,
|
||||
) {
|
||||
return readProtected(() async {
|
||||
_logger.info('updateChannelQueries');
|
||||
return db.channelQueryDao.updateChannelQueries(
|
||||
filter,
|
||||
cids,
|
||||
clearQueryCache,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updateChannels(List<ChannelModel> channels) {
|
||||
return readProtected(() async {
|
||||
_logger.info('updateChannels');
|
||||
return db.channelDao.updateChannels(channels);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updateMembers(String cid, List<Member> members) {
|
||||
return readProtected(() async {
|
||||
_logger.info('updateMembers');
|
||||
return db.memberDao.updateMembers(cid, members);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updateMessages(String cid, List<Message> messages) {
|
||||
return readProtected(() async {
|
||||
_logger.info('updateMessages');
|
||||
return db.messageDao.updateMessages(cid, messages);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updatePinnedMessages(String cid, List<Message> messages) {
|
||||
return readProtected(() async {
|
||||
_logger.info('updatePinnedMessages');
|
||||
return db.pinnedMessageDao.updateMessages(cid, messages);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updateReactions(List<Reaction> reactions) {
|
||||
return readProtected(() async {
|
||||
_logger.info('updateReactions');
|
||||
return db.reactionDao.updateReactions(reactions);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updateReads(String cid, List<Read> reads) {
|
||||
return readProtected(() async {
|
||||
_logger.info('updateReads');
|
||||
return db.readDao.updateReads(cid, reads);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updateUsers(List<User> users) {
|
||||
return readProtected(() async {
|
||||
_logger.info('updateUsers');
|
||||
return db.userDao.updateUsers(users);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> deleteReactionsByMessageId(List<String> messageIds) {
|
||||
return readProtected(() async {
|
||||
_logger.info('deleteReactionsByMessageId');
|
||||
return db.reactionDao.deleteReactionsByMessageIds(messageIds);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> deleteMembersByCids(List<String> cids) {
|
||||
return readProtected(() async {
|
||||
_logger.info('deleteMembersByCids');
|
||||
return db.memberDao.deleteMemberByCids(cids);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updateChannelStates(List<ChannelState> 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<void> 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<void> updateChannels(List<ChannelModel> channels) =>
|
||||
_readProtected(() async {
|
||||
_logger.info('updateChannels');
|
||||
return db.channelDao.updateChannels(channels);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> updateMembers(String cid, List<Member> members) =>
|
||||
_readProtected(() async {
|
||||
_logger.info('updateMembers');
|
||||
return db.memberDao.updateMembers(cid, members);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> updateMessages(String cid, List<Message> messages) =>
|
||||
_readProtected(() async {
|
||||
_logger.info('updateMessages');
|
||||
return db.messageDao.updateMessages(cid, messages);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> updatePinnedMessages(String cid, List<Message> messages) =>
|
||||
_readProtected(() async {
|
||||
_logger.info('updatePinnedMessages');
|
||||
return db.pinnedMessageDao.updateMessages(cid, messages);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> updateReactions(List<Reaction> reactions) =>
|
||||
_readProtected(() async {
|
||||
_logger.info('updateReactions');
|
||||
return db.reactionDao.updateReactions(reactions);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> updateReads(String cid, List<Read> reads) =>
|
||||
_readProtected(() async {
|
||||
_logger.info('updateReads');
|
||||
return db.readDao.updateReads(cid, reads);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> updateUsers(List<User> users) => _readProtected(() async {
|
||||
_logger.info('updateUsers');
|
||||
return db.userDao.updateUsers(users);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> deleteReactionsByMessageId(List<String> messageIds) =>
|
||||
_readProtected(() async {
|
||||
_logger.info('deleteReactionsByMessageId');
|
||||
return db.reactionDao.deleteReactionsByMessageIds(messageIds);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> deleteMembersByCids(List<String> cids) =>
|
||||
_readProtected(() async {
|
||||
_logger.info('deleteMembersByCids');
|
||||
return db.memberDao.deleteMemberByCids(cids);
|
||||
});
|
||||
|
||||
@override
|
||||
Future<void> updateChannelStates(List<ChannelState> channelStates) =>
|
||||
_readProtected(() async => db.transaction(() async {
|
||||
await super.updateChannelStates(channelStates);
|
||||
}));
|
||||
|
||||
@override
|
||||
Future<void> 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;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user