From cbf770cc086684f71db084ff065eba462690f810 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 1 Jun 2023 14:03:46 +0700 Subject: [PATCH] TF-1813 Implement GetAllSendingEmails for domain and data layer (cherry picked from commit 35fb38a1ed860cfa65ee57ec6d1e5e715fb1b7a7) --- .../data/datasource/email_datasource.dart | 2 ++ .../email_datasource_impl.dart | 5 ++++ .../email_hive_cache_datasource_impl.dart | 9 +++++++ ...st_sending_email_hive_cache_extension.dart | 17 +++++++++++++ .../manager/sending_email_cache_manager.dart | 8 +++++++ .../sending_queue_repository_impl.dart | 17 +++++++++++++ .../repository/sending_queue_repository.dart | 8 +++++++ .../state/get_all_sending_email_state.dart | 24 +++++++++++++++++++ .../get_all_sending_email_interactor.dart | 23 ++++++++++++++++++ 9 files changed, 113 insertions(+) create mode 100644 lib/features/offline_mode/extensions/list_sending_email_hive_cache_extension.dart create mode 100644 lib/features/sending_queue/data/repository/sending_queue_repository_impl.dart create mode 100644 lib/features/sending_queue/domain/repository/sending_queue_repository.dart create mode 100644 lib/features/sending_queue/domain/state/get_all_sending_email_state.dart create mode 100644 lib/features/sending_queue/domain/usecases/get_all_sending_email_interactor.dart diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index b0c924371..1383a2e8a 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -91,4 +91,6 @@ abstract class EmailDataSource { Future getIncomingEmailedStored(Session session, AccountId accountId, EmailId emailId); Future storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail); + + Future> getAllSendingEmails(AccountId accountId, UserName userName); } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart index c33168de7..76ff72e9e 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -193,4 +193,9 @@ class EmailDataSourceImpl extends EmailDataSource { Future storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail) { throw UnimplementedError(); } + + @override + Future> getAllSendingEmails(AccountId accountId, UserName userName) { + throw UnimplementedError(); + } } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart index 51aa46e3f..9b47db2e5 100644 --- a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart @@ -30,6 +30,7 @@ import 'package:tmail_ui_user/features/email/domain/extensions/detailed_email_hi import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; +import 'package:tmail_ui_user/features/offline_mode/extensions/list_sending_email_hive_cache_extension.dart'; import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_task.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart'; @@ -251,4 +252,12 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { return await _sendingEmailCacheManager.storeSendingEmail(accountId, userName, sendingEmail.toHiveCache()); }).catchError(_exceptionThrower.throwException); } + + @override + Future> getAllSendingEmails(AccountId accountId, UserName userName) { + return Future.sync(() async { + final sendingEmailsCache = await _sendingEmailCacheManager.getAllSendingEmails(accountId, userName); + return sendingEmailsCache.toSendingEmails(); + }).catchError(_exceptionThrower.throwException); + } } \ No newline at end of file diff --git a/lib/features/offline_mode/extensions/list_sending_email_hive_cache_extension.dart b/lib/features/offline_mode/extensions/list_sending_email_hive_cache_extension.dart new file mode 100644 index 000000000..6fe0bdd3b --- /dev/null +++ b/lib/features/offline_mode/extensions/list_sending_email_hive_cache_extension.dart @@ -0,0 +1,17 @@ + +import 'package:jmap_dart_client/jmap/core/extensions/date_time_extension.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; +import 'package:tmail_ui_user/features/offline_mode/extensions/sending_email_hive_cache_extension.dart'; +import 'package:tmail_ui_user/features/offline_mode/model/sending_email_hive_cache.dart'; + +extension ListSendingEmailHiveCacheExtension on List { + + List toSendingEmails() => + map((sendingEmailCache) => sendingEmailCache.toSendingEmail()).toList(); + + void sortByLatestTime() { + sort((detailedEmail1, detailedEmail2) { + return detailedEmail1.createTime.compareToSort(detailedEmail2.createTime, false); + }); + } +} \ No newline at end of file diff --git a/lib/features/offline_mode/manager/sending_email_cache_manager.dart b/lib/features/offline_mode/manager/sending_email_cache_manager.dart index 6de5b25d1..f2874ef87 100644 --- a/lib/features/offline_mode/manager/sending_email_cache_manager.dart +++ b/lib/features/offline_mode/manager/sending_email_cache_manager.dart @@ -5,6 +5,7 @@ import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:model/extensions/account_id_extensions.dart'; import 'package:tmail_ui_user/features/caching/clients/sending_email_hive_cache_client.dart'; import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart'; +import 'package:tmail_ui_user/features/offline_mode/extensions/list_sending_email_hive_cache_extension.dart'; import 'package:tmail_ui_user/features/offline_mode/model/sending_email_hive_cache.dart'; class SendingEmailCacheManager { @@ -22,4 +23,11 @@ class SendingEmailCacheManager { log('SendingEmailCacheManager::storeSendingEmail():keyCache: $keyCache | sendingEmailHiveCache: $sendingEmailHiveCache'); return _hiveCacheClient.insertItem(keyCache, sendingEmailHiveCache); } + + Future> getAllSendingEmails(AccountId accountId, UserName userName) async { + final sendingEmailsCache = await _hiveCacheClient.getListByTupleKey(accountId.asString, userName.value); + log('SendingEmailCacheManager::getAllSendingEmails():COUNT: ${sendingEmailsCache.length}'); + sendingEmailsCache.sortByLatestTime(); + return sendingEmailsCache; + } } \ No newline at end of file diff --git a/lib/features/sending_queue/data/repository/sending_queue_repository_impl.dart b/lib/features/sending_queue/data/repository/sending_queue_repository_impl.dart new file mode 100644 index 000000000..c155935f9 --- /dev/null +++ b/lib/features/sending_queue/data/repository/sending_queue_repository_impl.dart @@ -0,0 +1,17 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; +import 'package:tmail_ui_user/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart'; +import 'package:tmail_ui_user/features/sending_queue/domain/repository/sending_queue_repository.dart'; + +class SendingQueueRepositoryImpl extends SendingQueueRepository { + + final EmailHiveCacheDataSourceImpl _emailHiveCacheDataSourceImpl; + + SendingQueueRepositoryImpl(this._emailHiveCacheDataSourceImpl); + + @override + Future> getAllSendingEmails(AccountId accountId, UserName userName) { + return _emailHiveCacheDataSourceImpl.getAllSendingEmails(accountId, userName); + } +} \ No newline at end of file diff --git a/lib/features/sending_queue/domain/repository/sending_queue_repository.dart b/lib/features/sending_queue/domain/repository/sending_queue_repository.dart new file mode 100644 index 000000000..c55163faa --- /dev/null +++ b/lib/features/sending_queue/domain/repository/sending_queue_repository.dart @@ -0,0 +1,8 @@ + +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; + +abstract class SendingQueueRepository { + Future> getAllSendingEmails(AccountId accountId, UserName userName); +} \ No newline at end of file diff --git a/lib/features/sending_queue/domain/state/get_all_sending_email_state.dart b/lib/features/sending_queue/domain/state/get_all_sending_email_state.dart new file mode 100644 index 000000000..d1a9d056b --- /dev/null +++ b/lib/features/sending_queue/domain/state/get_all_sending_email_state.dart @@ -0,0 +1,24 @@ + +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; + +class GetAllSendingEmailLoading extends UIState {} + +class GetAllSendingEmailSuccess extends UIState { + + final List sendingEmails; + + GetAllSendingEmailSuccess(this.sendingEmails); + + @override + List get props => [sendingEmails]; +} + +class GetAllSendingEmailFailure extends FeatureFailure { + + GetAllSendingEmailFailure(dynamic exception) : super(exception: exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/sending_queue/domain/usecases/get_all_sending_email_interactor.dart b/lib/features/sending_queue/domain/usecases/get_all_sending_email_interactor.dart new file mode 100644 index 000000000..ad2e1bf9b --- /dev/null +++ b/lib/features/sending_queue/domain/usecases/get_all_sending_email_interactor.dart @@ -0,0 +1,23 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; +import 'package:tmail_ui_user/features/sending_queue/domain/repository/sending_queue_repository.dart'; +import 'package:tmail_ui_user/features/sending_queue/domain/state/get_all_sending_email_state.dart'; + +class GetAllSendingEmailInteractor { + final SendingQueueRepository _sendingQueueRepository; + + GetAllSendingEmailInteractor(this._sendingQueueRepository); + + Stream> execute(AccountId accountId, UserName userName) async* { + try { + yield Right(GetAllSendingEmailLoading()); + final sendingEmails = await _sendingQueueRepository.getAllSendingEmails(accountId, userName); + yield Right(GetAllSendingEmailSuccess(sendingEmails)); + } catch (e) { + yield Left(GetAllSendingEmailFailure(e)); + } + } +} \ No newline at end of file