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() {
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));
}
}
@@ -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));
}
}
@@ -55,6 +55,7 @@ class IdentityCreatorController extends BaseController {
final bccOfIdentity = Rxn<EmailAddress>();
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!}
: <EmailAddress>{};
final sortOrder = isDefaultIdentity.value
? UnsignedInt(0)
: UnsignedInt(100);
final sortOrder = isDefaultIdentitySupported.isTrue
? UnsignedInt(isDefaultIdentity.value ? 0 : 100)
: null;
final newIdentity = Identity(
name: _nameIdentity,
@@ -271,13 +271,20 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
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<IdentityCreatorController> {
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(
@@ -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<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/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<IdentitiesResponse> getAllIdentities(AccountId accountId,
{Properties? properties}) {
Future<IdentitiesResponse> 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<Identity> createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) {
Future<Identity> 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<bool> deleteIdentity(AccountId accountId, IdentityId identityId) {
Future<bool> 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<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) {
Future<bool> 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);
}
}
@@ -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<Identity> createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) async {
Future<Identity> 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<bool> deleteIdentity(AccountId accountId, IdentityId identityId) async {
Future<bool> 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<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) async {
Future<bool> 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();
@@ -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<IdentitiesResponse> getAllIdentities(AccountId accountId, {Properties? properties}) {
return _dataSource.getAllIdentities(accountId, properties: properties);
Future<IdentitiesResponse> getAllIdentities(Session session, AccountId accountId, {Properties? properties}) {
return _dataSource.getAllIdentities(session, accountId, properties: properties);
}
@override
Future<Identity> createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) {
return _dataSource.createNewIdentity(accountId, identityRequest);
Future<Identity> createNewIdentity(Session session, AccountId accountId, CreateNewIdentityRequest identityRequest) {
return _dataSource.createNewIdentity(session, accountId, identityRequest);
}
@override
Future<bool> deleteIdentity(AccountId accountId, IdentityId identityId) {
return _dataSource.deleteIdentity(accountId, identityId);
Future<bool> deleteIdentity(Session session, AccountId accountId, IdentityId identityId) {
return _dataSource.deleteIdentity(session, accountId, identityId);
}
@override
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) {
return _dataSource.editIdentity(accountId, editIdentityRequest);
Future<bool> editIdentity(Session session, AccountId accountId, EditIdentityRequest 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/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<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 '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<Either<Failure, Success>> execute(AccountId accountId, CreateNewIdentityRequest identityRequest) async* {
Stream<Either<Failure, Success>> 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<List<Identity>?> _getDefaultIdentities(AccountId accountId) async {
Future<List<Identity>?> _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);
}
@@ -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<Either<Failure, Success>> execute(AccountId accountId, CreateNewIdentityRequest identityRequest) async* {
Stream<Either<Failure, Success>> 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));
@@ -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<Either<Failure, Success>> execute(AccountId accountId, IdentityId identityId) async* {
Stream<Either<Failure, Success>> 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));
@@ -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<Either<Failure, Success>> 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<List<Identity>?> _getDefaultIdentities(AccountId accountId) async {
Future<List<Identity>?> _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();
@@ -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<Either<Failure, Success>> 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));
@@ -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<Either<Failure, Success>> execute(AccountId accountId, {Properties? properties}) async* {
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, {Properties? properties}) async* {
try {
yield Right<Failure, Success>(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));
@@ -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));
}
}
@@ -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/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';