TF-1808: Hanlde store email when opening email

(cherry picked from commit 2c895379f83b34e9bafb7545b21d790d01d444af)
This commit is contained in:
HuyNguyen
2023-05-11 17:27:42 +07:00
committed by Dat Vu
parent 28d75ce384
commit 63f375a29c
22 changed files with 215 additions and 95 deletions
@@ -80,5 +80,5 @@ abstract class EmailDataSource {
Future<void> storeEmail(Session session, AccountId accountId, Email email);
Future<void> storeOpenedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail);
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail);
}
@@ -168,7 +168,7 @@ class EmailDataSourceImpl extends EmailDataSource {
}
@override
Future<void> storeOpenedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail) {
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
throw UnimplementedError();
}
}
@@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_reques
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.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';
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/worker/hive_task.dart';
import 'package:tmail_ui_user/features/thread/data/extensions/email_extension.dart';
@@ -36,6 +37,7 @@ import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
class EmailHiveCacheDataSourceImpl extends EmailDataSource {
final DetailedEmailCacheManager _detailedEmailCacheManager;
final OpenedEmailCacheManager _openedEmailCacheManager;
final DetailedEmailCacheWorkerQueue _cacheWorkerQueue;
final OpenedEmailCacheWorkerQueue _openedEmailCacheWorkerQueue;
final EmailCacheManager _emailCacheManager;
@@ -44,6 +46,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
EmailHiveCacheDataSourceImpl(
this._detailedEmailCacheManager,
this._openedEmailCacheManager,
this._cacheWorkerQueue,
this._openedEmailCacheWorkerQueue,
this._emailCacheManager,
@@ -119,8 +122,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
final fileSaved = await _fileUtils.saveToFile(
nameFile: detailedEmail.emailId.asString,
content: detailedEmail.htmlEmailContent ?? '',
folderPath: detailedEmail.folderPath,
extensionFile: ExtensionType.text.value
folderPath: detailedEmail.folderPath
);
log('EmailHiveCacheDataSourceImpl::storeDetailedEmailToCache():fileSavedPath: ${fileSaved.path}');
final detailedEmailSaved = detailedEmail.fromEmailContentPath(fileSaved.path);
@@ -154,25 +156,34 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
}
@override
Future<void> storeOpenedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail) {
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
return Future.sync(() async {
final task = HiveTask(
runnable: () async {
final detailedEmailExisted = await _openedEmailCacheManager.isOpenedDetailEmailCached(accountId, session.username,detailedEmail);
log('EmailHiveCacheDataSourceImpl::storeOpenedEmail():detailedEmailExisted: $detailedEmailExisted');
if (detailedEmailExisted) {
return Future.value();
}
final fileSaved = await _fileUtils.saveToFile(
nameFile: detailedEmail.emailId.asString,
content: detailedEmail.htmlEmailContent ?? '',
folderPath: detailedEmail.folderPath,
extensionFile: ExtensionType.text.value
folderPath: detailedEmail.folderPath
);
log('EmailHiveCacheDataSourceImpl::storeOpenedEmailToCache():fileSavedPath: ${fileSaved.path}');
log('EmailHiveCacheDataSourceImpl::storeOpenedEmail():fileSavedPath: ${fileSaved.path}');
final detailedEmailSaved = detailedEmail.fromEmailContentPath(fileSaved.path);
await _detailedEmailCacheManager.storeOpenedEmail(
await _openedEmailCacheManager.storeOpenedEmail(
accountId,
session.username,
detailedEmailSaved);
});
return await _openedEmailCacheWorkerQueue.addTask(task);
return _openedEmailCacheWorkerQueue.addTask(task);
}).catchError(_exceptionThrower.throwException);
}
}
@@ -200,7 +200,7 @@ class EmailRepositoryImpl extends EmailRepository {
}
@override
Future<void> storeOpenedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail) {
return emailDataSource[DataSourceType.hiveCache]!.storeOpenedEmailToCache(session, accountId, detailedEmail);
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
return emailDataSource[DataSourceType.hiveCache]!.storeOpenedEmail(session, accountId, detailedEmail);
}
}
@@ -94,5 +94,5 @@ abstract class EmailRepository {
Future<void> storeEmailToCache(Session session, AccountId accountId, Email email);
Future<void> storeOpenedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail);
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail);
}
@@ -1,12 +1,13 @@
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
class StoreOpenedEmailToCacheLoading extends UIState {}
class StoreOpenedEmailLoading extends UIState {}
class StoreOpenedEmailToCacheSuccess extends UIState {}
class StoreOpenedEmailSuccess extends UIState {}
class StoreOpenedEmailToCacheFailure extends FeatureFailure {
class StoreOpenedEmailFailure extends FeatureFailure {
StoreOpenedEmailToCacheFailure(dynamic exception) : super(exception: exception);
StoreOpenedEmailFailure(dynamic exception) : super(exception: exception);
@override
List<Object?> get props => [exception];
@@ -18,11 +18,11 @@ class StoreOpenedEmailToCacheInteractor {
DetailedEmail detailedEmail
) async* {
try {
yield Right<Failure, Success>(StoreOpenedEmailToCacheLoading());
await _emailRepository.storeOpenedEmailToCache(session, accountId, detailedEmail);
yield Right<Failure, Success>(StoreOpenedEmailToCacheSuccess());
yield Right<Failure, Success>(StoreOpenedEmailLoading());
await _emailRepository.storeOpenedEmail(session, accountId, detailedEmail);
yield Right<Failure, Success>(StoreOpenedEmailSuccess());
} catch (e) {
yield Left<Failure, Success>(StoreOpenedEmailToCacheFailure(e));
yield Left<Failure, Success>(StoreOpenedEmailFailure(e));
}
}
}
@@ -26,6 +26,8 @@ import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/store_opened_email_to_cache_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/controller/email_supervisor_controller.dart';
import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
@@ -91,6 +93,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
final MarkAsStarEmailInteractor _markAsStarEmailInteractor;
final DownloadAttachmentForWebInteractor _downloadAttachmentForWebInteractor;
final GetAllIdentitiesInteractor _getAllIdentitiesInteractor;
final StoreOpenedEmailToCacheInteractor _storeOpenedEmailToCacheInteractor;
CreateNewEmailRuleFilterInteractor? _createNewEmailRuleFilterInteractor;
SendReceiptToSenderInteractor? _sendReceiptToSenderInteractor;
@@ -125,6 +128,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
this._markAsStarEmailInteractor,
this._downloadAttachmentForWebInteractor,
this._getAllIdentitiesInteractor,
this._storeOpenedEmailToCacheInteractor
);
@override
@@ -370,6 +374,21 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
initialEmailContents = success.emailContents;
attachments.value = success.attachments;
if (!BuildUtils.isWeb) {
final detailedEmail = DetailedEmail(
emailId: currentEmail!.id!,
attachments: attachments,
headers: currentEmail?.emailHeader,
htmlEmailContent: emailContents.asHtmlString
);
_storeOpenedEmailToCache(
mailboxDashBoardController.sessionCurrent,
mailboxDashBoardController.accountId.value,
detailedEmail
);
}
final isShowMessageReadReceipt = success.emailCurrent
?.hasReadReceipt(mailboxDashBoardController.mapMailboxById) == true;
if (isShowMessageReadReceipt) {
@@ -1193,4 +1212,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
}
return false;
}
void _storeOpenedEmailToCache(Session? session, AccountId? accountId, DetailedEmail detailedEmail) async {
if (session != null && accountId != null) {
consumeState(_storeOpenedEmailToCacheInteractor.execute(session, accountId, detailedEmail));
}
}
}
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/get_stored_email_st
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/store_opened_email_to_cache_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/controller/email_supervisor_controller.dart';
import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart';
import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart';
@@ -44,6 +45,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_id
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.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';
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/thread/data/local/email_cache_manager.dart';
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
@@ -55,15 +57,16 @@ class EmailBindings extends BaseBindings {
void bindingsController() {
Get.put(EmailSupervisorController());
Get.put(SingleEmailController(
Get.find<GetEmailContentInteractor>(),
Get.find<MarkAsEmailReadInteractor>(),
Get.find<DownloadAttachmentsInteractor>(),
Get.find<DeviceManager>(),
Get.find<ExportAttachmentInteractor>(),
Get.find<MoveToMailboxInteractor>(),
Get.find<MarkAsStarEmailInteractor>(),
Get.find<DownloadAttachmentForWebInteractor>(),
Get.find<GetAllIdentitiesInteractor>(),
Get.find<GetEmailContentInteractor>(),
Get.find<MarkAsEmailReadInteractor>(),
Get.find<DownloadAttachmentsInteractor>(),
Get.find<DeviceManager>(),
Get.find<ExportAttachmentInteractor>(),
Get.find<MoveToMailboxInteractor>(),
Get.find<MarkAsStarEmailInteractor>(),
Get.find<DownloadAttachmentForWebInteractor>(),
Get.find<GetAllIdentitiesInteractor>(),
Get.find<StoreOpenedEmailToCacheInteractor>()
));
}
@@ -98,6 +101,7 @@ class EmailBindings extends BaseBindings {
Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>(), Get.find<CacheExceptionThrower>()));
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<DetailedEmailCacheManager>(),
Get.find<OpenedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<OpenedEmailCacheWorkerQueue>(),
Get.find<EmailCacheManager>(),
@@ -134,6 +138,7 @@ class EmailBindings extends BaseBindings {
Get.find<AccountRepository>(),
Get.find<AuthenticationOIDCRepository>()));
Get.lazyPut(() => GetStoredEmailStateInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => StoreOpenedEmailToCacheInteractor(Get.find<EmailRepository>()));
IdentityInteractorsBindings().dependencies();
}