TF-1923 Fix new email offline mode not working

(cherry picked from commit c1c48e93d50cb0ebbccaf11c3f4a975af640b63a)
This commit is contained in:
dab246
2023-06-20 22:20:23 +07:00
committed by Dat H. Pham
parent b1a0cab02b
commit 6d96a1109e
35 changed files with 333 additions and 261 deletions
@@ -153,7 +153,7 @@ class EmailDataSourceImpl extends EmailDataSource {
}
@override
Future<void> storeDetailedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
Future<void> storeDetailedNewEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
throw UnimplementedError();
}
@@ -175,12 +175,12 @@ class EmailDataSourceImpl extends EmailDataSource {
}
@override
Future<DetailedEmail> getOpenedEmail(Session session, AccountId accountId, EmailId emailId) {
Future<DetailedEmail> getStoredOpenedEmail(Session session, AccountId accountId, EmailId emailId) {
throw UnimplementedError();
}
@override
Future<DetailedEmail?> getIncomingEmailedStored(Session session, AccountId accountId, EmailId emailId) {
Future<DetailedEmail> getStoredNewEmail(Session session, AccountId accountId, EmailId emailId) {
throw UnimplementedError();
}
@@ -31,10 +31,11 @@ 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_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/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';
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';
@@ -46,7 +47,7 @@ import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
class EmailHiveCacheDataSourceImpl extends EmailDataSource {
final DetailedEmailCacheManager _detailedEmailCacheManager;
final NewEmailCacheManager _newEmailCacheManager;
final OpenedEmailCacheManager _openedEmailCacheManager;
final DetailedEmailCacheWorkerQueue _cacheWorkerQueue;
final OpenedEmailCacheWorkerQueue _openedEmailCacheWorkerQueue;
@@ -56,7 +57,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
final ExceptionThrower _exceptionThrower;
EmailHiveCacheDataSourceImpl(
this._detailedEmailCacheManager,
this._newEmailCacheManager,
this._openedEmailCacheManager,
this._cacheWorkerQueue,
this._openedEmailCacheWorkerQueue,
@@ -127,7 +128,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
}
@override
Future<void> storeDetailedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
Future<void> storeDetailedNewEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
return Future.sync(() async {
final task = HiveTask(
runnable: () async {
@@ -136,17 +137,17 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
content: detailedEmail.htmlEmailContent ?? '',
folderPath: detailedEmail.newEmailFolderPath
);
log('EmailHiveCacheDataSourceImpl::storeDetailedEmailToCache():fileSavedPath: ${fileSaved.path}');
final detailedEmailSaved = detailedEmail.fromEmailContentPath(fileSaved.path);
final detailedEmailCache = await _detailedEmailCacheManager.handleStoreDetailedEmail(
final detailedEmailCache = await _newEmailCacheManager.storeDetailedNewEmail(
accountId,
session.username,
detailedEmailSaved.toHiveCache());
return detailedEmailCache;
});
return await _cacheWorkerQueue.addTask(task);
return _cacheWorkerQueue.addTask(task);
}).catchError(_exceptionThrower.throwException);
}
@@ -171,71 +172,59 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
return Future.sync(() async {
final task = HiveTask(
runnable: () async {
runnable: () async {
final detailedEmailExisted = await _openedEmailCacheManager.isOpenedEmailAlreadyStored(accountId, session.username, detailedEmail.emailId);
final detailedEmailExisted = await _openedEmailCacheManager.isOpenedDetailEmailCached(accountId, session.username, detailedEmail.emailId);
log('EmailHiveCacheDataSourceImpl::storeOpenedEmail():detailedEmailExisted: $detailedEmailExisted');
if (detailedEmailExisted) {
return Future.value();
}
if (detailedEmailExisted) {
return Future.value();
}
final fileSaved = await _fileUtils.saveToFile(
nameFile: detailedEmail.emailId.asString,
content: detailedEmail.htmlEmailContent ?? '',
folderPath: detailedEmail.openedEmailFolderPath
);
final fileSaved = await _fileUtils.saveToFile(
nameFile: detailedEmail.emailId.asString,
content: detailedEmail.htmlEmailContent ?? '',
folderPath: detailedEmail.openedEmailFolderPath
);
final detailedEmailSaved = detailedEmail.fromEmailContentPath(fileSaved.path);
log('EmailHiveCacheDataSourceImpl::storeOpenedEmail():fileSavedPath: ${fileSaved.path}');
final detailedEmailCache = await _openedEmailCacheManager.storeOpenedEmail(
accountId,
session.username,
detailedEmailSaved.toHiveCache());
final detailedEmailSaved = detailedEmail.fromEmailContentPath(fileSaved.path);
await _openedEmailCacheManager.storeOpenedEmail(
accountId,
session.username,
detailedEmailSaved);
});
return detailedEmailCache;
});
return _openedEmailCacheWorkerQueue.addTask(task);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<DetailedEmail?> getOpenedEmail(Session session, AccountId accountId, EmailId emailId) {
Future<DetailedEmail> getStoredOpenedEmail(Session session, AccountId accountId, EmailId emailId) {
return Future.sync(() async {
final openedEmailHiveCache = await _openedEmailCacheManager.getOpenedEmailExistedInCache(accountId, session.username, emailId);
final listResult = await Future.wait([
_openedEmailCacheManager.getStoredOpenedEmail(accountId, session.username, emailId),
_fileUtils.getContentFromFile(nameFile: emailId.asString, folderPath: CachingConstants.openedEmailContentFolderName)
], eagerError: true);
if (openedEmailHiveCache == null) {
return null;
}
log('EmailHiveCacheDataSourceImpl::getOpenedEmail():folderPath: ${openedEmailHiveCache.emailContentPath}');
final emailContent = await _fileUtils.getContentFromFile(
nameFile: emailId.asString,
folderPath: CachingConstants.openedEmailContentFolderName
);
return openedEmailHiveCache.toDetailedEmailWithContent(emailContent);
final detailedEmailCache = listResult[0] as DetailedEmailHiveCache;
final emailContent = listResult[1] as String;
log('EmailHiveCacheDataSourceImpl::getStoredOpenedEmail():detailedEmailCache: ${detailedEmailCache.emailId} | emailContent: $emailContent');
return detailedEmailCache.toDetailedEmailWithContent(emailContent);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<DetailedEmail?> getIncomingEmailedStored(Session session, AccountId accountId, EmailId emailId) {
Future<DetailedEmail> getStoredNewEmail(Session session, AccountId accountId, EmailId emailId) {
return Future.sync(() async {
final detailedEmailHiveCache = await _detailedEmailCacheManager.getDetailEmailExistedInCache(accountId, session.username, emailId);
final listResult = await Future.wait([
_newEmailCacheManager.getStoredNewEmail(accountId, session.username, emailId),
_fileUtils.getContentFromFile(nameFile: emailId.asString, folderPath: CachingConstants.newEmailsContentFolderName)
], eagerError: true);
if (detailedEmailHiveCache == null) {
return null;
}
log('EmailHiveCacheDataSourceImpl::getDetailedEmail():folderPath: ${detailedEmailHiveCache.emailContentPath}');
final emailContent = await _fileUtils.getContentFromFile(
nameFile: emailId.asString,
folderPath: CachingConstants.incomingEmailedContentFolderName
);
return detailedEmailHiveCache.toDetailedEmailWithContent(emailContent);
final detailedEmailCache = listResult[0] as DetailedEmailHiveCache;
final emailContent = listResult[1] as String;
log('EmailHiveCacheDataSourceImpl::getStoredNewEmail():detailedEmailCache: ${detailedEmailCache.emailId} | emailContent: $emailContent');
return detailedEmailCache.toDetailedEmailWithContent(emailContent);
}).catchError(_exceptionThrower.throwException);
}