TF-1809: Handle sync data from cache and network when get email contents

(cherry picked from commit 896059cd5b29c62c2cf34621fe35d7b23a54acf4)
This commit is contained in:
HuyNguyen
2023-05-18 11:56:24 +07:00
committed by Dat Vu
parent b17e4e4728
commit 48f5a8b51f
19 changed files with 205 additions and 135 deletions
@@ -1,5 +1,6 @@
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:model/extensions/account_id_extensions.dart';
@@ -12,8 +13,9 @@ import 'package:tmail_ui_user/features/offline_mode/model/detailed_email_hive_ca
class DetailedEmailCacheManager {
final DetailedEmailHiveCacheClient _cacheClient;
final FileUtils _fileUtils;
DetailedEmailCacheManager(this._cacheClient);
DetailedEmailCacheManager(this._cacheClient, this._fileUtils);
Future<DetailedEmailHiveCache> handleStoreDetailedEmail(
AccountId accountId,
@@ -23,9 +25,14 @@ class DetailedEmailCacheManager {
final listDetailedEmails = await getAllDetailedEmails(accountId, userName);
if (listDetailedEmails.length >= CachingConstants.maxNumberNewEmailsForOffline) {
final latestEmail = listDetailedEmails.last;
log('DetailedEmailCacheManager::handleStoreDetailedEmail():latestEmail: $latestEmail');
await removeDetailedEmail(accountId, userName, latestEmail.emailId);
final lastElementsListEmail = listDetailedEmails.sublist(CachingConstants.maxNumberNewEmailsForOffline, listDetailedEmails.length);
for (var email in lastElementsListEmail) {
log('DetailedEmailCacheManager::handleStoreDetailedEmail():latestEmail: $email');
if (email.emailContentPath != null) {
await _deleteFileExisted(email.emailContentPath!);
}
await removeDetailedEmail(accountId, userName, email.emailId);
}
}
await insertDetailedEmail(accountId, userName, detailedEmailCache);
@@ -58,4 +65,8 @@ class DetailedEmailCacheManager {
log('DetailedEmailCacheManager::getAllDetailedEmails():SIZE: ${detailedEmailCacheList.length}');
return detailedEmailCacheList;
}
Future<void> _deleteFileExisted(String pathFile) async {
await _fileUtils.deleteFile(pathFile);
}
}
@@ -21,9 +21,9 @@ class OpenedEmailCacheManager {
OpenedEmailCacheManager(this._cacheClient, this._fileUtils);
Future<void> insertDetailedEmail(
AccountId accountId,
UserName userName,
DetailedEmailHiveCache detailedEmailCache
AccountId accountId,
UserName userName,
DetailedEmailHiveCache detailedEmailCache
) {
final keyCache = TupleKey(detailedEmailCache.emailId, accountId.asString, userName.value).encodeKey;
log('OpenedEmailCacheManager::insertDetailedEmail(): $keyCache');
@@ -31,9 +31,9 @@ class OpenedEmailCacheManager {
}
Future<void> removeDetailedEmail(
AccountId accountId,
UserName userName,
String emailId
AccountId accountId,
UserName userName,
String emailId
) {
final keyCache = TupleKey(emailId, accountId.asString, userName.value).encodeKey;
log('OpenedEmailCacheManager::removeDetailedEmail(): $keyCache');
@@ -48,35 +48,40 @@ class OpenedEmailCacheManager {
}
Future<void> storeOpenedEmail(
AccountId accountId,
UserName userName,
DetailedEmail detailedEmail
AccountId accountId,
UserName userName,
DetailedEmail detailedEmail
) async {
final listDetailedEmails = await getAllDetailedEmails(accountId, userName);
if (listDetailedEmails.length >= CachingConstants.maxNumberOpenedEmailsForOffline) {
final latestEmail = listDetailedEmails.last;
log('OpenedEmailCacheManager::handleStoreDetailedEmail():latestEmail: $latestEmail');
await removeDetailedEmail(accountId, userName, latestEmail.emailId);
final lastElementsListEmail = listDetailedEmails.sublist(CachingConstants.maxNumberOpenedEmailsForOffline, 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());
}
Future<bool> isOpenedDetailEmailCached(
AccountId accountId,
UserName userName,
DetailedEmail detailedEmail
AccountId accountId,
UserName userName,
EmailId emailId
) async {
final emailContentPathExists = await _isFileExisted(detailedEmail);
final detailedEmailCacheExists = await getDetailEmailExistedInCache(accountId, userName, detailedEmail.emailId);
final emailContentPathExists = await _isFileExisted(emailId);
final detailedEmailCacheExists = await getDetailEmailExistedInCache(accountId, userName, emailId);
return emailContentPathExists == true && detailedEmailCacheExists != null;
}
Future<bool?> _isFileExisted(DetailedEmail detailedEmail) async {
Future<bool?> _isFileExisted(EmailId emailId) async {
final fileSaved = await _fileUtils.isFileExisted(
nameFile: detailedEmail.emailId.asString,
folderPath: detailedEmail.folderPath,
nameFile: emailId.asString,
folderPath: CachingConstants.openedEmailContentFolderNamee,
);
log('OpenedEmailCacheManager::_getDetailedEmailCache():_getEmailContentPath: $fileSaved');
return fileSaved;
@@ -93,4 +98,7 @@ class OpenedEmailCacheManager {
return detailedEmailCache;
}
Future<void> _deleteFileExisted(String pathFile) async {
await _fileUtils.deleteFile(pathFile);
}
}