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
@@ -1,24 +1,19 @@
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';
import 'package:model/extensions/email_id_extensions.dart';
import 'package:tmail_ui_user/features/caching/clients/detailed_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/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 {
final DetailedEmailHiveCacheClient _cacheClient;
final FileUtils _fileUtils;
DetailedEmailCacheManager(this._cacheClient, this._fileUtils);
DetailedEmailCacheManager(this._cacheClient);
Future<DetailedEmailHiveCache> handleStoreDetailedEmail(
AccountId accountId,
@@ -63,56 +58,4 @@ class DetailedEmailCacheManager {
log('DetailedEmailCacheManager::getAllDetailedEmails():SIZE: ${detailedEmailCacheList.length}');
return detailedEmailCacheList;
}
Future<void> storeOpenedEmail(
AccountId accountId,
UserName userName,
DetailedEmail detailedEmail
) async {
final listDetailedEmails = await getAllDetailedEmails(accountId, userName);
final checkDuplicateDetailedEmail = await _handleDuplicateOpenedEmail(accountId, detailedEmail);
if (checkDuplicateDetailedEmail) {
return Future.value();
}
if (listDetailedEmails.length >= CachingConstants.maxNumberOpenedEmailsForOffline) {
final latestEmail = listDetailedEmails.last;
log('DetailedEmailCacheManager::handleStoreDetailedEmail():latestEmail: $latestEmail');
await removeDetailedEmail(accountId, userName, latestEmail.emailId);
}
await insertDetailedEmail(accountId, userName, detailedEmail.toHiveCache());
}
Future<bool> _handleDuplicateOpenedEmail(AccountId accountId, DetailedEmail detailedEmail) async {
final emailContentPath = await _getEmailContentPath(detailedEmail);
final detailedEmailCacheExists = await _getDetailedEmailCache(accountId);
if (emailContentPath != null && detailedEmailCacheExists) {
return true;
} else {
return false;
}
}
Future<String?> _getEmailContentPath(DetailedEmail detailedEmail) async {
final fileSaved = await _fileUtils.getFromFile(
nameFile: detailedEmail.emailId.asString,
folderPath: detailedEmail.folderPath,
extensionFile: ExtensionType.text.value
);
log('DetailedEmailCacheManager::_getDetailedEmailCache():_getEmailContentPath: $fileSaved');
return fileSaved;
}
Future<bool> _getDetailedEmailCache(AccountId accountId) async {
final detailedEmailCache = await _cacheClient.getItem(accountId.asString);
log('DetailedEmailCacheManager::_getDetailedEmailCache():_getDetailedEmailCache: $detailedEmailCache');
if (detailedEmailCache != null) {
return true;
} else {
return false;
}
}
}
@@ -0,0 +1,94 @@
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';
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/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 OpenedEmailCacheManager {
final OpenedEmailHiveCacheClient _cacheClient;
final FileUtils _fileUtils;
OpenedEmailCacheManager(this._cacheClient, this._fileUtils);
Future<void> insertDetailedEmail(
AccountId accountId,
UserName userName,
DetailedEmailHiveCache detailedEmailCache
) {
final keyCache = TupleKey(detailedEmailCache.emailId, accountId.asString, userName.value).encodeKey;
log('OpenedEmailCacheManager::insertDetailedEmail(): $keyCache');
return _cacheClient.insertItem(keyCache, detailedEmailCache);
}
Future<void> removeDetailedEmail(
AccountId accountId,
UserName userName,
String emailId
) {
final keyCache = TupleKey(emailId, accountId.asString, userName.value).encodeKey;
log('OpenedEmailCacheManager::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('OpenedEmailCacheManager::getAllDetailedEmails():SIZE: ${detailedEmailCacheList.length}');
return detailedEmailCacheList;
}
Future<void> storeOpenedEmail(
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);
}
await insertDetailedEmail(accountId, userName, detailedEmail.toHiveCache());
}
Future<bool> isOpenedDetailEmailCached(
AccountId accountId,
UserName userName,
DetailedEmail detailedEmail
) async {
final emailContentPathExists = await _isFileExisted(detailedEmail);
final detailedEmailCacheExists = await _isDetailEmailExistedInCache(accountId, userName, detailedEmail);
return emailContentPathExists == true && detailedEmailCacheExists;
}
Future<bool?> _isFileExisted(DetailedEmail detailedEmail) async {
final fileSaved = await _fileUtils.isFileExisted(
nameFile: detailedEmail.emailId.asString,
folderPath: detailedEmail.folderPath,
);
log('OpenedEmailCacheManager::_getDetailedEmailCache():_getEmailContentPath: $fileSaved');
return fileSaved;
}
Future<bool> _isDetailEmailExistedInCache(
AccountId accountId,
UserName userName,
DetailedEmail detailedEmail
) async {
final keyCache = TupleKey(detailedEmail.emailId.asString, accountId.asString, userName.value).encodeKey;
final detailedEmailCache = await _cacheClient.getItem(keyCache);
log('OpenedEmailCacheManager::_getDetailedEmailCache():_getDetailedEmailCache: $detailedEmailCache');
return detailedEmailCache != null;
}
}
@@ -3,5 +3,5 @@ import 'package:tmail_ui_user/features/offline_mode/worker/hive_worker_queue.dar
class OpenedEmailCacheWorkerQueue extends WorkerQueue {
@override
String get workerName => 'OpenedEmailCache';
String get workerName => 'OpenedEmailCacheQueue';
}