From b3c85a281027eb43919c5b60f2dd3ef057460354 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 5 Jun 2023 09:11:57 +0700 Subject: [PATCH] TF-1866 Add abstraction method for delete sending email (cherry picked from commit c4a9fce0c08ce0c6976bc367ade567430fbfcff3) --- .../sending_queue_repository_impl.dart | 5 +++ .../repository/sending_queue_repository.dart | 2 ++ .../delete_multiple_sending_email_state.dart | 25 +++++++++++++ ...ete_multiple_sending_email_interactor.dart | 36 +++++++++++++++++++ ...elete_single_sending_email_interactor.dart | 22 ++++++++++++ 5 files changed, 90 insertions(+) create mode 100644 lib/features/sending_queue/domain/state/delete_multiple_sending_email_state.dart create mode 100644 lib/features/sending_queue/domain/usecases/delete_multiple_sending_email_interactor.dart create mode 100644 lib/features/sending_queue/domain/usecases/delete_single_sending_email_interactor.dart diff --git a/lib/features/sending_queue/data/repository/sending_queue_repository_impl.dart b/lib/features/sending_queue/data/repository/sending_queue_repository_impl.dart index 97c1eb8a3..391118d78 100644 --- a/lib/features/sending_queue/data/repository/sending_queue_repository_impl.dart +++ b/lib/features/sending_queue/data/repository/sending_queue_repository_impl.dart @@ -14,4 +14,9 @@ class SendingQueueRepositoryImpl extends SendingQueueRepository { Future> getAllSendingEmails(AccountId accountId, UserName userName, {bool needToReopen = false}) { return _emailHiveCacheDataSourceImpl.getAllSendingEmails(accountId, userName, needToReopen: needToReopen); } + + @override + Future deleteSendingEmail(AccountId accountId, UserName userName, String sendingId) { + return _emailHiveCacheDataSourceImpl.deleteSendingEmail(accountId, userName, sendingId); + } } \ No newline at end of file diff --git a/lib/features/sending_queue/domain/repository/sending_queue_repository.dart b/lib/features/sending_queue/domain/repository/sending_queue_repository.dart index c9da2fef6..5bdf69efb 100644 --- a/lib/features/sending_queue/domain/repository/sending_queue_repository.dart +++ b/lib/features/sending_queue/domain/repository/sending_queue_repository.dart @@ -5,4 +5,6 @@ import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart' abstract class SendingQueueRepository { Future> getAllSendingEmails(AccountId accountId, UserName userName, {bool needToReopen = false}); + + Future deleteSendingEmail(AccountId accountId, UserName userName, String sendingId); } \ No newline at end of file diff --git a/lib/features/sending_queue/domain/state/delete_multiple_sending_email_state.dart b/lib/features/sending_queue/domain/state/delete_multiple_sending_email_state.dart new file mode 100644 index 000000000..3b052dd43 --- /dev/null +++ b/lib/features/sending_queue/domain/state/delete_multiple_sending_email_state.dart @@ -0,0 +1,25 @@ + +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class DeleteMultipleSendingEmailLoading extends UIState {} + +class DeleteMultipleSendingEmailAllSuccess extends UIState {} + +class DeleteMultipleSendingEmailHasSomeSuccess extends UIState {} + +class DeleteMultipleSendingEmailAllFailure extends FeatureFailure { + + DeleteMultipleSendingEmailAllFailure(dynamic exception) : super(exception: exception); + + @override + List get props => [exception]; +} + +class DeleteMultipleSendingEmailFailure extends FeatureFailure { + + DeleteMultipleSendingEmailFailure(dynamic exception) : super(exception: exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/sending_queue/domain/usecases/delete_multiple_sending_email_interactor.dart b/lib/features/sending_queue/domain/usecases/delete_multiple_sending_email_interactor.dart new file mode 100644 index 000000000..c0964a572 --- /dev/null +++ b/lib/features/sending_queue/domain/usecases/delete_multiple_sending_email_interactor.dart @@ -0,0 +1,36 @@ +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/user_name.dart'; +import 'package:tmail_ui_user/features/sending_queue/domain/state/delete_multiple_sending_email_state.dart'; +import 'package:tmail_ui_user/features/sending_queue/domain/usecases/delete_single_sending_email_interactor.dart'; + +class DeleteMultipleSendingEmailInteractor { + final DeleteSingleSendingEmailInteractor _deleteSingleSendingEmailInteractor; + + DeleteMultipleSendingEmailInteractor(this._deleteSingleSendingEmailInteractor); + + Stream> execute(AccountId accountId, UserName userName, List sendingIds) async* { + try { + yield Right(DeleteMultipleSendingEmailLoading()); + final listResult = await Future.wait( + sendingIds.map((sendingId) => _deleteSingleSendingEmailInteractor.execute(accountId, userName, sendingId)), + eagerError: true + ); + + bool isAllSuccess = listResult.every((either) => either.isRight()); + bool isAllFailure = listResult.every((either) => either.isLeft()); + + if (isAllSuccess) { + yield Right(DeleteMultipleSendingEmailAllSuccess()); + } else if (isAllFailure) { + yield Left(DeleteMultipleSendingEmailAllFailure(null)); + } else { + yield Right(DeleteMultipleSendingEmailHasSomeSuccess()); + } + } catch (e) { + yield Left(DeleteMultipleSendingEmailFailure(e)); + } + } +} \ No newline at end of file diff --git a/lib/features/sending_queue/domain/usecases/delete_single_sending_email_interactor.dart b/lib/features/sending_queue/domain/usecases/delete_single_sending_email_interactor.dart new file mode 100644 index 000000000..b32036565 --- /dev/null +++ b/lib/features/sending_queue/domain/usecases/delete_single_sending_email_interactor.dart @@ -0,0 +1,22 @@ +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/user_name.dart'; +import 'package:tmail_ui_user/features/email/domain/state/delete_sending_email_state.dart'; +import 'package:tmail_ui_user/features/sending_queue/domain/repository/sending_queue_repository.dart'; + +class DeleteSingleSendingEmailInteractor { + final SendingQueueRepository _sendingQueueRepository; + + DeleteSingleSendingEmailInteractor(this._sendingQueueRepository); + + Future> execute(AccountId accountId, UserName userName, String sendingId) async { + try { + await _sendingQueueRepository.deleteSendingEmail(accountId, userName, sendingId); + return Right(DeleteSendingEmailSuccess()); + } catch (e) { + return Left(DeleteSendingEmailFailure(e)); + } + } +} \ No newline at end of file