TF-1923 Store list new email by ascending
(cherry picked from commit e2ad80e20bca3d72bf9799e957b995a24c0844c8)
This commit is contained in:
+21
-8
@@ -2,7 +2,9 @@ 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/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';
|
||||
@@ -12,27 +14,38 @@ import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/get_detailed_email_by_id_state.dart';
|
||||
|
||||
class GetDetailedEmailByIdInteractor {
|
||||
class GetListDetailedEmailByIdInteractor {
|
||||
final EmailRepository _emailRepository;
|
||||
|
||||
GetDetailedEmailByIdInteractor(this._emailRepository);
|
||||
GetListDetailedEmailByIdInteractor(this._emailRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
EmailId emailId,
|
||||
String? baseDownloadUrl
|
||||
Set<EmailId> emailIds,
|
||||
String? baseDownloadUrl,
|
||||
{Set<Comparator>? sort}
|
||||
) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(GetDetailedEmailByIdLoading());
|
||||
|
||||
final email = await _emailRepository.getDetailedEmailById(session, accountId, emailId);
|
||||
final listEmails = await _emailRepository.getListDetailedEmailById(session, accountId, emailIds, sort: sort);
|
||||
|
||||
final parsedEmail = await _parsingEmailToDetailedEmail(accountId, email, baseDownloadUrl);
|
||||
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
|
||||
};
|
||||
|
||||
yield Right<Failure, Success>(GetDetailedEmailByIdSuccess(
|
||||
parsedEmail.value1,
|
||||
parsedEmail.value2,
|
||||
mapDetailedEmails,
|
||||
accountId,
|
||||
session,
|
||||
));
|
||||
+29
-18
@@ -5,43 +5,38 @@ import 'package:dartz/dartz.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/mail/email/email.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/exceptions/email_cache_exceptions.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/store_new_email_state.dart';
|
||||
|
||||
class StoreNewEmailInteractor {
|
||||
class StoreListNewEmailInteractor {
|
||||
final EmailRepository _emailRepository;
|
||||
|
||||
StoreNewEmailInteractor(this._emailRepository);
|
||||
StoreListNewEmailInteractor(this._emailRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
Email email,
|
||||
DetailedEmail detailedEmail
|
||||
Map<Email, DetailedEmail> mapDetailedEmails
|
||||
) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(StoreNewEmailLoading());
|
||||
final isNewEmailExist = await _isNewEmailAlreadyStored(session, accountId, detailedEmail);
|
||||
log('StoreNewEmailInteractor::execute():isNewEmailExist: $isNewEmailExist');
|
||||
if (!isNewEmailExist) {
|
||||
await Future.wait([
|
||||
_emailRepository.storeEmail(session, accountId, email),
|
||||
_emailRepository.storeDetailedNewEmail(session, accountId, detailedEmail),
|
||||
], eagerError: true);
|
||||
log('StoreNewEmailInteractor::execute():Store Success | EMAIL: ${detailedEmail.emailId} | TIME: ${detailedEmail.createdTime}');
|
||||
yield Right<Failure, Success>(StoreNewEmailSuccess());
|
||||
} else {
|
||||
log('StoreNewEmailInteractor::execute():Store Failure | EMAIL: ${detailedEmail.emailId} | TIME: ${detailedEmail.createdTime}');
|
||||
yield Left<Failure, Success>(StoreNewEmailFailure(NewEmailAlreadyStoredException()));
|
||||
|
||||
for (var email in mapDetailedEmails.keys) {
|
||||
await _storeNewEmail(session, accountId, email, mapDetailedEmails[email]!);
|
||||
}
|
||||
|
||||
yield Right<Failure, Success>(StoreNewEmailSuccess());
|
||||
} catch (e) {
|
||||
yield Left<Failure, Success>(StoreNewEmailFailure(e));
|
||||
}
|
||||
}
|
||||
|
||||
Future<bool> _isNewEmailAlreadyStored(Session session, AccountId accountId, DetailedEmail detailedEmail) async {
|
||||
Future<bool> _isNewEmailAlreadyStored(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
DetailedEmail detailedEmail
|
||||
) async {
|
||||
try {
|
||||
await _emailRepository.getStoredNewEmail(session, accountId, detailedEmail.emailId);
|
||||
return true;
|
||||
@@ -50,4 +45,20 @@ class StoreNewEmailInteractor {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _storeNewEmail(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
Email email,
|
||||
DetailedEmail detailedEmail
|
||||
) async {
|
||||
final isNewEmailExist = await _isNewEmailAlreadyStored(session, accountId, detailedEmail);
|
||||
log('StoreNewEmailInteractor::execute():isNewEmailExist: $isNewEmailExist');
|
||||
if (!isNewEmailExist) {
|
||||
await Future.wait([
|
||||
_emailRepository.storeEmail(session, accountId, email),
|
||||
_emailRepository.storeDetailedNewEmail(session, accountId, detailedEmail),
|
||||
], eagerError: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user