From 46d793ace319e28bb2f3e2fd073c92b97049bdef Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 10 Feb 2023 14:37:34 +0700 Subject: [PATCH] TF-1432 [Data] Implement subscribe multiple mailbox --- .../data/datasource/mailbox_datasource.dart | 3 ++ .../mailbox_cache_datasource_impl.dart | 6 ++++ .../mailbox_datasource_impl.dart | 10 ++++++ .../mailbox/data/network/mailbox_api.dart | 35 ++++++++++++++++++- .../repository/mailbox_repository_impl.dart | 6 ++++ 5 files changed, 59 insertions(+), 1 deletion(-) diff --git a/lib/features/mailbox/data/datasource/mailbox_datasource.dart b/lib/features/mailbox/data/datasource/mailbox_datasource.dart index 7aabd07dc..ddbf23682 100644 --- a/lib/features/mailbox/data/datasource/mailbox_datasource.dart +++ b/lib/features/mailbox/data/datasource/mailbox_datasource.dart @@ -17,6 +17,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 MailboxDataSource { Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}); @@ -42,4 +43,6 @@ abstract class MailboxDataSource { StreamController> onProgressController); Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request); + + Future> subscribeMultipleMailbox(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest); } \ 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 6e36a76a3..791d03bd0 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 @@ -19,6 +19,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'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; class MailboxCacheDataSourceImpl extends MailboxDataSource { @@ -90,4 +91,9 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource { Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request) { throw UnimplementedError(); } + + @override + Future> subscribeMultipleMailbox(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest) { + 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 30b72b330..3b3ca0fca 100644 --- a/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart @@ -20,6 +20,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'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; class MailboxDataSourceImpl extends MailboxDataSource { @@ -119,4 +120,13 @@ class MailboxDataSourceImpl extends MailboxDataSource { _exceptionThrower.throwException(error); }); } + + @override + Future> subscribeMultipleMailbox(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest) { + return Future.sync(() async { + return await mailboxAPI.subscribeMultipleMailbox(accountId, subscribeRequest); + }).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 1d44fcbf0..cd4a88f0b 100644 --- a/lib/features/mailbox/data/network/mailbox_api.dart +++ b/lib/features/mailbox/data/network/mailbox_api.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:collection/collection.dart'; import 'package:core/utils/app_logger.dart'; import 'package:jmap_dart_client/http/http_client.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; @@ -26,12 +27,14 @@ import 'package:model/error_type_handler/set_method_error_handler_mixin.dart'; import 'package:model/model.dart'; 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/extensions/list_mailbox_id_extension.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/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart'; class MailboxAPI with HandleSetErrorMixin { @@ -298,7 +301,7 @@ class MailboxAPI with HandleSetErrorMixin { final setMailboxMethod = SetMailboxMethod(accountId) ..addUpdates({ request.mailboxId.id : PatchObject({ - 'isSubscribed': request.newState == MailboxSubscribeState.disabled ? false : true + MailboxProperty.isSubscribed: request.subscribeState == MailboxSubscribeState.enabled }) }); @@ -321,4 +324,34 @@ class MailboxAPI with HandleSetErrorMixin { throw error; }); } + + Future> subscribeMultipleMailbox(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest) async { + final mapMailboxUpdated = subscribeRequest.mailboxIdsSubscribe + .generateMapUpdateObjectSubscribeMailbox(subscribeRequest.subscribeState); + + final setMailboxMethod = SetMailboxMethod(accountId) + ..addUpdates(mapMailboxUpdated); + + 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 + ); + + final listMailboxIdSubscribe = setMailboxResponse?.updated?.keys + .whereNotNull() + .map((id) => MailboxId(id)) + .toList(); + + log('MailboxAPI::subscribeMultipleMailbox():listMailboxIdSubscribe: $listMailboxIdSubscribe'); + return listMailboxIdSubscribe ?? []; + } } \ 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 98aae6ee8..885472c2d 100644 --- a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart +++ b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart @@ -23,6 +23,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'; import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; class MailboxRepositoryImpl extends MailboxRepository { @@ -194,4 +195,9 @@ class MailboxRepositoryImpl extends MailboxRepository { Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request) { return mapDataSource[DataSourceType.network]!.subscribeMailbox(accountId, request); } + + @override + Future> subscribeMultipleMailbox(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest) { + return mapDataSource[DataSourceType.network]!.subscribeMultipleMailbox(accountId, subscribeRequest); + } } \ No newline at end of file