TF-3385 Get & set multiple changes in email cache

This commit is contained in:
DatDang
2025-01-03 15:08:54 +07:00
committed by Dat H. Pham
parent 1ce0600c43
commit 492f4f8350
2 changed files with 58 additions and 25 deletions
@@ -153,9 +153,12 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
List<EmailId> emailIds, List<EmailId> emailIds,
ReadActions readActions, ReadActions readActions,
) async { ) async {
final storedEmails = await Future.wait(emailIds.map( final cacheEmails = await _emailCacheManager.getMultipleStoredEmails(
(emailId) => getStoredEmail(session, accountId, emailId), accountId,
)); session.username,
emailIds,
);
final storedEmails = cacheEmails.map((emailCache) => emailCache.toEmail()).toList();
for (var email in storedEmails) { for (var email in storedEmails) {
if (readActions == ReadActions.markAsUnread) { if (readActions == ReadActions.markAsUnread) {
email.keywords?.remove(KeyWordIdentifier.emailSeen); email.keywords?.remove(KeyWordIdentifier.emailSeen);
@@ -163,9 +166,11 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
email.keywords?[KeyWordIdentifier.emailSeen] = true; email.keywords?[KeyWordIdentifier.emailSeen] = true;
} }
} }
await Future.wait(storedEmails.map( await _emailCacheManager.storeMultipleEmails(
(email) => storeEmail(session, accountId, email), accountId,
)); session.username,
storedEmails.map((email) => email.toEmailCache()).toList(),
);
return ( return (
emailIdsSuccess: emailIds, emailIdsSuccess: emailIds,
mapErrors: <Id, SetError>{} mapErrors: <Id, SetError>{}
@@ -182,9 +187,12 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
List<EmailId> emailIds, List<EmailId> emailIds,
MarkStarAction markStarAction, MarkStarAction markStarAction,
) async { ) async {
final storedEmails = await Future.wait(emailIds.map( final cacheEmails = await _emailCacheManager.getMultipleStoredEmails(
(emailId) => getStoredEmail(session, accountId, emailId), accountId,
)); session.username,
emailIds,
);
final storedEmails = cacheEmails.map((emailCache) => emailCache.toEmail()).toList();
for (var email in storedEmails) { for (var email in storedEmails) {
if (markStarAction == MarkStarAction.unMarkStar) { if (markStarAction == MarkStarAction.unMarkStar) {
email.keywords?.remove(KeyWordIdentifier.emailFlagged); email.keywords?.remove(KeyWordIdentifier.emailFlagged);
@@ -192,9 +200,11 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
email.keywords?[KeyWordIdentifier.emailFlagged] = true; email.keywords?[KeyWordIdentifier.emailFlagged] = true;
} }
} }
await Future.wait(storedEmails.map( await _emailCacheManager.storeMultipleEmails(
(email) => storeEmail(session, accountId, email), accountId,
)); session.username,
storedEmails.map((email) => email.toEmailCache()).toList(),
);
return ( return (
emailIdsSuccess: emailIds, emailIdsSuccess: emailIds,
mapErrors: <Id, SetError>{} mapErrors: <Id, SetError>{}
@@ -210,24 +220,27 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
AccountId accountId, AccountId accountId,
MoveToMailboxRequest moveRequest, MoveToMailboxRequest moveRequest,
) async { ) async {
final emailIds = moveRequest.currentMailboxes.entries.fold( final emailIds = moveRequest
<EmailId>{}, .currentMailboxes
(emailIds, entry) { .values
emailIds.addAll(entry.value); .expand((emails) => emails)
return emailIds; .toList();
}, final cacheEmails = await _emailCacheManager.getMultipleStoredEmails(
).toList(); accountId,
final storedEmails = await Future.wait(emailIds.map( session.username,
(emailId) => getStoredEmail(session, accountId, emailId), emailIds,
)); );
final storedEmails = cacheEmails.map((emailCache) => emailCache.toEmail()).toList();
for (int i = 0; i < storedEmails.length; i++) { for (int i = 0; i < storedEmails.length; i++) {
storedEmails[i] = storedEmails[i].updatedEmail( storedEmails[i] = storedEmails[i].updatedEmail(
newMailboxIds: {moveRequest.destinationMailboxId: true}, newMailboxIds: {moveRequest.destinationMailboxId: true},
); );
} }
await Future.wait(storedEmails.map( await _emailCacheManager.storeMultipleEmails(
(email) => storeEmail(session, accountId, email), accountId,
)); session.username,
storedEmails.map((email) => email.toEmailCache()).toList(),
);
return ( return (
emailIdsSuccess: emailIds, emailIdsSuccess: emailIds,
mapErrors: <Id, SetError>{} mapErrors: <Id, SetError>{}
@@ -95,6 +95,14 @@ class EmailCacheManager {
return _emailCacheClient.insertItem(keyCache, emailCache); return _emailCacheClient.insertItem(keyCache, emailCache);
} }
Future<void> storeMultipleEmails(AccountId accountId, UserName userName, List<EmailCache> emailsCache) {
return Future.wait(emailsCache.map((emailCache) => storeEmail(
accountId,
userName,
emailCache,
)));
}
Future<EmailCache> getStoredEmail(AccountId accountId, UserName userName, EmailId emailId) async { Future<EmailCache> getStoredEmail(AccountId accountId, UserName userName, EmailId emailId) async {
final keyCache = TupleKey(emailId.asString, accountId.asString, userName.value).encodeKey; final keyCache = TupleKey(emailId.asString, accountId.asString, userName.value).encodeKey;
final emailCache = await _emailCacheClient.getItem(keyCache, needToReopen: true); final emailCache = await _emailCacheClient.getItem(keyCache, needToReopen: true);
@@ -104,4 +112,16 @@ class EmailCacheManager {
throw NotFoundStoredEmailException(); throw NotFoundStoredEmailException();
} }
} }
Future<List<EmailCache>> getMultipleStoredEmails(
AccountId accountId,
UserName userName,
List<EmailId> emailIds,
) async {
final keys = emailIds
.map((emailId) => TupleKey(emailId.asString, accountId.asString, userName.value).encodeKey)
.toList();
final emails = await _emailCacheClient.getValuesByListKey(keys);
return emails;
}
} }