From 2f3b1b6a87fe8df9c555c02974f414fadcf1a2cb Mon Sep 17 00:00:00 2001 From: HuyNguyen Date: Mon, 6 Feb 2023 15:23:46 +0700 Subject: [PATCH] TF-1311: set subscribeMailbox in UseCase and implement in Repository --- .../data/datasource/mailbox_datasource.dart | 3 ++ .../mailbox_cache_datasource_impl.dart | 6 ++++ .../mailbox_datasource_impl.dart | 10 +++++++ .../mailbox/data/network/mailbox_api.dart | 30 +++++++++++++++++++ .../repository/mailbox_repository_impl.dart | 6 ++++ .../domain/model/mailbox_subscribe_state.dart | 13 ++++++++ .../model/subscribe_mailbox_request.dart | 14 +++++++++ .../domain/repository/mailbox_repository.dart | 3 ++ .../domain/state/subscribe_mailbox_state.dart | 22 ++++++++++++++ .../subscribe_mailbox_interactor.dart | 25 ++++++++++++++++ 10 files changed, 132 insertions(+) create mode 100644 lib/features/mailbox/domain/model/mailbox_subscribe_state.dart create mode 100644 lib/features/mailbox/domain/model/subscribe_mailbox_request.dart create mode 100644 lib/features/mailbox/domain/state/subscribe_mailbox_state.dart create mode 100644 lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart diff --git a/lib/features/mailbox/data/datasource/mailbox_datasource.dart b/lib/features/mailbox/data/datasource/mailbox_datasource.dart index 95f8d66fb..9830546fb 100644 --- a/lib/features/mailbox/data/datasource/mailbox_datasource.dart +++ b/lib/features/mailbox/data/datasource/mailbox_datasource.dart @@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; 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'; abstract class MailboxDataSource { Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}); @@ -39,4 +40,6 @@ abstract class MailboxDataSource { MailboxId mailboxId, int totalEmailUnread, StreamController> onProgressController); + + Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request); } \ No newline at end of file diff --git a/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart b/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart index 38636bd99..272c224a3 100644 --- a/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart @@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; 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/main/exceptions/exception_thrower.dart'; class MailboxCacheDataSourceImpl extends MailboxDataSource { @@ -84,4 +85,9 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource { StreamController> onProgressController) { throw UnimplementedError(); } + + @override + Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request) { + throw UnimplementedError(); + } } \ No newline at end of file diff --git a/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart b/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart index 6768f3729..be2b26176 100644 --- a/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart @@ -19,6 +19,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; 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/main/exceptions/exception_thrower.dart'; class MailboxDataSourceImpl extends MailboxDataSource { @@ -109,4 +110,13 @@ class MailboxDataSourceImpl extends MailboxDataSource { _exceptionThrower.throwException(error); }); } + + @override + Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request) { + return Future.sync(() async { + return await mailboxAPI.subscribeMailbox(accountId, request); + }).catchError((error) { + _exceptionThrower.throwException(error); + }); + } } \ No newline at end of file diff --git a/lib/features/mailbox/data/network/mailbox_api.dart b/lib/features/mailbox/data/network/mailbox_api.dart index 3b4c550bd..4b9d5b286 100644 --- a/lib/features/mailbox/data/network/mailbox_api.dart +++ b/lib/features/mailbox/data/network/mailbox_api.dart @@ -28,8 +28,10 @@ import 'package:tmail_ui_user/features/base/mixin/handle_error_mixin.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart'; 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/main/error/capability_validator.dart'; class MailboxAPI with HandleSetErrorMixin { @@ -289,4 +291,32 @@ class MailboxAPI with HandleSetErrorMixin { throw error; }); } + + Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request) async { + final setMailboxMethod = SetMailboxMethod(accountId) + ..addUpdates({ + request.mailboxId.id : PatchObject({ + 'isSubscribed': request.newState == MailboxSubscribeState.disabled ? true : false + }) + }); + + final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation()); + + final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod); + + final response = await (requestBuilder + ..usings(setMailboxMethod.requiredCapabilities)) + .build() + .execute(); + + final setMailboxResponse = response.parse( + setMailboxInvocation.methodCallId, + SetMailboxResponse.deserialize); + + return Future.sync(() async { + return setMailboxResponse?.updated?.isNotEmpty == true; + }).catchError((error) { + throw error; + }); + } } \ No newline at end of file diff --git a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart index 6b1b4f0dc..0e706b045 100644 --- a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart +++ b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart @@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; 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/repository/mailbox_repository.dart'; class MailboxRepositoryImpl extends MailboxRepository { @@ -188,4 +189,9 @@ class MailboxRepositoryImpl extends MailboxRepository { Future getMailboxState() { return stateDataSource.getState(StateType.mailbox); } + + @override + Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request) { + return mapDataSource[DataSourceType.network]!.subscribeMailbox(accountId, request); + } } \ No newline at end of file diff --git a/lib/features/mailbox/domain/model/mailbox_subscribe_state.dart b/lib/features/mailbox/domain/model/mailbox_subscribe_state.dart new file mode 100644 index 000000000..a68b043b8 --- /dev/null +++ b/lib/features/mailbox/domain/model/mailbox_subscribe_state.dart @@ -0,0 +1,13 @@ +enum MailboxSubscribeState { + enabled, + disabled; + + String get keyValue { + switch(this) { + case MailboxSubscribeState.enabled: + return 'enabled'; + case MailboxSubscribeState.disabled: + return 'disabled'; + } + } +} \ 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 new file mode 100644 index 000000000..d0bd5eedc --- /dev/null +++ b/lib/features/mailbox/domain/model/subscribe_mailbox_request.dart @@ -0,0 +1,14 @@ +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_state.dart'; + +class SubscribeMailboxRequest with EquatableMixin { + + final MailboxId mailboxId; + final MailboxSubscribeState newState; + + SubscribeMailboxRequest(this.mailboxId, this.newState); + + @override + List get props => [mailboxId, newState]; +} diff --git a/lib/features/mailbox/domain/repository/mailbox_repository.dart b/lib/features/mailbox/domain/repository/mailbox_repository.dart index 41f94a276..c9f345f2e 100644 --- a/lib/features/mailbox/domain/repository/mailbox_repository.dart +++ b/lib/features/mailbox/domain/repository/mailbox_repository.dart @@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; 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'; abstract class MailboxRepository { Stream getAllMailbox(Session session, AccountId accountId, {Properties? properties}); @@ -36,4 +37,6 @@ abstract class MailboxRepository { Future moveMailbox(AccountId accountId, MoveMailboxRequest request); Future getMailboxState(); + + Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request); } \ 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 new file mode 100644 index 000000000..ca04eeb34 --- /dev/null +++ b/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart @@ -0,0 +1,22 @@ +import 'package:core/core.dart'; + +class LoadingSubscribeMailbox extends UIState {} + +class SubscribeMailboxSuccess extends UIState { + + final bool subscribeMailbox; + + SubscribeMailboxSuccess(this.subscribeMailbox); + + @override + List get props => [subscribeMailbox]; +} + +class SubscribeMailboxFailure extends FeatureFailure { + final dynamic exception; + + SubscribeMailboxFailure(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 new file mode 100644 index 000000000..5b5d04bcc --- /dev/null +++ b/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart @@ -0,0 +1,25 @@ +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_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_mailbox_state.dart'; + +class SearchMailboxInteractor { + final MailboxRepository _mailboxRepository; + + SearchMailboxInteractor(this._mailboxRepository); + + Stream> execute(AccountId accountId, SubscribeMailboxRequest request) async* { + try { + yield Right(LoadingSubscribeMailbox()); + + final resultList = await _mailboxRepository.subscribeMailbox(accountId, request); + + yield Right(SubscribeMailboxSuccess(resultList)); + } catch (exception) { + yield Left(SubscribeMailboxFailure(exception)); + } + } +} \ No newline at end of file