From 2b88f07f6d3bae6ecc79f7f981efc42d8cd7b6a8 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 14 May 2025 12:42:15 +0700 Subject: [PATCH] TF-3719 Delete email in cache when get `notFound` in `Email/get` Signed-off-by: dab246 --- .../thread/data/network/thread_api.dart | 20 +++++++++++--- .../repository/thread_repository_impl.dart | 27 ++++++++++++++++--- .../thread/domain/model/email_response.dart | 6 ++++- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/lib/features/thread/data/network/thread_api.dart b/lib/features/thread/data/network/thread_api.dart index 52358c5d1..4b1e5a95b 100644 --- a/lib/features/thread/data/network/thread_api.dart +++ b/lib/features/thread/data/network/thread_api.dart @@ -96,8 +96,14 @@ class ThreadAPI { queryEmailResponse: responseOfQueryEmailMethod, ); + final notFoundEmailIds = responseOfGetEmailMethod + ?.notFound + ?.toEmailIds() + .toList(); + log('ThreadAPI::getAllEmail:notFoundEmailIds = $notFoundEmailIds'); return EmailsResponse( emailList: emailList, + notFoundEmailIds: notFoundEmailIds, state: responseOfGetEmailMethod?.state, ); } @@ -274,10 +280,10 @@ class ThreadAPI { changesEmailInvocation.methodCallId, ChangesEmailResponse.deserialize); - List? destroyedEmailIds = resultChanges + List destroyedEmailIds = resultChanges ?.destroyed .toEmailIds() - .toList(); + .toList() ?? []; State? newStateChanges = resultChanges?.newState; bool hasMoreChanges = resultChanges?.hasMoreChanges ?? false; List? updatedEmail; @@ -291,6 +297,9 @@ class ThreadAPI { ); updatedEmail = emailResponseUpdated?.list; newStateEmail = emailResponseUpdated?.state; + final notFoundIdsUpdated = emailResponseUpdated?.notFound?.toEmailIds().toList() ?? []; + log('ThreadAPI::getChanges:notFoundIdsUpdated = $notFoundIdsUpdated'); + destroyedEmailIds.addAll(notFoundIdsUpdated); } if (getEmailCreatedInvocation != null) { @@ -300,8 +309,13 @@ class ThreadAPI { ); createdEmail = emailResponseCreated?.list; newStateEmail = emailResponseCreated?.state; + final notFoundIdsCreated = emailResponseCreated?.notFound?.toEmailIds().toList() ?? []; + log('ThreadAPI::getChanges:notFoundIdsCreated = $notFoundIdsCreated'); + destroyedEmailIds.addAll(notFoundIdsCreated); } - + log('ThreadAPI::getChanges:newStateChanges = $newStateChanges | newStateEmail = $newStateEmail | hasMoreChanges = $hasMoreChanges'); + log('ThreadAPI::getChanges:updatedEmailSize = ${updatedEmail?.length} | createdEmailSize = ${createdEmail?.length}'); + log('ThreadAPI::getChanges:destroyedEmailIds = $destroyedEmailIds'); return EmailChangeResponse( updated: updatedEmail, created: createdEmail, diff --git a/lib/features/thread/data/repository/thread_repository_impl.dart b/lib/features/thread/data/repository/thread_repository_impl.dart index f18768e90..7bb24c98b 100644 --- a/lib/features/thread/data/repository/thread_repository_impl.dart +++ b/lib/features/thread/data/repository/thread_repository_impl.dart @@ -93,7 +93,12 @@ class ThreadRepositoryImpl extends ThreadRepository { } if (networkEmailResponse != null) { - await _updateEmailCache(accountId, session.username, newCreated: networkEmailResponse.emailList); + await _updateEmailCache( + accountId, + session.username, + newCreated: networkEmailResponse.emailList, + newDestroyed: networkEmailResponse.notFoundEmailIds, + ); } if (localEmailResponse.hasState()) { @@ -156,7 +161,12 @@ class ThreadRepositoryImpl extends ThreadRepository { filter: filter ?? EmailFilterCondition(inMailbox: mailboxId), properties: propertiesCreated, ); - await _updateEmailCache(accountId, session.username, newCreated: networkEmailResponse.emailList); + await _updateEmailCache( + accountId, + session.username, + newCreated: networkEmailResponse.emailList, + newDestroyed: networkEmailResponse.notFoundEmailIds, + ); return networkEmailResponse; } @@ -268,7 +278,12 @@ class ThreadRepositoryImpl extends ThreadRepository { @override Stream loadMoreEmails(GetEmailRequest emailRequest) async* { final response = await _getAllEmailsWithoutLastEmailId(emailRequest); - await _updateEmailCache(emailRequest.accountId, emailRequest.session.username, newCreated: response.emailList); + await _updateEmailCache( + emailRequest.accountId, + emailRequest.session.username, + newCreated: response.emailList, + newDestroyed: response.notFoundEmailIds, + ); yield response; } @@ -287,7 +302,11 @@ class ThreadRepositoryImpl extends ThreadRepository { if (emailRequest.lastEmailId != null && listEmails?.isNotEmpty == true) { listEmails?.removeWhere((email) => email.id == emailRequest.lastEmailId); } - return EmailsResponse(emailList: listEmails, state: response.state); + return EmailsResponse( + emailList: listEmails, + state: response.state, + notFoundEmailIds: response.notFoundEmailIds, + ); }); return emailResponse; diff --git a/lib/features/thread/domain/model/email_response.dart b/lib/features/thread/domain/model/email_response.dart index dd72318e8..690c602d3 100644 --- a/lib/features/thread/domain/model/email_response.dart +++ b/lib/features/thread/domain/model/email_response.dart @@ -5,10 +5,12 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; class EmailsResponse with EquatableMixin { final List? emailList; + final List? notFoundEmailIds; final State? state; const EmailsResponse({ this.emailList, + this.notFoundEmailIds, this.state }); @@ -16,6 +18,8 @@ class EmailsResponse with EquatableMixin { bool hasState() => state != null; + bool get existNotFoundEmails => notFoundEmailIds?.isNotEmpty == true; + @override - List get props => [emailList, state]; + List get props => [emailList, notFoundEmailIds, state]; } \ No newline at end of file