From f188cd3b0df6dcfba62c06560e7dd8df80831a6a Mon Sep 17 00:00:00 2001 From: sherlockvn Date: Mon, 16 Jan 2023 17:02:32 +0700 Subject: [PATCH] TF-1194 create new default identity: add interactor and state for create new default identity --- .../create_new_default_identity_state.dart | 23 ++++++++ ...reate_new_default_identity_interactor.dart | 56 +++++++++++++++++++ .../get_all_identities_interactor.dart | 7 ++- 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 lib/features/manage_account/domain/state/create_new_default_identity_state.dart create mode 100644 lib/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart diff --git a/lib/features/manage_account/domain/state/create_new_default_identity_state.dart b/lib/features/manage_account/domain/state/create_new_default_identity_state.dart new file mode 100644 index 000000000..639c08b78 --- /dev/null +++ b/lib/features/manage_account/domain/state/create_new_default_identity_state.dart @@ -0,0 +1,23 @@ +import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/identities/identity.dart'; + +class CreateNewDefaultIdentityLoading extends UIState {} + +class CreateNewDefaultIdentitySuccess extends UIState { + + final Identity newIdentity; + + CreateNewDefaultIdentitySuccess(this.newIdentity); + + @override + List get props => [newIdentity]; +} + +class CreateNewDefaultIdentityFailure extends FeatureFailure { + final dynamic exception; + + CreateNewDefaultIdentityFailure(this.exception); + + @override + List get props => [exception]; +} \ 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 new file mode 100644 index 000000000..66a881283 --- /dev/null +++ b/lib/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart @@ -0,0 +1,56 @@ +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/properties/properties.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'; +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_default_identity_state.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart'; + +class CreateNewDefaultIdentityInteractor { + final IdentityRepository _identityRepository; + final IdentityUtils _identityUtils; + + CreateNewDefaultIdentityInteractor( + this._identityRepository, + this._identityUtils); + + Stream> execute(AccountId accountId, CreateNewIdentityRequest identityRequest) async* { + try { + yield Right(CreateNewDefaultIdentityLoading()); + final listDefaultIdentities = await _getDefaultIdentities(accountId); + + final defaultRequest = _createNewIdentityDefault(identityRequest, listDefaultIdentities); + + final newIdentity = await _identityRepository.createNewIdentity(accountId, defaultRequest); + yield Right(CreateNewDefaultIdentitySuccess(newIdentity)); + } catch (exception) { + yield Left(CreateNewDefaultIdentityFailure(exception)); + } + } + + Future?> _getDefaultIdentities(AccountId accountId) async { + final listIdentities = await _identityRepository + .getAllIdentities( + accountId, + properties: Properties({'sortOrder'}) + ); + return _identityUtils.getSmallestOrderedIdentity(listIdentities.identities); + } + + CreateNewDefaultIdentityRequest _createNewIdentityDefault( + CreateNewIdentityRequest identityRequest, + List? listDefaultIdentities, + ) { + return CreateNewDefaultIdentityRequest( + identityRequest.creationId, + identityRequest.newIdentity, + oldDefaultIdentityIds: listDefaultIdentities + ?.map((identity) => identity.id!) + .toList()); + } +} \ No newline at end of file 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 4bf3a202b..ea18b65a8 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 @@ -6,16 +6,21 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.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'; class GetAllIdentitiesInteractor { final IdentityRepository _identityRepository; + final IdentityUtils _identityUtils; - GetAllIdentitiesInteractor(this._identityRepository); + GetAllIdentitiesInteractor(this._identityRepository, this._identityUtils); Stream> execute(AccountId accountId, {Properties? properties}) async* { try { yield Right(GetAllIdentitiesLoading()); final identitiesResponse = await _identityRepository.getAllIdentities(accountId, properties: properties); + if (identitiesResponse.identities != null) { + _identityUtils.sortListIdentities(identitiesResponse.identities!); + } yield Right(GetAllIdentitiesSuccess(identitiesResponse.identities, identitiesResponse.state)); } catch (exception) { yield Left(GetAllIdentitiesFailure(exception));