TF-2611 Execute Email/get to get detailed email level one-by-one in FCM
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
@@ -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<void> storeDetailedNewEmail(Session session, AccountId accountId, DetailedEmail detailedEmail);
|
||||
|
||||
Future<List<Email>> getListDetailedEmailById(Session session, AccountId accountId, Set<EmailId> emailIds, {Set<Comparator>? sort});
|
||||
Future<Email> getDetailedEmailById(Session session, AccountId accountId, EmailId emailId);
|
||||
|
||||
Future<void> storeEmail(Session session, AccountId accountId, Email email);
|
||||
|
||||
|
||||
@@ -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<List<Email>> getListDetailedEmailById(Session session, AccountId accountId, Set<EmailId> emailIds, {Set<Comparator>? sort}) {
|
||||
Future<Email> 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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<List<Email>> getListDetailedEmailById(Session session, AccountId accountId, Set<EmailId> emailIds, {Set<Comparator>? sort}) {
|
||||
Future<Email> getDetailedEmailById(Session session, AccountId accountId, EmailId emailId) {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
|
||||
@@ -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<List<Email>> getListDetailedEmailById(
|
||||
Future<Email> getDetailedEmailById(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
Set<EmailId> emailIds,
|
||||
{Set<Comparator>? 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();
|
||||
}
|
||||
|
||||
@@ -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<List<Email>> getListDetailedEmailById(Session session, AccountId accountId, Set<EmailId> emailIds, {Set<Comparator>? sort}) {
|
||||
return emailDataSource[DataSourceType.network]!.getListDetailedEmailById(session, accountId, emailIds, sort: sort);
|
||||
Future<Email> getDetailedEmailById(Session session, AccountId accountId, EmailId emailId) {
|
||||
return emailDataSource[DataSourceType.network]!.getDetailedEmailById(session, accountId, emailId);
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -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<void> storeDetailedNewEmail(Session session, AccountId accountId, DetailedEmail detailedEmail);
|
||||
|
||||
Future<List<Email>> getListDetailedEmailById(Session session, AccountId accountId, Set<EmailId> emailIds, {Set<Comparator>? sort});
|
||||
Future<Email> getDetailedEmailById(Session session, AccountId accountId, EmailId emailId);
|
||||
|
||||
Future<void> storeEmail(Session session, AccountId accountId, Email email);
|
||||
|
||||
|
||||
@@ -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<Either<Failure, Success>> execute(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
Set<EmailId> emailIds,
|
||||
String baseDownloadUrl,
|
||||
{Set<Comparator>? sort}
|
||||
List<EmailId> emailIds,
|
||||
String baseDownloadUrl
|
||||
) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(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<Email, DetailedEmail> 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<Failure, Success>(GetDetailedEmailByIdSuccess(
|
||||
mapDetailedEmails,
|
||||
accountId,
|
||||
@@ -56,7 +48,7 @@ class GetListDetailedEmailByIdInteractor {
|
||||
}
|
||||
}
|
||||
|
||||
Future<Tuple2<Email, DetailedEmail>> _parsingEmailToDetailedEmail(
|
||||
Future<Tuple2<Email, DetailedEmail>> _convertEmailToDetailedEmail(
|
||||
AccountId accountId,
|
||||
Email email,
|
||||
String baseDownloadUrl
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ class GetNewReceiveEmailFromNotificationLoading extends UIState {}
|
||||
|
||||
class GetNewReceiveEmailFromNotificationSuccess extends UIState {
|
||||
|
||||
final Set<EmailId> emailIds;
|
||||
final List<EmailId> emailIds;
|
||||
final AccountId accountId;
|
||||
final Session? session;
|
||||
|
||||
|
||||
+3
-2
@@ -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<Failure, Success>(GetNewReceiveEmailFromNotificationSuccess(accountId, session, listEmailIds.toSet()));
|
||||
log('GetNewReceiveEmailFromNotificationInteractor::execute: listEmailIds = $listEmailIds');
|
||||
yield Right<Failure, Success>(GetNewReceiveEmailFromNotificationSuccess(accountId, session, listEmailIds));
|
||||
} else {
|
||||
yield Left<Failure, Success>(GetNewReceiveEmailFromNotificationFailure(EmailStateNoChangeException()));
|
||||
}
|
||||
|
||||
@@ -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<EmailId> emailIds) {
|
||||
void _getListDetailedEmailByIdAction(Session? session, AccountId accountId, List<EmailId> emailIds) {
|
||||
log('EmailChangeListener::_getListDetailedEmailByIdAction():emailIds: $emailIds');
|
||||
if (_getListDetailedEmailByIdInteractor != null &&
|
||||
_dynamicUrlInterceptors != null &&
|
||||
@@ -302,10 +299,7 @@ class EmailChangeListener extends ChangeListener {
|
||||
session,
|
||||
accountId,
|
||||
emailIds,
|
||||
baseDownloadUrl,
|
||||
sort: <Comparator>{}
|
||||
..add(EmailComparator(EmailComparatorProperty.receivedAt)
|
||||
..setIsAscending(true))
|
||||
baseDownloadUrl
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user