From 6a27190f01d5b7c01c0e5f6498988aea94a05014 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 10 Feb 2023 14:37:25 +0700 Subject: [PATCH] TF-1432 [Domain] Implement subscribe multiple mailbox --- .../extensions/list_mailbox_id_extension.dart | 18 +++++ .../model/subscribe_mailbox_request.dart | 18 +++-- .../subscribe_multiple_mailbox_request.dart | 24 ++++++ .../domain/model/subscribe_request.dart | 14 ++++ .../domain/repository/mailbox_repository.dart | 3 + .../domain/state/subscribe_mailbox_state.dart | 11 ++- .../subscribe_multiple_mailbox_state.dart | 75 +++++++++++++++++++ .../subscribe_mailbox_interactor.dart | 2 +- ...subscribe_multiple_mailbox_interactor.dart | 46 ++++++++++++ model/lib/mailbox/presentation_mailbox.dart | 14 +++- 10 files changed, 209 insertions(+), 16 deletions(-) create mode 100644 lib/features/mailbox/domain/extensions/list_mailbox_id_extension.dart create mode 100644 lib/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart create mode 100644 lib/features/mailbox/domain/model/subscribe_request.dart create mode 100644 lib/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart create mode 100644 lib/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart diff --git a/lib/features/mailbox/domain/extensions/list_mailbox_id_extension.dart b/lib/features/mailbox/domain/extensions/list_mailbox_id_extension.dart new file mode 100644 index 000000000..0a9631f63 --- /dev/null +++ b/lib/features/mailbox/domain/extensions/list_mailbox_id_extension.dart @@ -0,0 +1,18 @@ +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/patch_object.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:model/mailbox/mailbox_property.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart'; + +extension ListMailboxIdExtension on List { + + Map generateMapUpdateObjectSubscribeMailbox(MailboxSubscribeState subscribeState) { + final Map maps = { + for (var mailboxId in this) + mailboxId.id: PatchObject({ + MailboxProperty.isSubscribed: subscribeState == MailboxSubscribeState.enabled + }) + }; + return maps; + } +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/model/subscribe_mailbox_request.dart b/lib/features/mailbox/domain/model/subscribe_mailbox_request.dart index 73c8abbfb..5cfecff49 100644 --- a/lib/features/mailbox/domain/model/subscribe_mailbox_request.dart +++ b/lib/features/mailbox/domain/model/subscribe_mailbox_request.dart @@ -1,19 +1,21 @@ -import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.dart'; -class SubscribeMailboxRequest with EquatableMixin { +class SubscribeMailboxRequest extends SubscribeRequest { final MailboxId mailboxId; - final MailboxSubscribeState newState; - final MailboxSubscribeAction mailboxSubscribeStateAction; SubscribeMailboxRequest( - this.mailboxId, - this.newState, - this.mailboxSubscribeStateAction); + this.mailboxId, + MailboxSubscribeState subscribeState, + MailboxSubscribeAction subscribeAction, + ) : super(subscribeState, subscribeAction); @override - List get props => [mailboxId, newState, mailboxSubscribeStateAction]; + List get props => [ + mailboxId, + super.props + ]; } diff --git a/lib/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart b/lib/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart new file mode 100644 index 000000000..e776c6669 --- /dev/null +++ b/lib/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart @@ -0,0 +1,24 @@ +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.dart'; + +class SubscribeMultipleMailboxRequest extends SubscribeRequest { + + final MailboxId parentMailboxId; + final List mailboxIdsSubscribe; + + SubscribeMultipleMailboxRequest( + this.parentMailboxId, + this.mailboxIdsSubscribe, + MailboxSubscribeState subscribeState, + MailboxSubscribeAction subscribeAction, + ) : super(subscribeState, subscribeAction); + + @override + List get props => [ + parentMailboxId, + mailboxIdsSubscribe, + super.props + ]; +} diff --git a/lib/features/mailbox/domain/model/subscribe_request.dart b/lib/features/mailbox/domain/model/subscribe_request.dart new file mode 100644 index 000000000..4b680c01c --- /dev/null +++ b/lib/features/mailbox/domain/model/subscribe_request.dart @@ -0,0 +1,14 @@ +import 'package:equatable/equatable.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart'; + +abstract class SubscribeRequest with EquatableMixin { + + final MailboxSubscribeState subscribeState; + final MailboxSubscribeAction subscribeAction; + + SubscribeRequest(this.subscribeState, this.subscribeAction); + + @override + List get props => [subscribeState, subscribeAction]; +} diff --git a/lib/features/mailbox/domain/repository/mailbox_repository.dart b/lib/features/mailbox/domain/repository/mailbox_repository.dart index 63ba06851..71aa228af 100644 --- a/lib/features/mailbox/domain/repository/mailbox_repository.dart +++ b/lib/features/mailbox/domain/repository/mailbox_repository.dart @@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dar import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart'; abstract class MailboxRepository { Stream getAllMailbox(Session session, AccountId accountId, {Properties? properties}); @@ -39,4 +40,6 @@ abstract class MailboxRepository { Future getMailboxState(); Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request); + + Future> subscribeMultipleMailbox(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest); } \ No newline at end of file diff --git a/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart b/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart index 93fb77142..1901736ad 100644 --- a/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart +++ b/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart @@ -8,11 +8,11 @@ class LoadingSubscribeMailbox extends UIState {} class SubscribeMailboxSuccess extends UIActionState { final MailboxId mailboxId; - final MailboxSubscribeAction mailboxSubscribeStateAction; + final MailboxSubscribeAction subscribeAction; SubscribeMailboxSuccess( this.mailboxId, - this.mailboxSubscribeStateAction, + this.subscribeAction, { jmap.State? currentEmailState, jmap.State? currentMailboxState, @@ -21,10 +21,9 @@ class SubscribeMailboxSuccess extends UIActionState { @override List get props => [ - mailboxId, - currentEmailState, - currentMailboxState, - mailboxSubscribeStateAction + mailboxId, + subscribeAction, + super.props ]; } diff --git a/lib/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart b/lib/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart new file mode 100644 index 000000000..e8af12fbc --- /dev/null +++ b/lib/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart @@ -0,0 +1,75 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart'; + +class LoadingSubscribeMultipleMailbox extends UIState {} + +class SubscribeMultipleMailboxAllSuccess extends UIActionState { + + final MailboxId parentMailboxId; + final List mailboxIdsSubscribe; + final MailboxSubscribeAction subscribeAction; + + SubscribeMultipleMailboxAllSuccess( + this.parentMailboxId, + this.mailboxIdsSubscribe, + this.subscribeAction, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); + + @override + List get props => [ + parentMailboxId, + mailboxIdsSubscribe, + subscribeAction, + super.props + ]; +} + +class SubscribeMultipleMailboxHasSomeSuccess extends UIActionState { + + final MailboxId parentMailboxId; + final List mailboxIdsSubscribe; + final MailboxSubscribeAction subscribeAction; + + SubscribeMultipleMailboxHasSomeSuccess( + this.parentMailboxId, + this.mailboxIdsSubscribe, + this.subscribeAction, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); + + @override + List get props => [ + parentMailboxId, + mailboxIdsSubscribe, + subscribeAction, + super.props + ]; +} + +class SubscribeMultipleMailboxAllFailure extends FeatureFailure { + + SubscribeMultipleMailboxAllFailure(); + + @override + List get props => []; +} + +class SubscribeMultipleMailboxFailure extends FeatureFailure { + final dynamic exception; + + SubscribeMultipleMailboxFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart index 5b4461314..ee63f242a 100644 --- a/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart +++ b/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart @@ -23,7 +23,7 @@ class SubscribeMailboxInteractor { yield Right(SubscribeMailboxSuccess( request.mailboxId, currentMailboxState: currentMailboxState, - request.mailboxSubscribeStateAction)); + request.subscribeAction)); } else { yield Left(SubscribeMailboxFailure(null)); } diff --git a/lib/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart new file mode 100644 index 000000000..019d526df --- /dev/null +++ b/lib/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart @@ -0,0 +1,46 @@ +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:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart'; + +class SubscribeMultipleMailboxInteractor { + final MailboxRepository _mailboxRepository; + + SubscribeMultipleMailboxInteractor(this._mailboxRepository); + + Stream> execute(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest) async* { + try { + yield Right(LoadingSubscribeMultipleMailbox()); + + final currentMailboxState = await _mailboxRepository.getMailboxState(); + final listResult = await _mailboxRepository.subscribeMultipleMailbox(accountId, subscribeRequest); + + final matchedSize = listResult.length == subscribeRequest.mailboxIdsSubscribe.length; + final allMatchedMailboxIdSubscribe = subscribeRequest.mailboxIdsSubscribe + .every((mailboxId) => listResult.contains(mailboxId)); + + if (allMatchedMailboxIdSubscribe && matchedSize) { + yield Right(SubscribeMultipleMailboxAllSuccess( + subscribeRequest.parentMailboxId, + listResult, + subscribeRequest.subscribeAction, + currentMailboxState: currentMailboxState + )); + } else if (listResult.isEmpty) { + yield Left(SubscribeMultipleMailboxAllFailure()); + } else { + yield Right(SubscribeMultipleMailboxHasSomeSuccess( + subscribeRequest.parentMailboxId, + listResult, + subscribeRequest.subscribeAction, + currentMailboxState: currentMailboxState + )); + } + } catch (e) { + yield Left(SubscribeMultipleMailboxFailure(e)); + } + } +} \ No newline at end of file diff --git a/model/lib/mailbox/presentation_mailbox.dart b/model/lib/mailbox/presentation_mailbox.dart index 14d98b4ce..2c4da5dd2 100644 --- a/model/lib/mailbox/presentation_mailbox.dart +++ b/model/lib/mailbox/presentation_mailbox.dart @@ -101,7 +101,19 @@ class PresentationMailbox with EquatableMixin { (namespace?.value.indexOf('[') ?? 0) + 1, namespace?.value.indexOf(']')); - bool get isShowDisableMailbox => isTeamMailboxes || hasRole() || !hasParentId(); + bool get supportedSubscribe => isSubscribed?.value == true; + + bool get isSupportedDisableMailbox { + if (!supportedSubscribe) { + return false; + } + if (isPersonal) { + return true; + } else { + return isTeamMailboxes; + } + } + @override List get props => [