From a6966e434e7fc2e49858fd79e2f801f3a69f57af Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 25 Apr 2023 15:49:23 +0700 Subject: [PATCH] Get all email cache by AccountId (cherry picked from commit e9f172861d595549158feb829c74afc76dd7311e) --- lib/features/caching/email_cache_client.dart | 14 ----------- .../data/datasource/thread_datasource.dart | 2 +- .../local_thread_datasource_impl.dart | 4 +++- .../thread_datasource_impl.dart | 2 +- .../data/extensions/email_extension.dart | 7 ++++++ .../list_email_cache_extension.dart | 6 ++--- .../data/local/email_cache_manager.dart | 24 +++++++++++++------ .../repository/thread_repository_impl.dart | 20 ++++++++++------ 8 files changed, 45 insertions(+), 34 deletions(-) diff --git a/lib/features/caching/email_cache_client.dart b/lib/features/caching/email_cache_client.dart index 40df7e3ff..fc33ac0da 100644 --- a/lib/features/caching/email_cache_client.dart +++ b/lib/features/caching/email_cache_client.dart @@ -1,5 +1,4 @@ -import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/caching/config/hive_cache_client.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_cache.dart'; @@ -7,17 +6,4 @@ class EmailCacheClient extends HiveCacheClient { @override String get tableName => 'EmailCache'; - - Future> getListEmailCacheByMailboxId(MailboxId mailboxId) { - return Future.sync(() async { - final boxEmail = await openBox(); - return boxEmail.values.where((emailCache) { - return emailCache.mailboxIds != null - && emailCache.mailboxIds!.containsKey(mailboxId.id.value) - && emailCache.mailboxIds![mailboxId.id.value] == true; - }).toList(); - }).catchError((error) { - throw error; - }); - } } \ No newline at end of file diff --git a/lib/features/thread/data/datasource/thread_datasource.dart b/lib/features/thread/data/datasource/thread_datasource.dart index 5b89125e7..e57a596b0 100644 --- a/lib/features/thread/data/datasource/thread_datasource.dart +++ b/lib/features/thread/data/datasource/thread_datasource.dart @@ -36,7 +36,7 @@ abstract class ThreadDataSource { } ); - Future> getAllEmailCache({MailboxId? inMailboxId, Set? sort, FilterMessageOption? filterOption, UnsignedInt? limit}); + Future> getAllEmailCache(AccountId accountId, {MailboxId? inMailboxId, Set? sort, FilterMessageOption? filterOption, UnsignedInt? limit}); Future update(AccountId accountId, {List? updated, List? created, List? destroyed}); diff --git a/lib/features/thread/data/datasource_impl/local_thread_datasource_impl.dart b/lib/features/thread/data/datasource_impl/local_thread_datasource_impl.dart index 45598400c..855d2a80a 100644 --- a/lib/features/thread/data/datasource_impl/local_thread_datasource_impl.dart +++ b/lib/features/thread/data/datasource_impl/local_thread_datasource_impl.dart @@ -52,7 +52,8 @@ class LocalThreadDataSourceImpl extends ThreadDataSource { } @override - Future> getAllEmailCache({ + Future> getAllEmailCache( + AccountId accountId, { MailboxId? inMailboxId, Set? sort, FilterMessageOption? filterOption, @@ -60,6 +61,7 @@ class LocalThreadDataSourceImpl extends ThreadDataSource { }) { return Future.sync(() async { return await _emailCacheManager.getAllEmail( + accountId, inMailboxId: inMailboxId, sort: sort, filterOption: filterOption ?? FilterMessageOption.all, diff --git a/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart b/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart index 60a45157b..831ffc342 100644 --- a/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart +++ b/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart @@ -74,7 +74,7 @@ class ThreadDataSourceImpl extends ThreadDataSource { } @override - Future> getAllEmailCache({MailboxId? inMailboxId, Set? sort, FilterMessageOption? filterOption, UnsignedInt? limit}) { + Future> getAllEmailCache(AccountId accountId, {MailboxId? inMailboxId, Set? sort, FilterMessageOption? filterOption, UnsignedInt? limit}) { throw UnimplementedError(); } diff --git a/lib/features/thread/data/extensions/email_extension.dart b/lib/features/thread/data/extensions/email_extension.dart index 304c6eeba..037e9182d 100644 --- a/lib/features/thread/data/extensions/email_extension.dart +++ b/lib/features/thread/data/extensions/email_extension.dart @@ -1,4 +1,5 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_cache.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/map_keywords_extension.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/email_address_extension.dart'; @@ -24,4 +25,10 @@ extension EmailExtension on Email { mailboxIds: mailboxIds?.toMapString(), ); } + + bool belongTo(MailboxId mailboxId) { + return mailboxIds != null + && mailboxIds!.containsKey(mailboxId) + && mailboxIds![mailboxId] == true; + } } \ No newline at end of file diff --git a/lib/features/thread/data/extensions/list_email_cache_extension.dart b/lib/features/thread/data/extensions/list_email_cache_extension.dart index cb233cc27..775335475 100644 --- a/lib/features/thread/data/extensions/list_email_cache_extension.dart +++ b/lib/features/thread/data/extensions/list_email_cache_extension.dart @@ -1,8 +1,8 @@ +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/thread/data/extensions/email_cache_extension.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_cache.dart'; extension ListEmailCacheExtension on List { - Map toMap() { - return { for (var emailCache in this) emailCache.id : emailCache }; - } + List toEmailList() => map((emailCache) => emailCache.toEmail()).toList(); } \ No newline at end of file diff --git a/lib/features/thread/data/local/email_cache_manager.dart b/lib/features/thread/data/local/email_cache_manager.dart index 3e54bd65b..dc53a32ec 100644 --- a/lib/features/thread/data/local/email_cache_manager.dart +++ b/lib/features/thread/data/local/email_cache_manager.dart @@ -6,6 +6,8 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/caching/email_cache_client.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/email_cleanup_rule.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/email_cache_extension.dart'; +import 'package:tmail_ui_user/features/thread/data/extensions/email_extension.dart'; +import 'package:tmail_ui_user/features/thread/data/extensions/list_email_cache_extension.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/list_email_extension.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/list_email_id_extension.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; @@ -17,19 +19,19 @@ class EmailCacheManager { EmailCacheManager(this._emailCacheClient); - Future> getAllEmail({ + Future> getAllEmail( + AccountId accountId, { MailboxId? inMailboxId, Set? sort, UnsignedInt? limit, FilterMessageOption filterOption = FilterMessageOption.all }) async { - final emailCacheList = inMailboxId != null - ? await _emailCacheClient.getListEmailCacheByMailboxId(inMailboxId) - : await _emailCacheClient.getAll(); + final emailCacheList = await _emailCacheClient.getListByCollectionId(accountId.asString); final emailList = emailCacheList - .map((emailCache) => emailCache.toEmail()) - .where((email) => filterOption.filterEmail(email)) - .toList(); + .toEmailList() + .where((email) => _filterEmailByMailbox(email, filterOption, inMailboxId)) + .toList(); + if (sort != null) { for (var comparator in sort) { emailList.sortBy(comparator); @@ -42,6 +44,14 @@ class EmailCacheManager { return emailList; } + bool _filterEmailByMailbox(Email email, FilterMessageOption option, MailboxId? inMailboxId) { + if (inMailboxId != null) { + return email.belongTo(inMailboxId) && option.filterEmail(email); + } else { + return option.filterEmail(email); + } + } + Future update( AccountId accountId, { List? updated, diff --git a/lib/features/thread/data/repository/thread_repository_impl.dart b/lib/features/thread/data/repository/thread_repository_impl.dart index 84ae00814..b02aefbbe 100644 --- a/lib/features/thread/data/repository/thread_repository_impl.dart +++ b/lib/features/thread/data/repository/thread_repository_impl.dart @@ -46,6 +46,7 @@ class ThreadRepositoryImpl extends ThreadRepository { log('ThreadRepositoryImpl::getAllEmail(): filter = ${emailFilter?.mailboxId}'); final localEmailResponse = await Future.wait([ mapDataSource[DataSourceType.local]!.getAllEmailCache( + accountId, inMailboxId: emailFilter?.mailboxId, sort: sort, limit: limit, @@ -104,10 +105,11 @@ class ThreadRepositoryImpl extends ThreadRepository { final newEmailResponse = await Future.wait([ mapDataSource[DataSourceType.local]!.getAllEmailCache( - inMailboxId: emailFilter?.mailboxId, - sort: sort, - limit: limit, - filterOption: emailFilter?.filterOption), + accountId, + inMailboxId: emailFilter?.mailboxId, + sort: sort, + limit: limit, + filterOption: emailFilter?.filterOption), stateDataSource.getState(StateType.email) ]).then((List response) { return EmailsResponse(emailList: response.first, state: response.last); @@ -216,7 +218,12 @@ class ThreadRepositoryImpl extends ThreadRepository { ); final newEmailResponse = await Future.wait([ - mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: emailFilter?.mailboxId, sort: sort, filterOption: emailFilter?.filterOption), + mapDataSource[DataSourceType.local]!.getAllEmailCache( + accountId, + inMailboxId: emailFilter?.mailboxId, + sort: sort, + filterOption: emailFilter?.filterOption + ), stateDataSource.getState(StateType.email) ]).then((List response) { return EmailsResponse(emailList: response.first, state: response.last); @@ -306,8 +313,7 @@ class ThreadRepositoryImpl extends ThreadRepository { Properties? propertiesUpdated, } ) async { - final localEmailList = await mapDataSource[DataSourceType.local]! - .getAllEmailCache(); + final localEmailList = await mapDataSource[DataSourceType.local]!.getAllEmailCache(accountId); EmailChangeResponse? emailChangeResponse; bool hasMoreChanges = true;