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
@@ -1,24 +1,24 @@
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';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/caching/clients/detailed_email_hive_cache_client.dart';
import 'package:tmail_ui_user/features/caching/clients/new_email_hive_cache_client.dart';
import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart';
import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart';
import 'package:tmail_ui_user/features/email/domain/exceptions/email_cache_exceptions.dart';
import 'package:tmail_ui_user/features/offline_mode/extensions/list_detailed_email_hive_cache_extension.dart';
import 'package:tmail_ui_user/features/offline_mode/model/detailed_email_hive_cache.dart';
class DetailedEmailCacheManager {
class NewEmailCacheManager {
final DetailedEmailHiveCacheClient _cacheClient;
final NewEmailHiveCacheClient _cacheClient;
final FileUtils _fileUtils;
DetailedEmailCacheManager(this._cacheClient, this._fileUtils);
NewEmailCacheManager(this._cacheClient, this._fileUtils);
Future<DetailedEmailHiveCache> handleStoreDetailedEmail(
Future<DetailedEmailHiveCache> storeDetailedNewEmail(
AccountId accountId,
UserName userName,
DetailedEmailHiveCache detailedEmailCache
@@ -26,9 +26,10 @@ class DetailedEmailCacheManager {
final listDetailedEmails = await getAllDetailedEmails(accountId, userName);
if (listDetailedEmails.length >= CachingConstants.maxNumberNewEmailsForOffline) {
final lastElementsListEmail = listDetailedEmails.sublist(CachingConstants.maxNumberNewEmailsForOffline, listDetailedEmails.length);
final lastElementsListEmail = listDetailedEmails.sublist(
CachingConstants.maxNumberNewEmailsForOffline - 1,
listDetailedEmails.length);
for (var email in lastElementsListEmail) {
log('DetailedEmailCacheManager::handleStoreDetailedEmail():latestEmail: $email');
if (email.emailContentPath != null) {
await _deleteFileExisted(email.emailContentPath!);
}
@@ -46,7 +47,6 @@ class DetailedEmailCacheManager {
DetailedEmailHiveCache detailedEmailCache
) {
final keyCache = TupleKey(detailedEmailCache.emailId, accountId.asString, userName.value).encodeKey;
log('DetailedEmailCacheManager::insertDetailedEmail(): $keyCache');
return _cacheClient.insertItem(keyCache, detailedEmailCache);
}
@@ -56,14 +56,12 @@ class DetailedEmailCacheManager {
String emailId
) {
final keyCache = TupleKey(emailId, accountId.asString, userName.value).encodeKey;
log('DetailedEmailCacheManager::removeDetailedEmail(): $keyCache');
return _cacheClient.deleteItem(keyCache);
}
Future<List<DetailedEmailHiveCache>> getAllDetailedEmails(AccountId accountId, UserName userName) async {
final detailedEmailCacheList = await _cacheClient.getListByTupleKey(accountId.asString, userName.value);
detailedEmailCacheList.sortByLatestTime();
log('DetailedEmailCacheManager::getAllDetailedEmails():SIZE: ${detailedEmailCacheList.length}');
return detailedEmailCacheList;
}
@@ -71,14 +69,17 @@ class DetailedEmailCacheManager {
await _fileUtils.deleteFile(pathFile);
}
Future<DetailedEmailHiveCache?> getDetailEmailExistedInCache(
Future<DetailedEmailHiveCache> getStoredNewEmail(
AccountId accountId,
UserName userName,
EmailId emailId
) async {
final keyCache = TupleKey(emailId.asString, accountId.asString, userName.value).encodeKey;
final detailedEmailCache = await _cacheClient.getItem(keyCache, needToReopen: true);
log('DetailedEmailCacheManager::getDetailEmailExistedInCache():Email: $detailedEmailCache');
return detailedEmailCache;
if (detailedEmailCache != null) {
return detailedEmailCache;
} else {
throw NotFoundStoredNewEmailException();
}
}
}
@@ -8,8 +8,7 @@ import 'package:model/extensions/email_id_extensions.dart';
import 'package:tmail_ui_user/features/caching/clients/opened_email_hive_cache_client.dart';
import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart';
import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart';
import 'package:tmail_ui_user/features/email/domain/extensions/detailed_email_extension.dart';
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
import 'package:tmail_ui_user/features/email/domain/exceptions/email_cache_exceptions.dart';
import 'package:tmail_ui_user/features/offline_mode/extensions/list_detailed_email_hive_cache_extension.dart';
import 'package:tmail_ui_user/features/offline_mode/model/detailed_email_hive_cache.dart';
@@ -47,55 +46,58 @@ class OpenedEmailCacheManager {
return detailedEmailCacheList;
}
Future<void> storeOpenedEmail(
Future<DetailedEmailHiveCache> storeOpenedEmail(
AccountId accountId,
UserName userName,
DetailedEmail detailedEmail
DetailedEmailHiveCache detailedEmailCache
) async {
final listDetailedEmails = await getAllDetailedEmails(accountId, userName);
if (listDetailedEmails.length >= CachingConstants.maxNumberOpenedEmailsForOffline) {
final lastElementsListEmail = listDetailedEmails.sublist(CachingConstants.maxNumberOpenedEmailsForOffline, listDetailedEmails.length);
final lastElementsListEmail = listDetailedEmails.sublist(
CachingConstants.maxNumberOpenedEmailsForOffline - 1,
listDetailedEmails.length);
for (var email in lastElementsListEmail) {
log('OpenedEmailCacheManager::handleStoreDetailedEmail():latestEmail: $email');
if (email.emailContentPath != null) {
await _deleteFileExisted(email.emailContentPath!);
}
await removeDetailedEmail(accountId, userName, email.emailId);
}
}
await insertDetailedEmail(accountId, userName, detailedEmail.toHiveCache());
await insertDetailedEmail(accountId, userName, detailedEmailCache);
return detailedEmailCache;
}
Future<bool> isOpenedDetailEmailCached(
Future<bool> isOpenedEmailAlreadyStored(
AccountId accountId,
UserName userName,
EmailId emailId
) async {
final emailContentPathExists = await _isFileExisted(emailId);
final detailedEmailCacheExists = await getOpenedEmailExistedInCache(accountId, userName, emailId);
final listResult = await Future.wait([
getStoredOpenedEmail(accountId, userName, emailId),
_fileUtils.isFileExisted(
nameFile: emailId.asString,
folderPath: CachingConstants.openedEmailContentFolderName)
], eagerError: true);
return emailContentPathExists == true && detailedEmailCacheExists != null;
final emailContentPathExists = listResult.last as bool;
return emailContentPathExists;
}
Future<bool?> _isFileExisted(EmailId emailId) async {
final fileSaved = await _fileUtils.isFileExisted(
nameFile: emailId.asString,
folderPath: CachingConstants.openedEmailContentFolderName,
);
log('OpenedEmailCacheManager::_getDetailedEmailCache():_getEmailContentPath: $fileSaved');
return fileSaved;
}
Future<DetailedEmailHiveCache?> getOpenedEmailExistedInCache(
Future<DetailedEmailHiveCache> getStoredOpenedEmail(
AccountId accountId,
UserName userName,
EmailId emailId
) async {
final keyCache = TupleKey(emailId.asString, accountId.asString, userName.value).encodeKey;
final detailedEmailCache = await _cacheClient.getItem(keyCache,needToReopen: true);
log('OpenedEmailCacheManager::getOpenedEmailExistedInCache(): $detailedEmailCache');
return detailedEmailCache;
final detailedEmailCache = await _cacheClient.getItem(keyCache, needToReopen: true);
if (detailedEmailCache != null) {
return detailedEmailCache;
} else {
throw NotFoundStoredOpenedEmailException();
}
}
Future<void> _deleteFileExisted(String pathFile) async {