TF-1923 Add createdTime for DetailedEmail

(cherry picked from commit 817c35849338c483feaa2a68586b162a8a67b9a2)
This commit is contained in:
dab246
2023-06-21 01:38:19 +07:00
committed by Dat H. Pham
parent 4ea620cc2b
commit 5faab2c306
21 changed files with 57 additions and 39 deletions
@@ -44,8 +44,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_composer_cache_on_web_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
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_worker_queue.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
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';
@@ -100,7 +100,7 @@ class ComposerBindings extends BaseBindings {
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<NewEmailCacheManager>(),
Get.find<OpenedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<NewEmailCacheWorkerQueue>(),
Get.find<OpenedEmailCacheWorkerQueue>(),
Get.find<EmailCacheManager>(),
Get.find<SendingEmailCacheManager>(),
@@ -31,8 +31,8 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r
import 'package:tmail_ui_user/features/offline_mode/extensions/list_sending_email_hive_cache_extension.dart';
import 'package:tmail_ui_user/features/offline_mode/extensions/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_worker_queue.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
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/model/detailed_email_hive_cache.dart';
@@ -49,7 +49,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
final NewEmailCacheManager _newEmailCacheManager;
final OpenedEmailCacheManager _openedEmailCacheManager;
final DetailedEmailCacheWorkerQueue _cacheWorkerQueue;
final NewEmailCacheWorkerQueue _newEmailCacheWorkerQueue;
final OpenedEmailCacheWorkerQueue _openedEmailCacheWorkerQueue;
final EmailCacheManager _emailCacheManager;
final SendingEmailCacheManager _sendingEmailCacheManager;
@@ -59,7 +59,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
EmailHiveCacheDataSourceImpl(
this._newEmailCacheManager,
this._openedEmailCacheManager,
this._cacheWorkerQueue,
this._newEmailCacheWorkerQueue,
this._openedEmailCacheWorkerQueue,
this._emailCacheManager,
this._sendingEmailCacheManager,
@@ -131,6 +131,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
Future<void> storeDetailedNewEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
return Future.sync(() async {
final task = HiveTask(
id: detailedEmail.emailId.asString,
runnable: () async {
final fileSaved = await _fileUtils.saveToFile(
nameFile: detailedEmail.emailId.asString,
@@ -139,15 +140,16 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
);
final detailedEmailSaved = detailedEmail.fromEmailContentPath(fileSaved.path);
final detailedEmailCacheSaved = detailedEmailSaved.toHiveCache();
final detailedEmailCache = await _newEmailCacheManager.storeDetailedNewEmail(
accountId,
session.username,
detailedEmailSaved.toHiveCache());
detailedEmailCacheSaved);
return detailedEmailCache;
});
return _cacheWorkerQueue.addTask(task);
return _newEmailCacheWorkerQueue.addTask(task);
}).catchError(_exceptionThrower.throwException);
}
@@ -172,6 +174,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
return Future.sync(() async {
final task = HiveTask(
id: detailedEmail.emailId.asString,
runnable: () async {
final fileSaved = await _fileUtils.saveToFile(
nameFile: detailedEmail.emailId.asString,
@@ -11,7 +11,7 @@ extension DetailedEmailExtension on DetailedEmail {
DetailedEmailHiveCache toHiveCache() {
return DetailedEmailHiveCache(
emailId: emailId.asString,
timeSaved: DateTime.now(),
timeSaved: createdTime,
attachments: attachments?.toHiveCache(),
headers: headers?.toList().toHiveCache(),
keywords: keywords?.toMapString(),
@@ -26,6 +26,7 @@ extension DetailedEmailExtension on DetailedEmail {
DetailedEmail fromEmailContentPath(String path) {
return DetailedEmail(
emailId: emailId,
createdTime: createdTime,
attachments: attachments,
headers: headers,
keywords: keywords,
@@ -10,6 +10,7 @@ extension DetailedEmailHiveCacheExtension on DetailedEmailHiveCache {
DetailedEmail toDetailedEmailWithContent(String emailContent) {
return DetailedEmail(
emailId: EmailId(Id(emailId)),
createdTime: timeSaved,
attachments: attachments?.toAttachment(),
headers: headers?.toSetEmailHeader(),
keywords: keywords != null
@@ -7,6 +7,7 @@ extension EmailExtension on Email {
DetailedEmail toDetailedEmail({String? htmlEmailContent}) {
return DetailedEmail(
emailId: id!,
createdTime: DateTime.now(),
attachments: allAttachments,
headers: headers,
keywords: keywords,
@@ -11,9 +11,11 @@ class DetailedEmail with EquatableMixin {
final Map<KeyWordIdentifier, bool>? keywords;
final String? htmlEmailContent;
final String? emailContentPath;
final DateTime createdTime;
DetailedEmail({
required this.emailId,
required this.createdTime,
this.attachments,
this.headers,
this.keywords,
@@ -24,6 +26,7 @@ class DetailedEmail with EquatableMixin {
@override
List<Object?> get props => [
emailId,
createdTime,
attachments,
headers,
keywords,
@@ -97,6 +97,7 @@ class GetEmailContentInteractor {
}
) async* {
try {
log('GetEmailContentInteractor::_getStoredOpenedEmail(): CALLED');
final detailedEmail = await emailRepository.getStoredOpenedEmail(session, accountId, emailId);
yield Right<Failure, Success>(GetEmailContentFromCacheSuccess(
emailContent: detailedEmail.htmlEmailContent ?? "",
@@ -130,6 +131,7 @@ class GetEmailContentInteractor {
}
) async* {
try {
log('GetEmailContentInteractor::_getStoredNewEmail():CALLED');
final detailedEmail = await emailRepository.getStoredNewEmail(session, accountId, emailId);
yield Right<Failure, Success>(GetEmailContentFromCacheSuccess(
emailContent: detailedEmail.htmlEmailContent ?? "",
@@ -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';
@@ -25,6 +26,7 @@ class StoreNewEmailInteractor {
_emailRepository.storeEmail(session, accountId, email),
_emailRepository.storeDetailedNewEmail(session, accountId, detailedEmail),
]);
log('StoreNewEmailInteractor::execute():Store Success | EMAIL: ${detailedEmail.htmlEmailContent} | TIME: ${detailedEmail.createdTime}');
yield Right<Failure, Success>(StoreNewEmailSuccess());
} catch (e) {
yield Left<Failure, Success>(StoreNewEmailFailure(e));
@@ -347,7 +347,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
if (emailLoaded != null) {
dispatchState(Right<Failure, Success>(GetEmailContentLoading()));
await Future.delayed(const Duration(milliseconds: 300));
consumeState(Stream.value(Right<Failure, Success>(
GetEmailContentSuccess(
emailContent: emailLoaded.emailContent,
@@ -407,6 +406,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
if (PlatformInfo.isMobile) {
final detailedEmail = DetailedEmail(
emailId: currentEmail!.id!,
createdTime: DateTime.now(),
attachments: attachments,
headers: currentEmail?.emailHeader?.toSet(),
keywords: currentEmail?.keywords,
@@ -43,8 +43,8 @@ import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repositor
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
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_worker_queue.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
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';
@@ -103,7 +103,7 @@ class EmailBindings extends BaseBindings {
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<NewEmailCacheManager>(),
Get.find<OpenedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<NewEmailCacheWorkerQueue>(),
Get.find<OpenedEmailCacheWorkerQueue>(),
Get.find<EmailCacheManager>(),
Get.find<SendingEmailCacheManager>(),
@@ -94,8 +94,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.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/new_email_cache_manager.dart';
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';
@@ -250,7 +250,7 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<NewEmailCacheManager>(),
Get.find<OpenedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<NewEmailCacheWorkerQueue>(),
Get.find<OpenedEmailCacheWorkerQueue>(),
Get.find<EmailCacheManager>(),
Get.find<SendingEmailCacheManager>(),
@@ -24,8 +24,8 @@ import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.dart';
import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.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/new_email_cache_manager.dart';
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';
@@ -65,7 +65,7 @@ class SendEmailInteractorBindings extends InteractorsBindings {
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<NewEmailCacheManager>(),
Get.find<OpenedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<NewEmailCacheWorkerQueue>(),
Get.find<OpenedEmailCacheWorkerQueue>(),
Get.find<EmailCacheManager>(),
Get.find<SendingEmailCacheManager>(),
@@ -1,8 +0,0 @@
import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_worker_queue.dart';
class DetailedEmailCacheWorkerQueue extends WorkerQueue {
@override
String get workerName => 'DetailedEmailCache';
}
@@ -1,4 +1,5 @@
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/file_utils.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
@@ -24,20 +25,19 @@ class NewEmailCacheManager {
DetailedEmailHiveCache detailedEmailCache
) async {
final listDetailedEmails = await getAllDetailedEmails(accountId, userName);
log('NewEmailCacheManager::storeDetailedNewEmail():listDetailedEmails: $listDetailedEmails');
if (listDetailedEmails.length >= CachingConstants.maxNumberNewEmailsForOffline) {
final lastElementsListEmail = listDetailedEmails.sublist(
CachingConstants.maxNumberNewEmailsForOffline - 1,
listDetailedEmails.length);
final lastElementsListEmail = listDetailedEmails.sublist(CachingConstants.maxNumberNewEmailsForOffline - 1);
for (var email in lastElementsListEmail) {
if (email.emailContentPath != null) {
await _deleteFileExisted(email.emailContentPath!);
}
await removeDetailedEmail(accountId, userName, email.emailId);
}
log('NewEmailCacheManager::storeDetailedNewEmail(): DELETE COMPLETED');
}
await insertDetailedEmail(accountId, userName, detailedEmailCache);
log('NewEmailCacheManager::storeDetailedNewEmail(): INSERT COMPLETED');
return detailedEmailCache;
}
@@ -82,4 +82,6 @@ class NewEmailCacheManager {
throw NotFoundStoredNewEmailException();
}
}
Future<void> closeNewEmailHiveCacheBox() => _cacheClient.closeBox();
}
@@ -0,0 +1,8 @@
import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_worker_queue.dart';
class NewEmailCacheWorkerQueue extends WorkerQueue {
@override
String get workerName => 'NewEmailCache';
}
@@ -54,9 +54,7 @@ class OpenedEmailCacheManager {
final listDetailedEmails = await getAllDetailedEmails(accountId, userName);
if (listDetailedEmails.length >= CachingConstants.maxNumberOpenedEmailsForOffline) {
final lastElementsListEmail = listDetailedEmails.sublist(
CachingConstants.maxNumberOpenedEmailsForOffline - 1,
listDetailedEmails.length);
final lastElementsListEmail = listDetailedEmails.sublist(CachingConstants.maxNumberOpenedEmailsForOffline - 1);
for (var email in lastElementsListEmail) {
if (email.emailContentPath != null) {
await _deleteFileExisted(email.emailContentPath!);
@@ -3,5 +3,5 @@ import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_worker_queu
class OpenedEmailCacheWorkerQueue extends WorkerQueue {
@override
String get workerName => 'OpenedEmailCacheQueue';
String get workerName => 'OpenedEmailCache';
}
@@ -23,8 +23,8 @@ import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/state_dataso
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.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/new_email_cache_manager.dart';
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';
@@ -106,7 +106,7 @@ class FcmInteractorBindings extends InteractorsBindings {
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<NewEmailCacheManager>(),
Get.find<OpenedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<NewEmailCacheWorkerQueue>(),
Get.find<OpenedEmailCacheWorkerQueue>(),
Get.find<EmailCacheManager>(),
Get.find<SendingEmailCacheManager>(),
@@ -24,6 +24,7 @@ import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.d
import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
import 'package:tmail_ui_user/features/push_notification/presentation/action/fcm_action.dart';
import 'package:tmail_ui_user/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart';
import 'package:tmail_ui_user/features/push_notification/presentation/controller/fcm_base_controller.dart';
@@ -50,6 +51,7 @@ class FcmMessageController extends FcmBaseController {
DynamicUrlInterceptors? _dynamicUrlInterceptors;
AuthorizationInterceptors? _authorizationInterceptors;
GetSessionInteractor? _getSessionInteractor;
NewEmailCacheManager? _newEmailCacheManager;
FcmMessageController._internal() {
_listenFcmStream();
@@ -197,7 +199,9 @@ class FcmMessageController extends FcmBaseController {
FcmInteractorBindings().dependencies();
});
return await _getInteractorBindings();
await _getInteractorBindings();
await _newEmailCacheManager?.closeNewEmailHiveCacheBox();
}
Future<void> _getInteractorBindings() {
@@ -206,6 +210,7 @@ class FcmMessageController extends FcmBaseController {
_dynamicUrlInterceptors = getBinding<DynamicUrlInterceptors>();
_authorizationInterceptors = getBinding<AuthorizationInterceptors>();
_getSessionInteractor = getBinding<GetSessionInteractor>();
_newEmailCacheManager = getBinding<NewEmailCacheManager>();
FcmTokenController.instance.initialize();
} catch (e) {
logError('FcmMessageController::_getBindings(): ${e.toString()}');
@@ -4,12 +4,12 @@ import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart';
import 'package:tmail_ui_user/features/sending_queue/data/repository/sending_queue_repository_impl.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/repository/sending_queue_repository.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/delete_multiple_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/delete_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/get_all_sending_email_interactor.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/manager/sending_email_cache_manager.dart';
@@ -29,7 +29,7 @@ class SendingQueueInteractorBindings extends InteractorsBindings {
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<NewEmailCacheManager>(),
Get.find<OpenedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<NewEmailCacheWorkerQueue>(),
Get.find<OpenedEmailCacheWorkerQueue>(),
Get.find<EmailCacheManager>(),
Get.find<SendingEmailCacheManager>(),
+2 -2
View File
@@ -31,8 +31,8 @@ import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/share_preference_spam_report_data_source.dart';
import 'package:tmail_ui_user/features/manage_account/data/local/language_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/new_email_cache_manager.dart';
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';
@@ -105,7 +105,7 @@ class LocalBindings extends Bindings {
}
void _bindingWorkerQueue() {
Get.put(DetailedEmailCacheWorkerQueue());
Get.put(NewEmailCacheWorkerQueue());
Get.put(OpenedEmailCacheWorkerQueue());
}
}