From bb9dbb697a74994d325ccd2724658f67e5c3bc7a Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 21 Mar 2023 16:34:09 +0700 Subject: [PATCH] TF-1625 Get capability supported for `Identity/set` method (cherry picked from commit 16a77edba891a628b728d05ddd3a61c9ba45b8dc) --- .../presentation/composer_controller.dart | 5 +- .../controller/single_email_controller.dart | 5 +- .../identity_creator_controller.dart | 40 +++++----- .../presentation/identity_creator_view.dart | 34 ++++++--- .../data/datasource/identity_data_source.dart | 9 ++- .../identity_data_source_impl.dart | 18 ++--- .../data/network/identity_api.dart | 73 ++++++++++--------- .../repository/identity_repository_impl.dart | 17 +++-- .../repository/identity_repository.dart | 9 ++- ...reate_new_default_identity_interactor.dart | 25 ++++--- .../create_new_identity_interactor.dart | 9 ++- .../usecases/delete_identity_interactor.dart | 12 ++- .../edit_default_identity_interactor.dart | 21 +++--- .../usecases/edit_identity_interactor.dart | 11 ++- .../get_all_identities_interactor.dart | 13 +++- .../identities/identities_controller.dart | 48 +++++++----- .../list_identity_id_extension.dart | 16 ++++ model/lib/model.dart | 1 + 18 files changed, 223 insertions(+), 143 deletions(-) create mode 100644 model/lib/extensions/list_identity_id_extension.dart diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 31a23c648..d1a08ff75 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -409,8 +409,9 @@ class ComposerController extends BaseController { void _getAllIdentities() { final accountId = mailboxDashBoardController.accountId.value; - if (accountId != null) { - consumeState(_getAllIdentitiesInteractor.execute(accountId)); + final session = mailboxDashBoardController.sessionCurrent; + if (accountId != null && session != null) { + consumeState(_getAllIdentitiesInteractor.execute(session, accountId)); } } diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 9f8ae0ac7..7f2f7e664 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -253,8 +253,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void _getAllIdentities() { final accountId = mailboxDashBoardController.accountId.value; - if (accountId != null) { - consumeState(_getAllIdentitiesInteractor.execute(accountId)); + final session = mailboxDashBoardController.sessionCurrent; + if (accountId != null && session != null) { + consumeState(_getAllIdentitiesInteractor.execute(session, accountId)); } } diff --git a/lib/features/identity_creator/presentation/identity_creator_controller.dart b/lib/features/identity_creator/presentation/identity_creator_controller.dart index 1598ff7e4..0d263e2fb 100644 --- a/lib/features/identity_creator/presentation/identity_creator_controller.dart +++ b/lib/features/identity_creator/presentation/identity_creator_controller.dart @@ -55,6 +55,7 @@ class IdentityCreatorController extends BaseController { final bccOfIdentity = Rxn(); final actionType = IdentityActionType.create.obs; final isDefaultIdentity = RxBool(false); + final isDefaultIdentitySupported = RxBool(false); late RichTextController keyboardRichTextController; late RichTextWebController richTextWebController; @@ -120,6 +121,7 @@ class IdentityCreatorController extends BaseController { userProfile = arguments!.userProfile; identity = arguments!.identity; actionType.value = arguments!.actionType; + _checkDefaultIdentityIsSupported(); _setUpValueFromIdentity(); _getAllIdentities(); } @@ -147,6 +149,12 @@ class IdentityCreatorController extends BaseController { ); } + void _checkDefaultIdentityIsSupported() { + if (session != null && accountId != null) { + isDefaultIdentitySupported.value = [CapabilityIdentifier.jamesSortOrder].isSupported(session!, accountId!); + } + } + void _setUpValueFromIdentity() { _nameIdentity = identity?.name ?? ''; inputNameIdentityController?.text = identity?.name ?? ''; @@ -160,21 +168,12 @@ class IdentityCreatorController extends BaseController { } void _getAllIdentities() { - log('IdentityCreatorController::_getAllIdentities() '); - if (accountId != null) { - try { - requireCapability(session!, accountId!, [CapabilityIdentifier.jamesSortOrder]); - consumeState(_getAllIdentitiesInteractor.execute( - accountId!, - properties: Properties({'email', 'sortOrder'}) - )); - } catch (e) { - logError('IdentityCreatorController::_getAllIdentities(): exception: $e'); - consumeState(_getAllIdentitiesInteractor.execute( - accountId!, - properties: Properties({'email'}) - )); - } + if (accountId != null && session != null) { + final propertiesRequired = isDefaultIdentitySupported.isTrue + ? Properties({'email', 'sortOrder'}) + : Properties({'email'}); + + consumeState(_getAllIdentitiesInteractor.execute(session!, accountId!, properties: propertiesRequired)); } } @@ -187,7 +186,10 @@ class IdentityCreatorController extends BaseController { listEmailAddressOfReplyTo.add(noneEmailAddress); listEmailAddressOfReplyTo.addAll(listEmailAddressDefault); _setUpAllFieldEmailAddress(); - _setUpDefaultIdentity(success.identities); + + if (isDefaultIdentitySupported.isTrue) { + _setUpDefaultIdentity(success.identities); + } } else { _setDefaultEmailAddressList(); } @@ -319,9 +321,9 @@ class IdentityCreatorController extends BaseController { ? {replyToOfIdentity.value!} : {}; - final sortOrder = isDefaultIdentity.value - ? UnsignedInt(0) - : UnsignedInt(100); + final sortOrder = isDefaultIdentitySupported.isTrue + ? UnsignedInt(isDefaultIdentity.value ? 0 : 100) + : null; final newIdentity = Identity( name: _nameIdentity, diff --git a/lib/features/identity_creator/presentation/identity_creator_view.dart b/lib/features/identity_creator/presentation/identity_creator_view.dart index 6436660af..5c598a744 100644 --- a/lib/features/identity_creator/presentation/identity_creator_view.dart +++ b/lib/features/identity_creator/presentation/identity_creator_view.dart @@ -271,13 +271,20 @@ class IdentityCreatorView extends GetWidget { child: _buildSignatureHtmlTemplate(context), ), if (_responsiveUtils.isTablet(context) || _responsiveUtils.isMobile(context))...[ - Obx(() => Padding( - padding: const EdgeInsets.only(top: 27), - child: SetDefaultIdentityCheckboxBuilder( - imagePaths: _imagePaths, - isCheck: controller.isDefaultIdentity.value, - onCheckboxChanged: controller.onCheckboxChanged), - )), + Obx(() { + if (controller.isDefaultIdentitySupported.isTrue) { + return Padding( + padding: const EdgeInsets.only(top: 27), + child: SetDefaultIdentityCheckboxBuilder( + imagePaths: _imagePaths, + isCheck: controller.isDefaultIdentity.value, + onCheckboxChanged: controller.onCheckboxChanged + ) + ); + } else { + return const SizedBox.shrink(); + } + }), const SizedBox(height: 24), Container( alignment: Alignment.center, @@ -467,10 +474,15 @@ class IdentityCreatorView extends GetWidget { return Row( children: [ Obx(() { - return SetDefaultIdentityCheckboxBuilder( - imagePaths: _imagePaths, - isCheck: controller.isDefaultIdentity.value, - onCheckboxChanged: controller.onCheckboxChanged); + if (controller.isDefaultIdentitySupported.isTrue) { + return SetDefaultIdentityCheckboxBuilder( + imagePaths: _imagePaths, + isCheck: controller.isDefaultIdentity.value, + onCheckboxChanged: controller.onCheckboxChanged + ); + } else { + return const SizedBox.shrink(); + } }), Expanded( child: Padding( diff --git a/lib/features/manage_account/data/datasource/identity_data_source.dart b/lib/features/manage_account/data/datasource/identity_data_source.dart index 0160fd21d..5b5384cda 100644 --- a/lib/features/manage_account/data/datasource/identity_data_source.dart +++ b/lib/features/manage_account/data/datasource/identity_data_source.dart @@ -1,16 +1,17 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart'; abstract class IdentityDataSource { - Future getAllIdentities(AccountId accountId, {Properties? properties}); + Future getAllIdentities(Session session, AccountId accountId, {Properties? properties}); - Future createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest); + Future createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest); - Future deleteIdentity(AccountId accountId, IdentityId identityId); + Future deleteIdentity(Session session, AccountId accountId, IdentityId identityId); - Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest); + Future editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest); } \ No newline at end of file diff --git a/lib/features/manage_account/data/datasource_impl/identity_data_source_impl.dart b/lib/features/manage_account/data/datasource_impl/identity_data_source_impl.dart index 27c837007..b0439ecbc 100644 --- a/lib/features/manage_account/data/datasource_impl/identity_data_source_impl.dart +++ b/lib/features/manage_account/data/datasource_impl/identity_data_source_impl.dart @@ -1,5 +1,6 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource/identity_data_source.dart'; import 'package:tmail_ui_user/features/manage_account/data/network/identity_api.dart'; @@ -16,31 +17,30 @@ class IdentityDataSourceImpl extends IdentityDataSource { IdentityDataSourceImpl(this._identityAPI, this._exceptionThrower); @override - Future getAllIdentities(AccountId accountId, - {Properties? properties}) { + Future getAllIdentities(Session session, AccountId accountId, {Properties? properties}) { return Future.sync(() async { - return await _identityAPI.getAllIdentities(accountId, properties: properties); + return await _identityAPI.getAllIdentities(session, accountId, properties: properties); }).catchError(_exceptionThrower.throwException); } @override - Future createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) { + Future createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest) { return Future.sync(() async { - return await _identityAPI.createNewIdentity(accountId, identityRequest); + return await _identityAPI.createNewIdentity(session, accountId, identityRequest); }).catchError(_exceptionThrower.throwException); } @override - Future deleteIdentity(AccountId accountId, IdentityId identityId) { + Future deleteIdentity(Session session, AccountId accountId, IdentityId identityId) { return Future.sync(() async { - return await _identityAPI.deleteIdentity(accountId, identityId); + return await _identityAPI.deleteIdentity(session, accountId, identityId); }).catchError(_exceptionThrower.throwException); } @override - Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) { + Future editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest) { return Future.sync(() async { - return await _identityAPI.editIdentity(accountId, editIdentityRequest); + return await _identityAPI.editIdentity(session, accountId, editIdentityRequest); }).catchError(_exceptionThrower.throwException); } } \ No newline at end of file diff --git a/lib/features/manage_account/data/network/identity_api.dart b/lib/features/manage_account/data/network/identity_api.dart index 6100c0dce..39ee724d6 100644 --- a/lib/features/manage_account/data/network/identity_api.dart +++ b/lib/features/manage_account/data/network/identity_api.dart @@ -12,7 +12,7 @@ import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:jmap_dart_client/jmap/identities/set/set_identity_method.dart'; import 'package:jmap_dart_client/jmap/identities/set/set_identity_response.dart'; import 'package:jmap_dart_client/jmap/jmap_request.dart'; -import 'package:model/identity/identity_request_dto.dart'; +import 'package:model/extensions/list_identity_id_extension.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_default_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_default_identity_request.dart'; @@ -31,7 +31,9 @@ class IdentityAPI { if (properties != null) { getIdentityMethod.addProperties(properties); } - final capabilitySupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId) + + final jamesSortOrderIsSupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId); + final capabilitySupported = jamesSortOrderIsSupported ? getIdentityMethod.requiredCapabilitiesSupportSortOrder : getIdentityMethod.requiredCapabilities; @@ -49,14 +51,22 @@ class IdentityAPI { return IdentitiesResponse(identities: response?.list, state: response?.state); } - Future createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) async { + Future createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest) async { final setIdentityMethod = SetIdentityMethod(accountId) ..addCreate(identityRequest.creationId, identityRequest.newIdentity); - - var capabilities = setIdentityMethod.requiredCapabilities; - if (identityRequest is CreateNewDefaultIdentityRequest) { - capabilities = setIdentityMethod.requiredCapabilitiesSupportSortOrder; - _addUpdatesToCreateDefaultIdentityMethod(setIdentityMethod, identityRequest); + + final jamesSortOrderIsSupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId); + final capabilitySupported = jamesSortOrderIsSupported + ? setIdentityMethod.requiredCapabilitiesSupportSortOrder + : setIdentityMethod.requiredCapabilities; + + if (jamesSortOrderIsSupported && + identityRequest is CreateNewDefaultIdentityRequest && + identityRequest.oldDefaultIdentityIds != null + ) { + setIdentityMethod.addUpdates( + identityRequest.oldDefaultIdentityIds!.generateMapUpdateObjectSortOrder(sortOrder: UnsignedInt(100)) + ); } final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); @@ -64,7 +74,7 @@ class IdentityAPI { final setIdentityInvocation = requestBuilder.invocation(setIdentityMethod); final response = await (requestBuilder - ..usings(capabilities)) + ..usings(capabilitySupported)) .build() .execute(); @@ -75,27 +85,21 @@ class IdentityAPI { return setIdentityResponse!.created![identityRequest.creationId]!; } - void _addUpdatesToCreateDefaultIdentityMethod( - SetIdentityMethod setIdentityMethod, - CreateNewDefaultIdentityRequest identityRequest - ) { - for (var i = 0; i < (identityRequest.oldDefaultIdentityIds?.length ?? 0); i++) { - setIdentityMethod.addUpdates({ - identityRequest.oldDefaultIdentityIds![i].id : PatchObject(IdentityRequestDto(sortOrder: UnsignedInt(100)).toJson()) - }); - } - } - - Future deleteIdentity(AccountId accountId, IdentityId identityId) async { + Future deleteIdentity(Session session, AccountId accountId, IdentityId identityId) async { final setIdentityMethod = SetIdentityMethod(accountId) ..addDestroy({identityId.id}); + final jamesSortOrderIsSupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId); + final capabilitySupported = jamesSortOrderIsSupported + ? setIdentityMethod.requiredCapabilitiesSupportSortOrder + : setIdentityMethod.requiredCapabilities; + final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final setIdentityInvocation = requestBuilder.invocation(setIdentityMethod); final response = await (requestBuilder - ..usings(setIdentityMethod.requiredCapabilities)) + ..usings(capabilitySupported)) .build() .execute(); @@ -106,21 +110,24 @@ class IdentityAPI { return setIdentityResponse?.destroyed?.contains(identityId.id) == true; } - Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) async { + Future editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest) async { final setIdentityMethod = SetIdentityMethod(accountId) ..addUpdates({ editIdentityRequest.identityId.id : PatchObject(editIdentityRequest.identityRequest.toJson()) }); - - var capabilities = setIdentityMethod.requiredCapabilities; - if (editIdentityRequest is EditDefaultIdentityRequest) { - for (var identityId in editIdentityRequest.oldDefaultIdentityIds ?? []) { - setIdentityMethod.addUpdates({ - identityId.id: PatchObject(IdentityRequestDto(sortOrder: UnsignedInt(100)).toJson()) - }); - } - capabilities = setIdentityMethod.requiredCapabilitiesSupportSortOrder; + final jamesSortOrderIsSupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId); + final capabilitySupported = jamesSortOrderIsSupported + ? setIdentityMethod.requiredCapabilitiesSupportSortOrder + : setIdentityMethod.requiredCapabilities; + + if (jamesSortOrderIsSupported && + editIdentityRequest is EditDefaultIdentityRequest && + editIdentityRequest.oldDefaultIdentityIds != null + ) { + setIdentityMethod.addUpdates( + editIdentityRequest.oldDefaultIdentityIds!.generateMapUpdateObjectSortOrder(sortOrder: UnsignedInt(100)) + ); } final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); @@ -128,7 +135,7 @@ class IdentityAPI { final setIdentityInvocation = requestBuilder.invocation(setIdentityMethod); final response = await (requestBuilder - ..usings(capabilities)) + ..usings(capabilitySupported)) .build() .execute(); diff --git a/lib/features/manage_account/data/repository/identity_repository_impl.dart b/lib/features/manage_account/data/repository/identity_repository_impl.dart index 427736846..54446bcbe 100644 --- a/lib/features/manage_account/data/repository/identity_repository_impl.dart +++ b/lib/features/manage_account/data/repository/identity_repository_impl.dart @@ -1,6 +1,7 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource/identity_data_source.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; @@ -15,22 +16,22 @@ class IdentityRepositoryImpl extends IdentityRepository { IdentityRepositoryImpl(this._dataSource); @override - Future getAllIdentities(AccountId accountId, {Properties? properties}) { - return _dataSource.getAllIdentities(accountId, properties: properties); + Future getAllIdentities(Session session, AccountId accountId, {Properties? properties}) { + return _dataSource.getAllIdentities(session, accountId, properties: properties); } @override - Future createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) { - return _dataSource.createNewIdentity(accountId, identityRequest); + Future createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest) { + return _dataSource.createNewIdentity(session, accountId, identityRequest); } @override - Future deleteIdentity(AccountId accountId, IdentityId identityId) { - return _dataSource.deleteIdentity(accountId, identityId); + Future deleteIdentity(Session session, AccountId accountId, IdentityId identityId) { + return _dataSource.deleteIdentity(session, accountId, identityId); } @override - Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) { - return _dataSource.editIdentity(accountId, editIdentityRequest); + Future editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest) { + return _dataSource.editIdentity(session, accountId, editIdentityRequest); } } \ No newline at end of file diff --git a/lib/features/manage_account/domain/repository/identity_repository.dart b/lib/features/manage_account/domain/repository/identity_repository.dart index a424d46d6..54f714df0 100644 --- a/lib/features/manage_account/domain/repository/identity_repository.dart +++ b/lib/features/manage_account/domain/repository/identity_repository.dart @@ -1,16 +1,17 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart'; abstract class IdentityRepository { - Future getAllIdentities(AccountId accountId, {Properties? properties}); + Future getAllIdentities(Session session, AccountId accountId, {Properties? properties}); - Future createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest); + Future createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest); - Future deleteIdentity(AccountId accountId, IdentityId identityId); + Future deleteIdentity(Session session, AccountId accountId, IdentityId identityId); - Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest); + Future editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest); } \ No newline at end of file diff --git a/lib/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart b/lib/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart index a030a7d5f..a4a5101cc 100644 --- a/lib/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart +++ b/lib/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart @@ -1,9 +1,11 @@ import 'dart:core'; -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/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_default_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; @@ -19,26 +21,31 @@ class CreateNewDefaultIdentityInteractor { this._identityRepository, this._identityUtils); - Stream> execute(AccountId accountId, CreateNewIdentityRequest identityRequest) async* { + Stream> execute( + Session session, + AccountId accountId, + CreateNewIdentityRequest identityRequest + ) async* { try { yield Right(CreateNewDefaultIdentityLoading()); - final listDefaultIdentities = await _getDefaultIdentities(accountId); + final listDefaultIdentities = await _getDefaultIdentities(session, accountId); final defaultRequest = _createNewIdentityDefault(identityRequest, listDefaultIdentities); - final newIdentity = await _identityRepository.createNewIdentity(accountId, defaultRequest); + final newIdentity = await _identityRepository.createNewIdentity(session, accountId, defaultRequest); yield Right(CreateNewDefaultIdentitySuccess(newIdentity)); } catch (exception) { yield Left(CreateNewDefaultIdentityFailure(exception)); } } - Future?> _getDefaultIdentities(AccountId accountId) async { + Future?> _getDefaultIdentities(Session session, AccountId accountId) async { final listIdentities = await _identityRepository - .getAllIdentities( - accountId, - properties: Properties({'sortOrder', 'mayDelete'}) - ); + .getAllIdentities( + session, + accountId, + properties: Properties({'sortOrder', 'mayDelete'}) + ); listIdentities.identities?.removeWhere(_isIdentityUnDeletable); return _identityUtils.getSmallestOrderedIdentity(listIdentities.identities); } diff --git a/lib/features/manage_account/domain/usecases/create_new_identity_interactor.dart b/lib/features/manage_account/domain/usecases/create_new_identity_interactor.dart index 68c3569cc..8f9803090 100644 --- a/lib/features/manage_account/domain/usecases/create_new_identity_interactor.dart +++ b/lib/features/manage_account/domain/usecases/create_new_identity_interactor.dart @@ -3,6 +3,7 @@ import 'dart:core'; import 'package:core/core.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:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_identity_state.dart'; @@ -12,10 +13,14 @@ class CreateNewIdentityInteractor { CreateNewIdentityInteractor(this._identityRepository); - Stream> execute(AccountId accountId, CreateNewIdentityRequest identityRequest) async* { + Stream> execute( + Session session, + AccountId accountId, + CreateNewIdentityRequest identityRequest + ) async* { try { yield Right(CreateNewIdentityLoading()); - final newIdentity = await _identityRepository.createNewIdentity(accountId, identityRequest); + final newIdentity = await _identityRepository.createNewIdentity(session, accountId, identityRequest); yield Right(CreateNewIdentitySuccess(newIdentity)); } catch (exception) { yield Left(CreateNewIdentityFailure(exception)); diff --git a/lib/features/manage_account/domain/usecases/delete_identity_interactor.dart b/lib/features/manage_account/domain/usecases/delete_identity_interactor.dart index 1d5ff9f6a..cf2833df2 100644 --- a/lib/features/manage_account/domain/usecases/delete_identity_interactor.dart +++ b/lib/features/manage_account/domain/usecases/delete_identity_interactor.dart @@ -1,8 +1,10 @@ import 'dart:core'; -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/identities/identity.dart'; import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/delete_identity_state.dart'; @@ -12,10 +14,14 @@ class DeleteIdentityInteractor { DeleteIdentityInteractor(this._identityRepository); - Stream> execute(AccountId accountId, IdentityId identityId) async* { + Stream> execute( + Session session, + AccountId accountId, + IdentityId identityId + ) async* { try { yield Right(DeleteIdentityLoading()); - final result = await _identityRepository.deleteIdentity(accountId, identityId); + final result = await _identityRepository.deleteIdentity(session, accountId, identityId); yield result ? Right(DeleteIdentitySuccess()) : Left(DeleteIdentityFailure(null)); } catch (exception) { yield Left(DeleteIdentityFailure(exception)); diff --git a/lib/features/manage_account/domain/usecases/edit_default_identity_interactor.dart b/lib/features/manage_account/domain/usecases/edit_default_identity_interactor.dart index aea9fe7d7..97c4c26e4 100644 --- a/lib/features/manage_account/domain/usecases/edit_default_identity_interactor.dart +++ b/lib/features/manage_account/domain/usecases/edit_default_identity_interactor.dart @@ -4,6 +4,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_default_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; @@ -21,13 +22,14 @@ class EditDefaultIdentityInteractor { ); Stream> execute( - AccountId accountId, - EditIdentityRequest editIdentityRequest + Session session, + AccountId accountId, + EditIdentityRequest editIdentityRequest ) async* { try { yield Right(EditDefaultIdentityLoading()); - final defaultIdentities = await _getDefaultIdentities(accountId); + final defaultIdentities = await _getDefaultIdentities(session, accountId); _removeEditIdentityFromDefaultIdentities(defaultIdentities, editIdentityRequest.identityId); final editDefaultRequest = EditDefaultIdentityRequest( @@ -38,19 +40,20 @@ class EditDefaultIdentityInteractor { ?.map((identity) => identity.id!) .toList()); - final result = await _identityRepository.editIdentity(accountId, editDefaultRequest); + final result = await _identityRepository.editIdentity(session, accountId, editDefaultRequest); yield result ? Right(EditDefaultIdentitySuccess()) : Left(EditDefaultIdentityFailure(null)); } catch (exception) { yield Left(EditDefaultIdentityFailure(exception)); } } - Future?> _getDefaultIdentities(AccountId accountId) async { + Future?> _getDefaultIdentities(Session session, AccountId accountId) async { final listIdentities = await _identityRepository - .getAllIdentities( - accountId, - properties: Properties({'sortOrder'}) - ); + .getAllIdentities( + session, + accountId, + properties: Properties({'sortOrder'}) + ); return _identityUtils .getSmallestOrderedIdentity(listIdentities.identities) ?.toList(); diff --git a/lib/features/manage_account/domain/usecases/edit_identity_interactor.dart b/lib/features/manage_account/domain/usecases/edit_identity_interactor.dart index ebf4333e4..494fc87f0 100644 --- a/lib/features/manage_account/domain/usecases/edit_identity_interactor.dart +++ b/lib/features/manage_account/domain/usecases/edit_identity_interactor.dart @@ -1,8 +1,10 @@ import 'dart:core'; -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:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/edit_identity_state.dart'; @@ -13,12 +15,13 @@ class EditIdentityInteractor { EditIdentityInteractor(this._identityRepository); Stream> execute( - AccountId accountId, - EditIdentityRequest editIdentityRequest + Session session, + AccountId accountId, + EditIdentityRequest editIdentityRequest ) async* { try { yield Right(EditIdentityLoading()); - final result = await _identityRepository.editIdentity(accountId, editIdentityRequest); + final result = await _identityRepository.editIdentity(session, accountId, editIdentityRequest); yield result ? Right(EditIdentitySuccess()) : Left(EditIdentityFailure(null)); } catch (exception) { yield Left(EditIdentityFailure(exception)); diff --git a/lib/features/manage_account/domain/usecases/get_all_identities_interactor.dart b/lib/features/manage_account/domain/usecases/get_all_identities_interactor.dart index ea18b65a8..ba19dfb26 100644 --- a/lib/features/manage_account/domain/usecases/get_all_identities_interactor.dart +++ b/lib/features/manage_account/domain/usecases/get_all_identities_interactor.dart @@ -1,12 +1,16 @@ import 'dart:core'; -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/capability/capability_identifier.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart'; +import 'package:tmail_ui_user/main/error/capability_validator.dart'; class GetAllIdentitiesInteractor { final IdentityRepository _identityRepository; @@ -14,11 +18,12 @@ class GetAllIdentitiesInteractor { GetAllIdentitiesInteractor(this._identityRepository, this._identityUtils); - Stream> execute(AccountId accountId, {Properties? properties}) async* { + Stream> execute(Session session, AccountId accountId, {Properties? properties}) async* { try { yield Right(GetAllIdentitiesLoading()); - final identitiesResponse = await _identityRepository.getAllIdentities(accountId, properties: properties); - if (identitiesResponse.identities != null) { + final identitiesResponse = await _identityRepository.getAllIdentities(session, accountId, properties: properties); + final sortOrderIsSupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId); + if (sortOrderIsSupported && identitiesResponse.identities != null) { _identityUtils.sortListIdentities(identitiesResponse.identities!); } yield Right(GetAllIdentitiesSuccess(identitiesResponse.identities, identitiesResponse.state)); diff --git a/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart b/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart index c244895a4..0ef6556c4 100644 --- a/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart +++ b/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart @@ -9,6 +9,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.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/identities/identity.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart'; @@ -100,7 +101,10 @@ class IdentitiesController extends BaseController { void _initWorker() { accountIdWorker = ever(_accountDashBoardController.accountId, (accountId) { if (accountId is AccountId) { - _getAllIdentities(accountId); + final session = _accountDashBoardController.sessionCurrent.value; + if (session != null) { + _getAllIdentities(session, accountId); + } } }); @@ -113,8 +117,8 @@ class IdentitiesController extends BaseController { accountIdWorker.call(); } - void _getAllIdentities(AccountId accountId) { - consumeState(_getAllIdentitiesInteractor.execute(accountId)); + void _getAllIdentities(Session session, AccountId accountId) { + consumeState(_getAllIdentitiesInteractor.execute(session, accountId)); } void _refreshAllIdentities() { @@ -122,8 +126,9 @@ class IdentitiesController extends BaseController { listAllIdentities.clear(); final accountId = _accountDashBoardController.accountId.value; - if (accountId != null) { - _getAllIdentities(accountId); + final session = _accountDashBoardController.sessionCurrent.value; + if (accountId != null && session != null) { + _getAllIdentities(session, accountId); } } @@ -157,9 +162,9 @@ class IdentitiesController extends BaseController { arguments: arguments, onCreatedIdentity: (arguments) { if (arguments is CreateNewIdentityRequest) { - _createNewIdentityAction(accountId, arguments); + _createNewIdentityAction(session, accountId, arguments); } else if (arguments is EditIdentityRequest) { - _editIdentityAction(accountId, arguments); + _editIdentityAction(session, accountId, arguments); } }); } else { @@ -168,22 +173,23 @@ class IdentitiesController extends BaseController { arguments: arguments); if (newIdentityArguments is CreateNewIdentityRequest) { - _createNewIdentityAction(accountId, newIdentityArguments); + _createNewIdentityAction(session, accountId, newIdentityArguments); } else if (newIdentityArguments is EditIdentityRequest) { - _editIdentityAction(accountId, newIdentityArguments); + _editIdentityAction(session, accountId, newIdentityArguments); } } } } void _createNewIdentityAction( + Session session, AccountId accountId, CreateNewIdentityRequest identityRequest ) async { if (identityRequest.isDefaultIdentity) { - consumeState(_createNewDefaultIdentityInteractor.execute(accountId, identityRequest)); + consumeState(_createNewDefaultIdentityInteractor.execute(session, accountId, identityRequest)); } else { - consumeState(_createNewIdentityInteractor.execute(accountId, identityRequest)); + consumeState(_createNewIdentityInteractor.execute(session, accountId, identityRequest)); } } @@ -221,9 +227,10 @@ class IdentitiesController extends BaseController { void _deleteIdentityAction(Identity identity) { popBack(); + final session = _accountDashBoardController.sessionCurrent.value; final accountId = _accountDashBoardController.accountId.value; - if (accountId != null && identity.id != null) { - consumeState(_deleteIdentityInteractor.execute(accountId, identity.id!)); + if (accountId != null && session != null && identity.id != null) { + consumeState(_deleteIdentityInteractor.execute(session, accountId, identity.id!)); } } @@ -280,9 +287,9 @@ class IdentitiesController extends BaseController { arguments: arguments, onCreatedIdentity: (arguments) { if (arguments is CreateNewIdentityRequest) { - _createNewIdentityAction(accountId, arguments); + _createNewIdentityAction(session, accountId, arguments); } else if (arguments is EditIdentityRequest) { - _editIdentityAction(accountId, arguments); + _editIdentityAction(session, accountId, arguments); } }); } else { @@ -291,22 +298,23 @@ class IdentitiesController extends BaseController { arguments: arguments); if (newIdentityArguments is CreateNewIdentityRequest) { - _createNewIdentityAction(accountId, newIdentityArguments); + _createNewIdentityAction(session, accountId, newIdentityArguments); } else if (newIdentityArguments is EditIdentityRequest) { - _editIdentityAction(accountId, newIdentityArguments); + _editIdentityAction(session, accountId, newIdentityArguments); } } } } void _editIdentityAction( - AccountId accountId, + Session session, + AccountId accountId, EditIdentityRequest editIdentityRequest ) async { if (editIdentityRequest.isDefaultIdentity) { - consumeState(_editDefaultIdentityInteractor.execute(accountId, editIdentityRequest)); + consumeState(_editDefaultIdentityInteractor.execute(session, accountId, editIdentityRequest)); } else { - consumeState(_editIdentityInteractor.execute(accountId, editIdentityRequest)); + consumeState(_editIdentityInteractor.execute(session, accountId, editIdentityRequest)); } } diff --git a/model/lib/extensions/list_identity_id_extension.dart b/model/lib/extensions/list_identity_id_extension.dart new file mode 100644 index 000000000..6ce94bf87 --- /dev/null +++ b/model/lib/extensions/list_identity_id_extension.dart @@ -0,0 +1,16 @@ +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/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:model/identity/identity_request_dto.dart'; + +extension ListIdentityIdExtension on List { + + Map generateMapUpdateObjectSortOrder({UnsignedInt? sortOrder}) { + final Map maps = {}; + forEach((identityId) { + maps[identityId.id] = PatchObject(IdentityRequestDto(sortOrder: sortOrder).toJson()); + }); + return maps; + } +} \ No newline at end of file diff --git a/model/lib/model.dart b/model/lib/model.dart index 211441601..bac4d51aa 100644 --- a/model/lib/model.dart +++ b/model/lib/model.dart @@ -54,6 +54,7 @@ export 'extensions/email_filter_condition_extension.dart'; export 'extensions/list_email_header_extension.dart'; export 'extensions/account_extension.dart'; export 'extensions/list_presentation_mailbox_extension.dart'; +export 'extensions/list_identity_id_extension.dart'; // Identity export 'identity/identity_request_dto.dart'; export 'mailbox/expand_mode.dart';