From 492f4f83500ca6f190244965b7fa7052abc2a528 Mon Sep 17 00:00:00 2001 From: DatDang Date: Fri, 3 Jan 2025 15:08:54 +0700 Subject: [PATCH] TF-3385 Get & set multiple changes in email cache --- .../email_hive_cache_datasource_impl.dart | 63 +++++++++++-------- .../data/local/email_cache_manager.dart | 20 ++++++ 2 files changed, 58 insertions(+), 25 deletions(-) diff --git a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart index b2caa73b3..c607b59bb 100644 --- a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart @@ -153,9 +153,12 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { List emailIds, ReadActions readActions, ) async { - final storedEmails = await Future.wait(emailIds.map( - (emailId) => getStoredEmail(session, accountId, emailId), - )); + final cacheEmails = await _emailCacheManager.getMultipleStoredEmails( + accountId, + session.username, + emailIds, + ); + final storedEmails = cacheEmails.map((emailCache) => emailCache.toEmail()).toList(); for (var email in storedEmails) { if (readActions == ReadActions.markAsUnread) { email.keywords?.remove(KeyWordIdentifier.emailSeen); @@ -163,9 +166,11 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { email.keywords?[KeyWordIdentifier.emailSeen] = true; } } - await Future.wait(storedEmails.map( - (email) => storeEmail(session, accountId, email), - )); + await _emailCacheManager.storeMultipleEmails( + accountId, + session.username, + storedEmails.map((email) => email.toEmailCache()).toList(), + ); return ( emailIdsSuccess: emailIds, mapErrors: {} @@ -182,9 +187,12 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { List emailIds, MarkStarAction markStarAction, ) async { - final storedEmails = await Future.wait(emailIds.map( - (emailId) => getStoredEmail(session, accountId, emailId), - )); + final cacheEmails = await _emailCacheManager.getMultipleStoredEmails( + accountId, + session.username, + emailIds, + ); + final storedEmails = cacheEmails.map((emailCache) => emailCache.toEmail()).toList(); for (var email in storedEmails) { if (markStarAction == MarkStarAction.unMarkStar) { email.keywords?.remove(KeyWordIdentifier.emailFlagged); @@ -192,9 +200,11 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { email.keywords?[KeyWordIdentifier.emailFlagged] = true; } } - await Future.wait(storedEmails.map( - (email) => storeEmail(session, accountId, email), - )); + await _emailCacheManager.storeMultipleEmails( + accountId, + session.username, + storedEmails.map((email) => email.toEmailCache()).toList(), + ); return ( emailIdsSuccess: emailIds, mapErrors: {} @@ -210,24 +220,27 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { AccountId accountId, MoveToMailboxRequest moveRequest, ) async { - final emailIds = moveRequest.currentMailboxes.entries.fold( - {}, - (emailIds, entry) { - emailIds.addAll(entry.value); - return emailIds; - }, - ).toList(); - final storedEmails = await Future.wait(emailIds.map( - (emailId) => getStoredEmail(session, accountId, emailId), - )); + final emailIds = moveRequest + .currentMailboxes + .values + .expand((emails) => emails) + .toList(); + final cacheEmails = await _emailCacheManager.getMultipleStoredEmails( + accountId, + session.username, + emailIds, + ); + final storedEmails = cacheEmails.map((emailCache) => emailCache.toEmail()).toList(); for (int i = 0; i < storedEmails.length; i++) { storedEmails[i] = storedEmails[i].updatedEmail( newMailboxIds: {moveRequest.destinationMailboxId: true}, ); } - await Future.wait(storedEmails.map( - (email) => storeEmail(session, accountId, email), - )); + await _emailCacheManager.storeMultipleEmails( + accountId, + session.username, + storedEmails.map((email) => email.toEmailCache()).toList(), + ); return ( emailIdsSuccess: emailIds, mapErrors: {} diff --git a/lib/features/thread/data/local/email_cache_manager.dart b/lib/features/thread/data/local/email_cache_manager.dart index 9fa8d0383..d7ea24c97 100644 --- a/lib/features/thread/data/local/email_cache_manager.dart +++ b/lib/features/thread/data/local/email_cache_manager.dart @@ -95,6 +95,14 @@ class EmailCacheManager { return _emailCacheClient.insertItem(keyCache, emailCache); } + Future storeMultipleEmails(AccountId accountId, UserName userName, List emailsCache) { + return Future.wait(emailsCache.map((emailCache) => storeEmail( + accountId, + userName, + emailCache, + ))); + } + Future getStoredEmail(AccountId accountId, UserName userName, EmailId emailId) async { final keyCache = TupleKey(emailId.asString, accountId.asString, userName.value).encodeKey; final emailCache = await _emailCacheClient.getItem(keyCache, needToReopen: true); @@ -104,4 +112,16 @@ class EmailCacheManager { throw NotFoundStoredEmailException(); } } + + Future> getMultipleStoredEmails( + AccountId accountId, + UserName userName, + List emailIds, + ) async { + final keys = emailIds + .map((emailId) => TupleKey(emailId.asString, accountId.asString, userName.value).encodeKey) + .toList(); + final emails = await _emailCacheClient.getValuesByListKey(keys); + return emails; + } } \ No newline at end of file