From 89d7f605d214eebf4b2ad8667216036a720b2480 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 7 Apr 2023 18:28:09 +0700 Subject: [PATCH] TF-1749 Handle delete old email after update draft email (cherry picked from commit 1a1331a723e191e3cae8db138f2d0fec71b4c87a) --- .../update_email_drafts_interactor.dart | 25 ++++++++++++------- .../data/datasource/email_datasource.dart | 12 ++++++--- .../email_datasource_impl.dart | 4 +-- .../email/data/network/email_api.dart | 9 +++---- .../repository/email_repository_impl.dart | 4 +-- .../domain/exceptions/email_exceptions.dart | 2 ++ .../domain/repository/email_repository.dart | 13 +++++++--- 7 files changed, 44 insertions(+), 25 deletions(-) create mode 100644 lib/features/email/domain/exceptions/email_exceptions.dart diff --git a/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart b/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart index 1045bed94..adf9c1781 100644 --- a/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart +++ b/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart @@ -1,9 +1,11 @@ -import 'package:core/core.dart'; +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; +import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; @@ -25,14 +27,19 @@ class UpdateEmailDraftsInteractor { final currentMailboxState = listState.first; final currentEmailState = listState.last; - final newEmailDrafts = await _emailRepository.updateEmailDrafts(session, accountId, newEmail, oldEmailId); - yield Right( - UpdateEmailDraftsSuccess( - newEmailDrafts, - currentEmailState: currentEmailState, - currentMailboxState: currentMailboxState - ) - ); + final newEmailDrafts = await _emailRepository.updateEmailDrafts(session, accountId, newEmail); + final emailDeleted = await _emailRepository.deleteEmailPermanently(session, accountId, oldEmailId); + if (emailDeleted) { + yield Right( + UpdateEmailDraftsSuccess( + newEmailDrafts, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState + ) + ); + } else { + yield Left(UpdateEmailDraftsFailure(CannotDeleteOldEmailException())); + } } catch (e) { yield Left(UpdateEmailDraftsFailure(e)); } diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 029a8568a..c6c497856 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -1,13 +1,19 @@ import 'dart:async'; import 'dart:typed_data'; -import 'package:core/core.dart'; +import 'package:core/data/network/download/downloaded_response.dart'; +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; -import 'package:model/model.dart'; +import 'package:model/account/account_request.dart'; +import 'package:model/download/download_task_id.dart'; +import 'package:model/email/attachment.dart'; +import 'package:model/email/mark_star_action.dart'; +import 'package:model/email/read_actions.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; @@ -61,7 +67,7 @@ abstract class EmailDataSource { Future removeEmailDrafts(Session session, AccountId accountId, EmailId emailId); - Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId); + Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail); Future> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List emailIds); diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart index d1abf6f5e..ced1083cb 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -109,9 +109,9 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId) { + Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail) { return Future.sync(() async { - return await emailAPI.updateEmailDrafts(session, accountId, newEmail, oldEmailId); + return await emailAPI.updateEmailDrafts(session, accountId, newEmail); }).catchError(_exceptionThrower.throwException); } diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index baaabdd4d..8275391f9 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -528,13 +528,11 @@ class EmailAPI with HandleSetErrorMixin { Future updateEmailDrafts( Session session, AccountId accountId, - Email newEmail, - EmailId oldEmailId + Email newEmail ) async { final idCreateMethod = Id(_uuid.v1()); final setEmailMethod = SetEmailMethod(accountId) - ..addCreate(idCreateMethod, newEmail) - ..addDestroy({oldEmailId.id}); + ..addCreate(idCreateMethod, newEmail); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); @@ -554,11 +552,10 @@ class EmailAPI with HandleSetErrorMixin { ); final emailUpdated = setEmailResponse?.created?[idCreateMethod]; - final isEmailDestroyedSuccess = setEmailResponse?.destroyed?.contains(oldEmailId.id) ?? false; final listEntriesErrors = _handleSetEmailResponse(response: setEmailResponse); final mapErrors = Map.fromEntries(listEntriesErrors); - if (emailUpdated != null && isEmailDestroyedSuccess && mapErrors.isEmpty) { + if (emailUpdated != null && mapErrors.isEmpty) { return emailUpdated; } else { throw SetEmailMethodException(mapErrors); diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 0f966b908..4d7196ace 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -131,8 +131,8 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId) { - return emailDataSource.updateEmailDrafts(session, accountId, newEmail, oldEmailId); + Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail) { + return emailDataSource.updateEmailDrafts(session, accountId, newEmail); } @override diff --git a/lib/features/email/domain/exceptions/email_exceptions.dart b/lib/features/email/domain/exceptions/email_exceptions.dart new file mode 100644 index 000000000..092e886ab --- /dev/null +++ b/lib/features/email/domain/exceptions/email_exceptions.dart @@ -0,0 +1,2 @@ + +class CannotDeleteOldEmailException implements Exception {} \ No newline at end of file diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 42109ec43..301476959 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -1,14 +1,21 @@ import 'dart:async'; import 'dart:typed_data'; -import 'package:core/core.dart'; +import 'package:core/data/network/download/downloaded_response.dart'; +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; -import 'package:model/model.dart'; +import 'package:model/account/account_request.dart'; +import 'package:model/download/download_task_id.dart'; +import 'package:model/email/attachment.dart'; +import 'package:model/email/email_content.dart'; +import 'package:model/email/mark_star_action.dart'; +import 'package:model/email/read_actions.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; @@ -72,7 +79,7 @@ abstract class EmailRepository { Future removeEmailDrafts(Session session, AccountId accountId, EmailId emailId); - Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail, EmailId oldEmailId); + Future updateEmailDrafts(Session session, AccountId accountId, Email newEmail); Future> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List emailIds);