TF-1625 Get capability supported for Identity/set method

(cherry picked from commit 16a77edba891a628b728d05ddd3a61c9ba45b8dc)
This commit is contained in:
dab246
2023-03-21 16:34:09 +07:00
committed by Dat Vu
parent 2e96b87fc4
commit bb9dbb697a
18 changed files with 223 additions and 143 deletions
@@ -409,8 +409,9 @@ class ComposerController extends BaseController {
void _getAllIdentities() { void _getAllIdentities() {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null) { final session = mailboxDashBoardController.sessionCurrent;
consumeState(_getAllIdentitiesInteractor.execute(accountId)); if (accountId != null && session != null) {
consumeState(_getAllIdentitiesInteractor.execute(session, accountId));
} }
} }
@@ -253,8 +253,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void _getAllIdentities() { void _getAllIdentities() {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null) { final session = mailboxDashBoardController.sessionCurrent;
consumeState(_getAllIdentitiesInteractor.execute(accountId)); if (accountId != null && session != null) {
consumeState(_getAllIdentitiesInteractor.execute(session, accountId));
} }
} }
@@ -55,6 +55,7 @@ class IdentityCreatorController extends BaseController {
final bccOfIdentity = Rxn<EmailAddress>(); final bccOfIdentity = Rxn<EmailAddress>();
final actionType = IdentityActionType.create.obs; final actionType = IdentityActionType.create.obs;
final isDefaultIdentity = RxBool(false); final isDefaultIdentity = RxBool(false);
final isDefaultIdentitySupported = RxBool(false);
late RichTextController keyboardRichTextController; late RichTextController keyboardRichTextController;
late RichTextWebController richTextWebController; late RichTextWebController richTextWebController;
@@ -120,6 +121,7 @@ class IdentityCreatorController extends BaseController {
userProfile = arguments!.userProfile; userProfile = arguments!.userProfile;
identity = arguments!.identity; identity = arguments!.identity;
actionType.value = arguments!.actionType; actionType.value = arguments!.actionType;
_checkDefaultIdentityIsSupported();
_setUpValueFromIdentity(); _setUpValueFromIdentity();
_getAllIdentities(); _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() { void _setUpValueFromIdentity() {
_nameIdentity = identity?.name ?? ''; _nameIdentity = identity?.name ?? '';
inputNameIdentityController?.text = identity?.name ?? ''; inputNameIdentityController?.text = identity?.name ?? '';
@@ -160,21 +168,12 @@ class IdentityCreatorController extends BaseController {
} }
void _getAllIdentities() { void _getAllIdentities() {
log('IdentityCreatorController::_getAllIdentities() '); if (accountId != null && session != null) {
if (accountId != null) { final propertiesRequired = isDefaultIdentitySupported.isTrue
try { ? Properties({'email', 'sortOrder'})
requireCapability(session!, accountId!, [CapabilityIdentifier.jamesSortOrder]); : Properties({'email'});
consumeState(_getAllIdentitiesInteractor.execute(
accountId!, consumeState(_getAllIdentitiesInteractor.execute(session!, accountId!, properties: propertiesRequired));
properties: Properties({'email', 'sortOrder'})
));
} catch (e) {
logError('IdentityCreatorController::_getAllIdentities(): exception: $e');
consumeState(_getAllIdentitiesInteractor.execute(
accountId!,
properties: Properties({'email'})
));
}
} }
} }
@@ -187,7 +186,10 @@ class IdentityCreatorController extends BaseController {
listEmailAddressOfReplyTo.add(noneEmailAddress); listEmailAddressOfReplyTo.add(noneEmailAddress);
listEmailAddressOfReplyTo.addAll(listEmailAddressDefault); listEmailAddressOfReplyTo.addAll(listEmailAddressDefault);
_setUpAllFieldEmailAddress(); _setUpAllFieldEmailAddress();
_setUpDefaultIdentity(success.identities);
if (isDefaultIdentitySupported.isTrue) {
_setUpDefaultIdentity(success.identities);
}
} else { } else {
_setDefaultEmailAddressList(); _setDefaultEmailAddressList();
} }
@@ -319,9 +321,9 @@ class IdentityCreatorController extends BaseController {
? {replyToOfIdentity.value!} ? {replyToOfIdentity.value!}
: <EmailAddress>{}; : <EmailAddress>{};
final sortOrder = isDefaultIdentity.value final sortOrder = isDefaultIdentitySupported.isTrue
? UnsignedInt(0) ? UnsignedInt(isDefaultIdentity.value ? 0 : 100)
: UnsignedInt(100); : null;
final newIdentity = Identity( final newIdentity = Identity(
name: _nameIdentity, name: _nameIdentity,
@@ -271,13 +271,20 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
child: _buildSignatureHtmlTemplate(context), child: _buildSignatureHtmlTemplate(context),
), ),
if (_responsiveUtils.isTablet(context) || _responsiveUtils.isMobile(context))...[ if (_responsiveUtils.isTablet(context) || _responsiveUtils.isMobile(context))...[
Obx(() => Padding( Obx(() {
padding: const EdgeInsets.only(top: 27), if (controller.isDefaultIdentitySupported.isTrue) {
child: SetDefaultIdentityCheckboxBuilder( return Padding(
imagePaths: _imagePaths, padding: const EdgeInsets.only(top: 27),
isCheck: controller.isDefaultIdentity.value, child: SetDefaultIdentityCheckboxBuilder(
onCheckboxChanged: controller.onCheckboxChanged), imagePaths: _imagePaths,
)), isCheck: controller.isDefaultIdentity.value,
onCheckboxChanged: controller.onCheckboxChanged
)
);
} else {
return const SizedBox.shrink();
}
}),
const SizedBox(height: 24), const SizedBox(height: 24),
Container( Container(
alignment: Alignment.center, alignment: Alignment.center,
@@ -467,10 +474,15 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
return Row( return Row(
children: [ children: [
Obx(() { Obx(() {
return SetDefaultIdentityCheckboxBuilder( if (controller.isDefaultIdentitySupported.isTrue) {
imagePaths: _imagePaths, return SetDefaultIdentityCheckboxBuilder(
isCheck: controller.isDefaultIdentity.value, imagePaths: _imagePaths,
onCheckboxChanged: controller.onCheckboxChanged); isCheck: controller.isDefaultIdentity.value,
onCheckboxChanged: controller.onCheckboxChanged
);
} else {
return const SizedBox.shrink();
}
}), }),
Expanded( Expanded(
child: Padding( child: Padding(
@@ -1,16 +1,17 @@
import 'package:jmap_dart_client/jmap/account_id.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/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/identities/identity.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/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/edit_identity_request.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
abstract class IdentityDataSource { abstract class IdentityDataSource {
Future<IdentitiesResponse> getAllIdentities(AccountId accountId, {Properties? properties}); Future<IdentitiesResponse> getAllIdentities(Session session, AccountId accountId, {Properties? properties});
Future<Identity> createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest); Future<Identity> createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest);
Future<bool> deleteIdentity(AccountId accountId, IdentityId identityId); Future<bool> deleteIdentity(Session session, AccountId accountId, IdentityId identityId);
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest); Future<bool> editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest);
} }
@@ -1,5 +1,6 @@
import 'package:jmap_dart_client/jmap/account_id.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/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/identities/identity.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/datasource/identity_data_source.dart';
import 'package:tmail_ui_user/features/manage_account/data/network/identity_api.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); IdentityDataSourceImpl(this._identityAPI, this._exceptionThrower);
@override @override
Future<IdentitiesResponse> getAllIdentities(AccountId accountId, Future<IdentitiesResponse> getAllIdentities(Session session, AccountId accountId, {Properties? properties}) {
{Properties? properties}) {
return Future.sync(() async { return Future.sync(() async {
return await _identityAPI.getAllIdentities(accountId, properties: properties); return await _identityAPI.getAllIdentities(session, accountId, properties: properties);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<Identity> createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) { Future<Identity> createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest) {
return Future.sync(() async { return Future.sync(() async {
return await _identityAPI.createNewIdentity(accountId, identityRequest); return await _identityAPI.createNewIdentity(session, accountId, identityRequest);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<bool> deleteIdentity(AccountId accountId, IdentityId identityId) { Future<bool> deleteIdentity(Session session, AccountId accountId, IdentityId identityId) {
return Future.sync(() async { return Future.sync(() async {
return await _identityAPI.deleteIdentity(accountId, identityId); return await _identityAPI.deleteIdentity(session, accountId, identityId);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) { Future<bool> editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest) {
return Future.sync(() async { return Future.sync(() async {
return await _identityAPI.editIdentity(accountId, editIdentityRequest); return await _identityAPI.editIdentity(session, accountId, editIdentityRequest);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
} }
@@ -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_method.dart';
import 'package:jmap_dart_client/jmap/identities/set/set_identity_response.dart'; import 'package:jmap_dart_client/jmap/identities/set/set_identity_response.dart';
import 'package:jmap_dart_client/jmap/jmap_request.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_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/create_new_identity_request.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_default_identity_request.dart';
@@ -31,7 +31,9 @@ class IdentityAPI {
if (properties != null) { if (properties != null) {
getIdentityMethod.addProperties(properties); getIdentityMethod.addProperties(properties);
} }
final capabilitySupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId)
final jamesSortOrderIsSupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId);
final capabilitySupported = jamesSortOrderIsSupported
? getIdentityMethod.requiredCapabilitiesSupportSortOrder ? getIdentityMethod.requiredCapabilitiesSupportSortOrder
: getIdentityMethod.requiredCapabilities; : getIdentityMethod.requiredCapabilities;
@@ -49,14 +51,22 @@ class IdentityAPI {
return IdentitiesResponse(identities: response?.list, state: response?.state); return IdentitiesResponse(identities: response?.list, state: response?.state);
} }
Future<Identity> createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) async { Future<Identity> createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest) async {
final setIdentityMethod = SetIdentityMethod(accountId) final setIdentityMethod = SetIdentityMethod(accountId)
..addCreate(identityRequest.creationId, identityRequest.newIdentity); ..addCreate(identityRequest.creationId, identityRequest.newIdentity);
var capabilities = setIdentityMethod.requiredCapabilities; final jamesSortOrderIsSupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId);
if (identityRequest is CreateNewDefaultIdentityRequest) { final capabilitySupported = jamesSortOrderIsSupported
capabilities = setIdentityMethod.requiredCapabilitiesSupportSortOrder; ? setIdentityMethod.requiredCapabilitiesSupportSortOrder
_addUpdatesToCreateDefaultIdentityMethod(setIdentityMethod, identityRequest); : setIdentityMethod.requiredCapabilities;
if (jamesSortOrderIsSupported &&
identityRequest is CreateNewDefaultIdentityRequest &&
identityRequest.oldDefaultIdentityIds != null
) {
setIdentityMethod.addUpdates(
identityRequest.oldDefaultIdentityIds!.generateMapUpdateObjectSortOrder(sortOrder: UnsignedInt(100))
);
} }
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
@@ -64,7 +74,7 @@ class IdentityAPI {
final setIdentityInvocation = requestBuilder.invocation(setIdentityMethod); final setIdentityInvocation = requestBuilder.invocation(setIdentityMethod);
final response = await (requestBuilder final response = await (requestBuilder
..usings(capabilities)) ..usings(capabilitySupported))
.build() .build()
.execute(); .execute();
@@ -75,27 +85,21 @@ class IdentityAPI {
return setIdentityResponse!.created![identityRequest.creationId]!; return setIdentityResponse!.created![identityRequest.creationId]!;
} }
void _addUpdatesToCreateDefaultIdentityMethod( Future<bool> deleteIdentity(Session session, AccountId accountId, IdentityId identityId) async {
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<bool> deleteIdentity(AccountId accountId, IdentityId identityId) async {
final setIdentityMethod = SetIdentityMethod(accountId) final setIdentityMethod = SetIdentityMethod(accountId)
..addDestroy({identityId.id}); ..addDestroy({identityId.id});
final jamesSortOrderIsSupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId);
final capabilitySupported = jamesSortOrderIsSupported
? setIdentityMethod.requiredCapabilitiesSupportSortOrder
: setIdentityMethod.requiredCapabilities;
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
final setIdentityInvocation = requestBuilder.invocation(setIdentityMethod); final setIdentityInvocation = requestBuilder.invocation(setIdentityMethod);
final response = await (requestBuilder final response = await (requestBuilder
..usings(setIdentityMethod.requiredCapabilities)) ..usings(capabilitySupported))
.build() .build()
.execute(); .execute();
@@ -106,21 +110,24 @@ class IdentityAPI {
return setIdentityResponse?.destroyed?.contains(identityId.id) == true; return setIdentityResponse?.destroyed?.contains(identityId.id) == true;
} }
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) async { Future<bool> editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest) async {
final setIdentityMethod = SetIdentityMethod(accountId) final setIdentityMethod = SetIdentityMethod(accountId)
..addUpdates({ ..addUpdates({
editIdentityRequest.identityId.id : PatchObject(editIdentityRequest.identityRequest.toJson()) editIdentityRequest.identityId.id : PatchObject(editIdentityRequest.identityRequest.toJson())
}); });
var capabilities = setIdentityMethod.requiredCapabilities; final jamesSortOrderIsSupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId);
final capabilitySupported = jamesSortOrderIsSupported
? setIdentityMethod.requiredCapabilitiesSupportSortOrder
: setIdentityMethod.requiredCapabilities;
if (editIdentityRequest is EditDefaultIdentityRequest) { if (jamesSortOrderIsSupported &&
for (var identityId in editIdentityRequest.oldDefaultIdentityIds ?? []) { editIdentityRequest is EditDefaultIdentityRequest &&
setIdentityMethod.addUpdates({ editIdentityRequest.oldDefaultIdentityIds != null
identityId.id: PatchObject(IdentityRequestDto(sortOrder: UnsignedInt(100)).toJson()) ) {
}); setIdentityMethod.addUpdates(
} editIdentityRequest.oldDefaultIdentityIds!.generateMapUpdateObjectSortOrder(sortOrder: UnsignedInt(100))
capabilities = setIdentityMethod.requiredCapabilitiesSupportSortOrder; );
} }
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
@@ -128,7 +135,7 @@ class IdentityAPI {
final setIdentityInvocation = requestBuilder.invocation(setIdentityMethod); final setIdentityInvocation = requestBuilder.invocation(setIdentityMethod);
final response = await (requestBuilder final response = await (requestBuilder
..usings(capabilities)) ..usings(capabilitySupported))
.build() .build()
.execute(); .execute();
@@ -1,6 +1,7 @@
import 'package:jmap_dart_client/jmap/account_id.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/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/identities/identity.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/datasource/identity_data_source.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/create_new_identity_request.dart';
@@ -15,22 +16,22 @@ class IdentityRepositoryImpl extends IdentityRepository {
IdentityRepositoryImpl(this._dataSource); IdentityRepositoryImpl(this._dataSource);
@override @override
Future<IdentitiesResponse> getAllIdentities(AccountId accountId, {Properties? properties}) { Future<IdentitiesResponse> getAllIdentities(Session session, AccountId accountId, {Properties? properties}) {
return _dataSource.getAllIdentities(accountId, properties: properties); return _dataSource.getAllIdentities(session, accountId, properties: properties);
} }
@override @override
Future<Identity> createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) { Future<Identity> createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest) {
return _dataSource.createNewIdentity(accountId, identityRequest); return _dataSource.createNewIdentity(session, accountId, identityRequest);
} }
@override @override
Future<bool> deleteIdentity(AccountId accountId, IdentityId identityId) { Future<bool> deleteIdentity(Session session, AccountId accountId, IdentityId identityId) {
return _dataSource.deleteIdentity(accountId, identityId); return _dataSource.deleteIdentity(session, accountId, identityId);
} }
@override @override
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) { Future<bool> editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest) {
return _dataSource.editIdentity(accountId, editIdentityRequest); return _dataSource.editIdentity(session, accountId, editIdentityRequest);
} }
} }
@@ -1,16 +1,17 @@
import 'package:jmap_dart_client/jmap/account_id.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/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/identities/identity.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/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/edit_identity_request.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
abstract class IdentityRepository { abstract class IdentityRepository {
Future<IdentitiesResponse> getAllIdentities(AccountId accountId, {Properties? properties}); Future<IdentitiesResponse> getAllIdentities(Session session, AccountId accountId, {Properties? properties});
Future<Identity> createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest); Future<Identity> createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest);
Future<bool> deleteIdentity(AccountId accountId, IdentityId identityId); Future<bool> deleteIdentity(Session session, AccountId accountId, IdentityId identityId);
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest); Future<bool> editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest);
} }
@@ -1,9 +1,11 @@
import 'dart:core'; 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:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/identities/identity.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_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/create_new_identity_request.dart';
@@ -19,26 +21,31 @@ class CreateNewDefaultIdentityInteractor {
this._identityRepository, this._identityRepository,
this._identityUtils); this._identityUtils);
Stream<Either<Failure, Success>> execute(AccountId accountId, CreateNewIdentityRequest identityRequest) async* { Stream<Either<Failure, Success>> execute(
Session session,
AccountId accountId,
CreateNewIdentityRequest identityRequest
) async* {
try { try {
yield Right(CreateNewDefaultIdentityLoading()); yield Right(CreateNewDefaultIdentityLoading());
final listDefaultIdentities = await _getDefaultIdentities(accountId); final listDefaultIdentities = await _getDefaultIdentities(session, accountId);
final defaultRequest = _createNewIdentityDefault(identityRequest, listDefaultIdentities); final defaultRequest = _createNewIdentityDefault(identityRequest, listDefaultIdentities);
final newIdentity = await _identityRepository.createNewIdentity(accountId, defaultRequest); final newIdentity = await _identityRepository.createNewIdentity(session, accountId, defaultRequest);
yield Right(CreateNewDefaultIdentitySuccess(newIdentity)); yield Right(CreateNewDefaultIdentitySuccess(newIdentity));
} catch (exception) { } catch (exception) {
yield Left(CreateNewDefaultIdentityFailure(exception)); yield Left(CreateNewDefaultIdentityFailure(exception));
} }
} }
Future<List<Identity>?> _getDefaultIdentities(AccountId accountId) async { Future<List<Identity>?> _getDefaultIdentities(Session session, AccountId accountId) async {
final listIdentities = await _identityRepository final listIdentities = await _identityRepository
.getAllIdentities( .getAllIdentities(
accountId, session,
properties: Properties({'sortOrder', 'mayDelete'}) accountId,
); properties: Properties({'sortOrder', 'mayDelete'})
);
listIdentities.identities?.removeWhere(_isIdentityUnDeletable); listIdentities.identities?.removeWhere(_isIdentityUnDeletable);
return _identityUtils.getSmallestOrderedIdentity(listIdentities.identities); return _identityUtils.getSmallestOrderedIdentity(listIdentities.identities);
} }
@@ -3,6 +3,7 @@ import 'dart:core';
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/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/repository/identity_repository.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_identity_state.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); CreateNewIdentityInteractor(this._identityRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, CreateNewIdentityRequest identityRequest) async* { Stream<Either<Failure, Success>> execute(
Session session,
AccountId accountId,
CreateNewIdentityRequest identityRequest
) async* {
try { try {
yield Right(CreateNewIdentityLoading()); yield Right(CreateNewIdentityLoading());
final newIdentity = await _identityRepository.createNewIdentity(accountId, identityRequest); final newIdentity = await _identityRepository.createNewIdentity(session, accountId, identityRequest);
yield Right(CreateNewIdentitySuccess(newIdentity)); yield Right(CreateNewIdentitySuccess(newIdentity));
} catch (exception) { } catch (exception) {
yield Left(CreateNewIdentityFailure(exception)); yield Left(CreateNewIdentityFailure(exception));
@@ -1,8 +1,10 @@
import 'dart:core'; 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:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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: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/repository/identity_repository.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/delete_identity_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/delete_identity_state.dart';
@@ -12,10 +14,14 @@ class DeleteIdentityInteractor {
DeleteIdentityInteractor(this._identityRepository); DeleteIdentityInteractor(this._identityRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, IdentityId identityId) async* { Stream<Either<Failure, Success>> execute(
Session session,
AccountId accountId,
IdentityId identityId
) async* {
try { try {
yield Right(DeleteIdentityLoading()); 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)); yield result ? Right(DeleteIdentitySuccess()) : Left(DeleteIdentityFailure(null));
} catch (exception) { } catch (exception) {
yield Left(DeleteIdentityFailure(exception)); yield Left(DeleteIdentityFailure(exception));
@@ -4,6 +4,7 @@ import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/identities/identity.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_default_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/edit_identity_request.dart';
@@ -21,13 +22,14 @@ class EditDefaultIdentityInteractor {
); );
Stream<Either<Failure, Success>> execute( Stream<Either<Failure, Success>> execute(
AccountId accountId, Session session,
EditIdentityRequest editIdentityRequest AccountId accountId,
EditIdentityRequest editIdentityRequest
) async* { ) async* {
try { try {
yield Right(EditDefaultIdentityLoading()); yield Right(EditDefaultIdentityLoading());
final defaultIdentities = await _getDefaultIdentities(accountId); final defaultIdentities = await _getDefaultIdentities(session, accountId);
_removeEditIdentityFromDefaultIdentities(defaultIdentities, editIdentityRequest.identityId); _removeEditIdentityFromDefaultIdentities(defaultIdentities, editIdentityRequest.identityId);
final editDefaultRequest = EditDefaultIdentityRequest( final editDefaultRequest = EditDefaultIdentityRequest(
@@ -38,19 +40,20 @@ class EditDefaultIdentityInteractor {
?.map((identity) => identity.id!) ?.map((identity) => identity.id!)
.toList()); .toList());
final result = await _identityRepository.editIdentity(accountId, editDefaultRequest); final result = await _identityRepository.editIdentity(session, accountId, editDefaultRequest);
yield result ? Right(EditDefaultIdentitySuccess()) : Left(EditDefaultIdentityFailure(null)); yield result ? Right(EditDefaultIdentitySuccess()) : Left(EditDefaultIdentityFailure(null));
} catch (exception) { } catch (exception) {
yield Left(EditDefaultIdentityFailure(exception)); yield Left(EditDefaultIdentityFailure(exception));
} }
} }
Future<List<Identity>?> _getDefaultIdentities(AccountId accountId) async { Future<List<Identity>?> _getDefaultIdentities(Session session, AccountId accountId) async {
final listIdentities = await _identityRepository final listIdentities = await _identityRepository
.getAllIdentities( .getAllIdentities(
accountId, session,
properties: Properties({'sortOrder'}) accountId,
); properties: Properties({'sortOrder'})
);
return _identityUtils return _identityUtils
.getSmallestOrderedIdentity(listIdentities.identities) .getSmallestOrderedIdentity(listIdentities.identities)
?.toList(); ?.toList();
@@ -1,8 +1,10 @@
import 'dart:core'; 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:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/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/repository/identity_repository.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/edit_identity_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/edit_identity_state.dart';
@@ -13,12 +15,13 @@ class EditIdentityInteractor {
EditIdentityInteractor(this._identityRepository); EditIdentityInteractor(this._identityRepository);
Stream<Either<Failure, Success>> execute( Stream<Either<Failure, Success>> execute(
AccountId accountId, Session session,
EditIdentityRequest editIdentityRequest AccountId accountId,
EditIdentityRequest editIdentityRequest
) async* { ) async* {
try { try {
yield Right(EditIdentityLoading()); 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)); yield result ? Right(EditIdentitySuccess()) : Left(EditIdentityFailure(null));
} catch (exception) { } catch (exception) {
yield Left(EditIdentityFailure(exception)); yield Left(EditIdentityFailure(exception));
@@ -1,12 +1,16 @@
import 'dart:core'; 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:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/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/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/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/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart';
class GetAllIdentitiesInteractor { class GetAllIdentitiesInteractor {
final IdentityRepository _identityRepository; final IdentityRepository _identityRepository;
@@ -14,11 +18,12 @@ class GetAllIdentitiesInteractor {
GetAllIdentitiesInteractor(this._identityRepository, this._identityUtils); GetAllIdentitiesInteractor(this._identityRepository, this._identityUtils);
Stream<Either<Failure, Success>> execute(AccountId accountId, {Properties? properties}) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, {Properties? properties}) async* {
try { try {
yield Right<Failure, Success>(GetAllIdentitiesLoading()); yield Right<Failure, Success>(GetAllIdentitiesLoading());
final identitiesResponse = await _identityRepository.getAllIdentities(accountId, properties: properties); final identitiesResponse = await _identityRepository.getAllIdentities(session, accountId, properties: properties);
if (identitiesResponse.identities != null) { final sortOrderIsSupported = [CapabilityIdentifier.jamesSortOrder].isSupported(session, accountId);
if (sortOrderIsSupported && identitiesResponse.identities != null) {
_identityUtils.sortListIdentities(identitiesResponse.identities!); _identityUtils.sortListIdentities(identitiesResponse.identities!);
} }
yield Right(GetAllIdentitiesSuccess(identitiesResponse.identities, identitiesResponse.state)); yield Right(GetAllIdentitiesSuccess(identitiesResponse.identities, identitiesResponse.state));
@@ -9,6 +9,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.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:jmap_dart_client/jmap/identities/identity.dart';
import 'package:tmail_ui_user/features/base/base_controller.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'; import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart';
@@ -100,7 +101,10 @@ class IdentitiesController extends BaseController {
void _initWorker() { void _initWorker() {
accountIdWorker = ever(_accountDashBoardController.accountId, (accountId) { accountIdWorker = ever(_accountDashBoardController.accountId, (accountId) {
if (accountId is 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(); accountIdWorker.call();
} }
void _getAllIdentities(AccountId accountId) { void _getAllIdentities(Session session, AccountId accountId) {
consumeState(_getAllIdentitiesInteractor.execute(accountId)); consumeState(_getAllIdentitiesInteractor.execute(session, accountId));
} }
void _refreshAllIdentities() { void _refreshAllIdentities() {
@@ -122,8 +126,9 @@ class IdentitiesController extends BaseController {
listAllIdentities.clear(); listAllIdentities.clear();
final accountId = _accountDashBoardController.accountId.value; final accountId = _accountDashBoardController.accountId.value;
if (accountId != null) { final session = _accountDashBoardController.sessionCurrent.value;
_getAllIdentities(accountId); if (accountId != null && session != null) {
_getAllIdentities(session, accountId);
} }
} }
@@ -157,9 +162,9 @@ class IdentitiesController extends BaseController {
arguments: arguments, arguments: arguments,
onCreatedIdentity: (arguments) { onCreatedIdentity: (arguments) {
if (arguments is CreateNewIdentityRequest) { if (arguments is CreateNewIdentityRequest) {
_createNewIdentityAction(accountId, arguments); _createNewIdentityAction(session, accountId, arguments);
} else if (arguments is EditIdentityRequest) { } else if (arguments is EditIdentityRequest) {
_editIdentityAction(accountId, arguments); _editIdentityAction(session, accountId, arguments);
} }
}); });
} else { } else {
@@ -168,22 +173,23 @@ class IdentitiesController extends BaseController {
arguments: arguments); arguments: arguments);
if (newIdentityArguments is CreateNewIdentityRequest) { if (newIdentityArguments is CreateNewIdentityRequest) {
_createNewIdentityAction(accountId, newIdentityArguments); _createNewIdentityAction(session, accountId, newIdentityArguments);
} else if (newIdentityArguments is EditIdentityRequest) { } else if (newIdentityArguments is EditIdentityRequest) {
_editIdentityAction(accountId, newIdentityArguments); _editIdentityAction(session, accountId, newIdentityArguments);
} }
} }
} }
} }
void _createNewIdentityAction( void _createNewIdentityAction(
Session session,
AccountId accountId, AccountId accountId,
CreateNewIdentityRequest identityRequest CreateNewIdentityRequest identityRequest
) async { ) async {
if (identityRequest.isDefaultIdentity) { if (identityRequest.isDefaultIdentity) {
consumeState(_createNewDefaultIdentityInteractor.execute(accountId, identityRequest)); consumeState(_createNewDefaultIdentityInteractor.execute(session, accountId, identityRequest));
} else { } else {
consumeState(_createNewIdentityInteractor.execute(accountId, identityRequest)); consumeState(_createNewIdentityInteractor.execute(session, accountId, identityRequest));
} }
} }
@@ -221,9 +227,10 @@ class IdentitiesController extends BaseController {
void _deleteIdentityAction(Identity identity) { void _deleteIdentityAction(Identity identity) {
popBack(); popBack();
final session = _accountDashBoardController.sessionCurrent.value;
final accountId = _accountDashBoardController.accountId.value; final accountId = _accountDashBoardController.accountId.value;
if (accountId != null && identity.id != null) { if (accountId != null && session != null && identity.id != null) {
consumeState(_deleteIdentityInteractor.execute(accountId, identity.id!)); consumeState(_deleteIdentityInteractor.execute(session, accountId, identity.id!));
} }
} }
@@ -280,9 +287,9 @@ class IdentitiesController extends BaseController {
arguments: arguments, arguments: arguments,
onCreatedIdentity: (arguments) { onCreatedIdentity: (arguments) {
if (arguments is CreateNewIdentityRequest) { if (arguments is CreateNewIdentityRequest) {
_createNewIdentityAction(accountId, arguments); _createNewIdentityAction(session, accountId, arguments);
} else if (arguments is EditIdentityRequest) { } else if (arguments is EditIdentityRequest) {
_editIdentityAction(accountId, arguments); _editIdentityAction(session, accountId, arguments);
} }
}); });
} else { } else {
@@ -291,22 +298,23 @@ class IdentitiesController extends BaseController {
arguments: arguments); arguments: arguments);
if (newIdentityArguments is CreateNewIdentityRequest) { if (newIdentityArguments is CreateNewIdentityRequest) {
_createNewIdentityAction(accountId, newIdentityArguments); _createNewIdentityAction(session, accountId, newIdentityArguments);
} else if (newIdentityArguments is EditIdentityRequest) { } else if (newIdentityArguments is EditIdentityRequest) {
_editIdentityAction(accountId, newIdentityArguments); _editIdentityAction(session, accountId, newIdentityArguments);
} }
} }
} }
} }
void _editIdentityAction( void _editIdentityAction(
Session session,
AccountId accountId, AccountId accountId,
EditIdentityRequest editIdentityRequest EditIdentityRequest editIdentityRequest
) async { ) async {
if (editIdentityRequest.isDefaultIdentity) { if (editIdentityRequest.isDefaultIdentity) {
consumeState(_editDefaultIdentityInteractor.execute(accountId, editIdentityRequest)); consumeState(_editDefaultIdentityInteractor.execute(session, accountId, editIdentityRequest));
} else { } else {
consumeState(_editIdentityInteractor.execute(accountId, editIdentityRequest)); consumeState(_editIdentityInteractor.execute(session, accountId, editIdentityRequest));
} }
} }
@@ -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<IdentityId> {
Map<Id, PatchObject> generateMapUpdateObjectSortOrder({UnsignedInt? sortOrder}) {
final Map<Id, PatchObject> maps = {};
forEach((identityId) {
maps[identityId.id] = PatchObject(IdentityRequestDto(sortOrder: sortOrder).toJson());
});
return maps;
}
}
+1
View File
@@ -54,6 +54,7 @@ export 'extensions/email_filter_condition_extension.dart';
export 'extensions/list_email_header_extension.dart'; export 'extensions/list_email_header_extension.dart';
export 'extensions/account_extension.dart'; export 'extensions/account_extension.dart';
export 'extensions/list_presentation_mailbox_extension.dart'; export 'extensions/list_presentation_mailbox_extension.dart';
export 'extensions/list_identity_id_extension.dart';
// Identity // Identity
export 'identity/identity_request_dto.dart'; export 'identity/identity_request_dto.dart';
export 'mailbox/expand_mode.dart'; export 'mailbox/expand_mode.dart';