From d6a5c882815bf5dce1d0fd3ca423fde95b94e6aa Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 10 May 2023 10:28:19 +0700 Subject: [PATCH] TF-1810 Create DetailedEmailCacheManager to manage store/get/delete cache (cherry picked from commit b2678ba89f5f2842726464f475343b279db4251f) --- lib/features/caching/utils/cache_utils.dart | 14 +---- .../caching/utils/caching_constants.dart | 2 + ...t_detailed_email_hive_cache_extension.dart | 12 ++++ .../manager/detailed_email_cache_manager.dart | 60 +++++++++++++++++++ 4 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 lib/features/offline_mode/extensions/list_detailed_email_hive_cache_extension.dart create mode 100644 lib/features/offline_mode/manager/detailed_email_cache_manager.dart diff --git a/lib/features/caching/utils/cache_utils.dart b/lib/features/caching/utils/cache_utils.dart index b62fb2f5b..b63140aeb 100644 --- a/lib/features/caching/utils/cache_utils.dart +++ b/lib/features/caching/utils/cache_utils.dart @@ -1,20 +1,10 @@ import 'dart:convert'; -import 'package:core/utils/app_logger.dart'; - class CacheUtils { - static String encodeKey(String key) { - final keyEncoded = base64.encode(utf8.encode(key)); - log('CacheUtils::encodeKey():keyHashed: $keyEncoded'); - return keyEncoded; - } + static String encodeKey(String key) => base64.encode(utf8.encode(key)); - static String decodeKey(String keyEncoded) { - final keyDecoded = utf8.decode(base64.decode(keyEncoded)); - log('CacheUtils::decodeKey():keyDecoded: $keyDecoded'); - return keyDecoded; - } + static String decodeKey(String keyEncoded) => utf8.decode(base64.decode(keyEncoded)); } class TupleKey { diff --git a/lib/features/caching/utils/caching_constants.dart b/lib/features/caching/utils/caching_constants.dart index 18b0044f1..fd7987ffe 100644 --- a/lib/features/caching/utils/caching_constants.dart +++ b/lib/features/caching/utils/caching_constants.dart @@ -20,4 +20,6 @@ class CachingConstants { static const String fcmCacheBoxName = 'fcm_cache_box'; static const String detailedEmailCacheBoxName = 'detailed_email_cache_box'; + + static const int maxNumberRecentEmails = 10; } \ No newline at end of file diff --git a/lib/features/offline_mode/extensions/list_detailed_email_hive_cache_extension.dart b/lib/features/offline_mode/extensions/list_detailed_email_hive_cache_extension.dart new file mode 100644 index 000000000..d2b823a7b --- /dev/null +++ b/lib/features/offline_mode/extensions/list_detailed_email_hive_cache_extension.dart @@ -0,0 +1,12 @@ + +import 'package:jmap_dart_client/jmap/core/extensions/date_time_extension.dart'; +import 'package:tmail_ui_user/features/offline_mode/model/detailed_email_hive_cache.dart'; + +extension ListDetailedEmailHiveCacheExtension on List { + + void sortByLatestTime() { + sort((detailedEmail1, detailedEmail2) { + return detailedEmail1.timeSaved.compareToSort(detailedEmail2.timeSaved, false); + }); + } +} \ No newline at end of file diff --git a/lib/features/offline_mode/manager/detailed_email_cache_manager.dart b/lib/features/offline_mode/manager/detailed_email_cache_manager.dart new file mode 100644 index 000000000..2e5ddc7c0 --- /dev/null +++ b/lib/features/offline_mode/manager/detailed_email_cache_manager.dart @@ -0,0 +1,60 @@ + +import 'package:core/utils/app_logger.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: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/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; + + DetailedEmailCacheManager(this._cacheClient); + + Future handleStoreDetailedEmailToCache( + AccountId accountId, + UserName userName, + DetailedEmailHiveCache detailedEmailCache + ) async { + final listDetailedEmails = await getAllDetailedEmails(accountId, userName); + + if (listDetailedEmails.length >= CachingConstants.maxNumberRecentEmails) { + final latestEmail = listDetailedEmails.last; + log('DetailedEmailCacheManager::handleStoreDetailedEmailToCache():latestEmail: $latestEmail'); + await removeDetailedEmail(accountId, userName, latestEmail.emailId); + } + + return insertDetailedEmail(accountId, userName, detailedEmailCache); + } + + Future insertDetailedEmail( + AccountId accountId, + UserName userName, + DetailedEmailHiveCache detailedEmailCache + ) { + final keyCache = TupleKey(detailedEmailCache.emailId, accountId.asString, userName.value).encodeKey; + log('DetailedEmailCacheManager::storeDetailedEmail(): $keyCache'); + return _cacheClient.insertItem(keyCache, detailedEmailCache); + } + + Future removeDetailedEmail( + AccountId accountId, + UserName userName, + String emailId + ) { + final keyCache = TupleKey(emailId, accountId.asString, userName.value).encodeKey; + log('DetailedEmailCacheManager::removeDetailedEmail(): $keyCache'); + return _cacheClient.deleteItem(keyCache); + } + + Future> 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; + } +} \ No newline at end of file