From 652fb48493f3b728bc8e2c5ce0c4ef9c772f2b02 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 19 Feb 2024 16:32:00 +0700 Subject: [PATCH] TF-2611 Execute `Email/get` to get detailed email level one-by-one in FCM Signed-off-by: dab246 --- .../data/datasource/email_datasource.dart | 3 +- .../email_datasource_impl.dart | 5 ++- .../email_hive_cache_datasource_impl.dart | 6 ++-- .../email/data/network/email_api.dart | 22 ++++--------- .../repository/email_repository_impl.dart | 6 ++-- .../domain/repository/email_repository.dart | 5 ++- ...t_list_detailed_email_by_id_interator.dart | 32 +++++++------------ ...receive_email_from_notification_state.dart | 2 +- ...ve_email_from_notification_interactor.dart | 5 +-- .../listener/email_change_listener.dart | 10 ++---- 10 files changed, 34 insertions(+), 62 deletions(-) diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 001a89951..db3d4c283 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -10,7 +10,6 @@ import 'package:email_recovery/email_recovery/email_recovery_action.dart'; import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/account/account_request.dart'; @@ -82,7 +81,7 @@ abstract class EmailDataSource { Future storeDetailedNewEmail(Session session, AccountId accountId, DetailedEmail detailedEmail); - Future> getListDetailedEmailById(Session session, AccountId accountId, Set emailIds, {Set? sort}); + Future getDetailedEmailById(Session session, AccountId accountId, EmailId emailId); Future storeEmail(Session session, AccountId accountId, Email email); 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 998ec2183..76a5e7ee8 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -11,7 +11,6 @@ import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; @@ -167,9 +166,9 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future> getListDetailedEmailById(Session session, AccountId accountId, Set emailIds, {Set? sort}) { + Future getDetailedEmailById(Session session, AccountId accountId, EmailId emailId) { return Future.sync(() async { - return await emailAPI.getListDetailedEmailById(session, accountId, emailIds, sort: sort); + return await emailAPI.getDetailedEmailById(session, accountId, emailId); }).catchError(_exceptionThrower.throwException); } 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 b9ee6b432..c18814746 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 @@ -1,6 +1,5 @@ import 'dart:async'; - import 'dart:typed_data'; import 'package:core/data/network/download/downloaded_response.dart'; @@ -15,7 +14,6 @@ import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; -import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/account/account_request.dart'; import 'package:model/download/download_task_id.dart'; @@ -39,12 +37,12 @@ import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_mana import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/model/detailed_email_hive_cache.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/extensions/list_sending_email_extension.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/extensions/sending_email_extension.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/email_cache_extension.dart'; -import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_manager.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/email_extension.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; @@ -163,7 +161,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { } @override - Future> getListDetailedEmailById(Session session, AccountId accountId, Set emailIds, {Set? sort}) { + Future getDetailedEmailById(Session session, AccountId accountId, EmailId emailId) { throw UnimplementedError(); } diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 24fae84b4..1612575dd 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -5,9 +5,12 @@ import 'dart:typed_data'; import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; +import 'package:email_recovery/email_recovery/email_recovery_action.dart'; import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; import 'package:email_recovery/email_recovery/get/get_email_recovery_action_method.dart'; import 'package:email_recovery/email_recovery/get/get_email_recovery_action_response.dart'; +import 'package:email_recovery/email_recovery/set/set_email_recovery_action_method.dart'; +import 'package:email_recovery/email_recovery/set/set_email_recovery_action_response.dart'; import 'package:external_path/external_path.dart'; import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:jmap_dart_client/http/http_client.dart'; @@ -21,7 +24,6 @@ import 'package:jmap_dart_client/jmap/core/reference_id.dart'; import 'package:jmap_dart_client/jmap/core/reference_prefix.dart'; import 'package:jmap_dart_client/jmap/core/request/request_invocation.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/jmap_request.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/get/get_email_method.dart'; @@ -37,9 +39,6 @@ import 'package:jmap_dart_client/jmap/mail/email/submission/set/set_email_submis import 'package:jmap_dart_client/jmap/mail/email/submission/set/set_email_submission_response.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/set/set_mailbox_method.dart'; -import 'package:email_recovery/email_recovery/email_recovery_action.dart'; -import 'package:email_recovery/email_recovery/set/set_email_recovery_action_method.dart'; -import 'package:email_recovery/email_recovery/set/set_email_recovery_action_response.dart'; import 'package:model/account/account_request.dart'; import 'package:model/account/authentication_type.dart'; import 'package:model/download/download_task_id.dart'; @@ -626,16 +625,15 @@ class EmailAPI with HandleSetErrorMixin { return setEmailResponse?.destroyed?.contains(emailId.id) == true; } - Future> getListDetailedEmailById( + Future getDetailedEmailById( Session session, AccountId accountId, - Set emailIds, - {Set? sort} + EmailId emailId ) async { final jmapRequestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final getEmailMethod = GetEmailMethod(accountId) - ..addIds(emailIds.map((emailId) => emailId.id).toSet()) + ..addIds({emailId.id}) ..addProperties(ThreadConstants.propertiesGetDetailedEmail) ..addFetchHTMLBodyValues(true); @@ -652,14 +650,8 @@ class EmailAPI with HandleSetErrorMixin { getEmailInvocation.methodCallId, GetEmailResponse.deserialize); - if (sort != null && resultList != null) { - for (var comparator in sort) { - resultList.sortEmails(comparator); - } - } - if (resultList?.list.isNotEmpty == true) { - return resultList!.list; + return resultList!.list.first; } else { throw NotFoundEmailException(); } diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index ab3094d66..d73964cdd 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'dart:typed_data'; @@ -13,7 +12,6 @@ import 'package:email_recovery/email_recovery/email_recovery_action.dart'; import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/account/account_request.dart'; @@ -182,8 +180,8 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future> getListDetailedEmailById(Session session, AccountId accountId, Set emailIds, {Set? sort}) { - return emailDataSource[DataSourceType.network]!.getListDetailedEmailById(session, accountId, emailIds, sort: sort); + Future getDetailedEmailById(Session session, AccountId accountId, EmailId emailId) { + return emailDataSource[DataSourceType.network]!.getDetailedEmailById(session, accountId, emailId); } @override diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index ba12f719f..222827e19 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -11,9 +11,8 @@ import 'package:email_recovery/email_recovery/email_recovery_action.dart'; import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; -import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/account/account_request.dart'; import 'package:model/download/download_task_id.dart'; import 'package:model/email/attachment.dart'; @@ -91,7 +90,7 @@ abstract class EmailRepository { Future storeDetailedNewEmail(Session session, AccountId accountId, DetailedEmail detailedEmail); - Future> getListDetailedEmailById(Session session, AccountId accountId, Set emailIds, {Set? sort}); + Future getDetailedEmailById(Session session, AccountId accountId, EmailId emailId); Future storeEmail(Session session, AccountId accountId, Email email); diff --git a/lib/features/email/domain/usecases/get_list_detailed_email_by_id_interator.dart b/lib/features/email/domain/usecases/get_list_detailed_email_by_id_interator.dart index 97a5810fb..8e0e2448a 100644 --- a/lib/features/email/domain/usecases/get_list_detailed_email_by_id_interator.dart +++ b/lib/features/email/domain/usecases/get_list_detailed_email_by_id_interator.dart @@ -1,12 +1,11 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/utils/html_transformer/transform_configuration.dart'; +import 'package:core/utils/app_logger.dart'; import 'package:core/utils/platform_info.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; -import 'package:jmap_dart_client/jmap/core/extensions/utc_date_extension.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/extensions/email_extension.dart'; import 'package:model/extensions/list_attachment_extension.dart'; @@ -24,28 +23,21 @@ class GetListDetailedEmailByIdInteractor { Stream> execute( Session session, AccountId accountId, - Set emailIds, - String baseDownloadUrl, - {Set? sort} + List emailIds, + String baseDownloadUrl ) async* { try { yield Right(GetDetailedEmailByIdLoading()); - final listEmails = await _emailRepository.getListDetailedEmailById(session, accountId, emailIds, sort: sort); - - final listTuple2Email = await Future.wait( - listEmails.map((email) => _parsingEmailToDetailedEmail(accountId, email, baseDownloadUrl)), - eagerError: true); - - listTuple2Email.sort((detailedEmail1, detailedEmail2) { - return detailedEmail1.value1.receivedAt.compareToSort(detailedEmail1.value1.receivedAt, true); - }); - - final mapDetailedEmails = { - for (var tuple2 in listTuple2Email) - tuple2.value1 : tuple2.value2 - }; + final ascendingEmailIds = emailIds.reversed.toList(); + Map mapDetailedEmails = {}; + for (var emailId in ascendingEmailIds) { + final email = await _emailRepository.getDetailedEmailById(session, accountId, emailId); + final tupleEmail = await _convertEmailToDetailedEmail(accountId, email, baseDownloadUrl); + mapDetailedEmails[tupleEmail.value1] = tupleEmail.value2; + } + log('GetListDetailedEmailByIdInteractor::execute: mapDetailedEmails = ${mapDetailedEmails.length}'); yield Right(GetDetailedEmailByIdSuccess( mapDetailedEmails, accountId, @@ -56,7 +48,7 @@ class GetListDetailedEmailByIdInteractor { } } - Future> _parsingEmailToDetailedEmail( + Future> _convertEmailToDetailedEmail( AccountId accountId, Email email, String baseDownloadUrl diff --git a/lib/features/push_notification/domain/state/get_new_receive_email_from_notification_state.dart b/lib/features/push_notification/domain/state/get_new_receive_email_from_notification_state.dart index d0cc03e70..98eff06c9 100644 --- a/lib/features/push_notification/domain/state/get_new_receive_email_from_notification_state.dart +++ b/lib/features/push_notification/domain/state/get_new_receive_email_from_notification_state.dart @@ -9,7 +9,7 @@ class GetNewReceiveEmailFromNotificationLoading extends UIState {} class GetNewReceiveEmailFromNotificationSuccess extends UIState { - final Set emailIds; + final List emailIds; final AccountId accountId; final Session? session; diff --git a/lib/features/push_notification/domain/usecases/get_new_receive_email_from_notification_interactor.dart b/lib/features/push_notification/domain/usecases/get_new_receive_email_from_notification_interactor.dart index 6af280620..a50e9a751 100644 --- a/lib/features/push_notification/domain/usecases/get_new_receive_email_from_notification_interactor.dart +++ b/lib/features/push_notification/domain/usecases/get_new_receive_email_from_notification_interactor.dart @@ -1,5 +1,6 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/app_logger.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; @@ -31,8 +32,8 @@ class GetNewReceiveEmailFromNotificationInteractor { session, accountId, currentState); - - yield Right(GetNewReceiveEmailFromNotificationSuccess(accountId, session, listEmailIds.toSet())); + log('GetNewReceiveEmailFromNotificationInteractor::execute: listEmailIds = $listEmailIds'); + yield Right(GetNewReceiveEmailFromNotificationSuccess(accountId, session, listEmailIds)); } else { yield Left(GetNewReceiveEmailFromNotificationFailure(EmailStateNoChangeException())); } diff --git a/lib/features/push_notification/presentation/listener/email_change_listener.dart b/lib/features/push_notification/presentation/listener/email_change_listener.dart index b41c1b57a..2db8d5bf4 100644 --- a/lib/features/push_notification/presentation/listener/email_change_listener.dart +++ b/lib/features/push_notification/presentation/listener/email_change_listener.dart @@ -7,12 +7,9 @@ import 'package:core/utils/platform_info.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; -import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart'; -import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart'; import 'package:model/email/email_property.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/extensions/list_presentation_email_extension.dart'; @@ -292,7 +289,7 @@ class EmailChangeListener extends ChangeListener { } } - void _getListDetailedEmailByIdAction(Session? session, AccountId accountId, Set emailIds) { + void _getListDetailedEmailByIdAction(Session? session, AccountId accountId, List emailIds) { log('EmailChangeListener::_getListDetailedEmailByIdAction():emailIds: $emailIds'); if (_getListDetailedEmailByIdInteractor != null && _dynamicUrlInterceptors != null && @@ -302,10 +299,7 @@ class EmailChangeListener extends ChangeListener { session, accountId, emailIds, - baseDownloadUrl, - sort: {} - ..add(EmailComparator(EmailComparatorProperty.receivedAt) - ..setIsAscending(true)) + baseDownloadUrl )); } }