TF-1705 Auto create default folder if missing on server CYRUS
Signed-off-by: dab246 <tdvu@linagora.com> (cherry picked from commit 1a5bad168cddf07662f4c682189840bc8c4bdcef)
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/error/set_error.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/method/response/set_response.dart';
|
||||
import 'package:model/error_type_handler/set_method_error_handler_mixin.dart';
|
||||
|
||||
mixin HandleSetErrorMixin {
|
||||
@@ -53,4 +55,26 @@ mixin HandleSetErrorMixin {
|
||||
unCatchErrorHandler?.call(remainedError);
|
||||
}
|
||||
}
|
||||
|
||||
List<MapEntry<Id, SetError>> handleSetResponse(List<SetResponse?> listSetResponse) {
|
||||
final listSetResponseNotNull = listSetResponse.whereNotNull().toList();
|
||||
if (listSetResponseNotNull.isEmpty) {
|
||||
return [];
|
||||
}
|
||||
|
||||
final List<MapEntry<Id, SetError>> remainedErrors = [];
|
||||
for (var response in listSetResponseNotNull) {
|
||||
handleSetErrors(
|
||||
notDestroyedError: response.notDestroyed,
|
||||
notUpdatedError: response.notUpdated,
|
||||
notCreatedError: response.notCreated,
|
||||
unCatchErrorHandler: (setErrorEntry) {
|
||||
remainedErrors.add(setErrorEntry);
|
||||
return false;
|
||||
}
|
||||
);
|
||||
}
|
||||
logError('HandleSetErrorMixin::handleSetResponse():remainedErrors: $remainedErrors');
|
||||
return remainedErrors;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
@@ -12,10 +11,8 @@ import 'package:jmap_dart_client/http/http_client.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/capability/core_capability.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/error/set_error.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/method/response/set_response.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/patch_object.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/reference_id.dart';
|
||||
@@ -207,7 +204,7 @@ class EmailAPI with HandleSetErrorMixin {
|
||||
}
|
||||
|
||||
final emailCreated = setEmailResponse?.created?[idCreateMethod];
|
||||
final listEntriesErrors = _handleSetEmailResponse([
|
||||
final listEntriesErrors = handleSetResponse([
|
||||
setEmailResponse,
|
||||
setEmailSubmissionResponse,
|
||||
markAsAnsweredOrForwardedSetResponse
|
||||
@@ -221,27 +218,6 @@ class EmailAPI with HandleSetErrorMixin {
|
||||
}
|
||||
}
|
||||
|
||||
List<MapEntry<Id, SetError>> _handleSetEmailResponse(List<SetResponse?> listSetResponse) {
|
||||
final listSetResponseNotNull = listSetResponse.whereNotNull().toList();
|
||||
if (listSetResponseNotNull.isEmpty) {
|
||||
return [];
|
||||
}
|
||||
|
||||
final List<MapEntry<Id, SetError>> remainedErrors = [];
|
||||
for (var response in listSetResponseNotNull) {
|
||||
handleSetErrors(
|
||||
notDestroyedError: response.notDestroyed,
|
||||
notUpdatedError: response.notUpdated,
|
||||
notCreatedError: response.notCreated,
|
||||
unCatchErrorHandler: (setErrorEntry) {
|
||||
remainedErrors.add(setErrorEntry);
|
||||
return false;
|
||||
}
|
||||
);
|
||||
}
|
||||
return remainedErrors;
|
||||
}
|
||||
|
||||
Future<List<Email>> markAsRead(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
@@ -507,7 +483,7 @@ class EmailAPI with HandleSetErrorMixin {
|
||||
);
|
||||
|
||||
final emailCreated = setEmailResponse?.created?[idCreateMethod];
|
||||
final listEntriesErrors = _handleSetEmailResponse([setEmailResponse]);
|
||||
final listEntriesErrors = handleSetResponse([setEmailResponse]);
|
||||
final mapErrors = Map.fromEntries(listEntriesErrors);
|
||||
|
||||
if (emailCreated != null && mapErrors.isEmpty) {
|
||||
@@ -574,7 +550,7 @@ class EmailAPI with HandleSetErrorMixin {
|
||||
|
||||
final emailUpdated = setEmailResponse?.created?[idCreateMethod];
|
||||
final isEmailDeleted = setEmailResponse?.destroyed?.contains(oldEmailId.id);
|
||||
final listEntriesErrors = _handleSetEmailResponse([setEmailResponse]);
|
||||
final listEntriesErrors = handleSetResponse([setEmailResponse]);
|
||||
final mapErrors = Map.fromEntries(listEntriesErrors);
|
||||
|
||||
if (emailUpdated != null && isEmailDeleted == true && mapErrors.isEmpty) {
|
||||
|
||||
@@ -47,4 +47,8 @@ abstract class MailboxDataSource {
|
||||
Future<bool> subscribeMailbox(Session session, AccountId accountId, SubscribeMailboxRequest request);
|
||||
|
||||
Future<List<MailboxId>> subscribeMultipleMailbox(Session session, AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest);
|
||||
|
||||
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
|
||||
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
|
||||
}
|
||||
@@ -94,4 +94,14 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource {
|
||||
Future<List<MailboxId>> subscribeMultipleMailbox(Session session, AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest) {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole) {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
@@ -118,4 +118,18 @@ class MailboxDataSourceImpl extends MailboxDataSource {
|
||||
return await mailboxAPI.subscribeMultipleMailbox(session, accountId, subscribeRequest);
|
||||
}).catchError(_exceptionThrower.throwException);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole) {
|
||||
return Future.sync(() async {
|
||||
return await mailboxAPI.createDefaultMailbox(session, accountId, listRole);
|
||||
}).catchError(_exceptionThrower.throwException);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
||||
return Future.sync(() async {
|
||||
return await mailboxAPI.setRoleDefaultMailbox(session, accountId, listMailbox);
|
||||
}).catchError(_exceptionThrower.throwException);
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,9 @@ import 'package:model/error_type_handler/set_method_error_handler_mixin.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/handle_error_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/exceptions/set_mailbox_method_exception.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/extensions/list_mailbox_id_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/extensions/role_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
|
||||
@@ -36,12 +38,14 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_reque
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
class MailboxAPI with HandleSetErrorMixin {
|
||||
|
||||
final HttpClient httpClient;
|
||||
final Uuid _uuid;
|
||||
|
||||
MailboxAPI(this.httpClient);
|
||||
MailboxAPI(this.httpClient, this._uuid);
|
||||
|
||||
Future<MailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties}) async {
|
||||
final processingInvocation = ProcessingInvocation();
|
||||
@@ -371,4 +375,127 @@ class MailboxAPI with HandleSetErrorMixin {
|
||||
log('MailboxAPI::subscribeMultipleMailbox():listMailboxIdSubscribe: $listMailboxIdSubscribe');
|
||||
return listMailboxIdSubscribe ?? [];
|
||||
}
|
||||
|
||||
Future<List<Mailbox>> createDefaultMailbox(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
List<Role> listRole
|
||||
) async {
|
||||
final mapId = {
|
||||
for (var role in listRole)
|
||||
Id(_uuid.v1()) : role
|
||||
};
|
||||
|
||||
final mapCreate = {
|
||||
for (var id in mapId.keys)
|
||||
id : Mailbox(name: MailboxName(mapId[id]!.mailboxName), isSubscribed: IsSubscribed(true))
|
||||
};
|
||||
|
||||
final setMailboxMethodForCreate = SetMailboxMethod(accountId)
|
||||
..addCreates(mapCreate);
|
||||
|
||||
final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation());
|
||||
final createInvocation = requestBuilder.invocation(setMailboxMethodForCreate);
|
||||
|
||||
final capabilities = setMailboxMethodForCreate.requiredCapabilities.toCapabilitiesSupportTeamMailboxes(session, accountId);
|
||||
|
||||
final response = await (requestBuilder
|
||||
..usings(capabilities))
|
||||
.build()
|
||||
.execute();
|
||||
|
||||
final createResponse = response.parse<SetMailboxResponse>(
|
||||
createInvocation.methodCallId,
|
||||
SetMailboxResponse.deserialize
|
||||
);
|
||||
|
||||
final listEntriesErrors = handleSetResponse([createResponse]);
|
||||
final mapErrors = Map.fromEntries(listEntriesErrors);
|
||||
|
||||
if (mapErrors.isNotEmpty) {
|
||||
throw SetMailboxMethodException(mapErrors);
|
||||
} else {
|
||||
final mapMailboxCreated = createResponse?.created ?? <Id, Mailbox>{};
|
||||
log('MailboxAPI::createDefaultMailbox:mapMailboxCreated: $mapMailboxCreated');
|
||||
final listMailboxCreated = _convertMapToListMailbox(
|
||||
mapRoles: mapId,
|
||||
mapMailboxName: mapCreate,
|
||||
mapMailboxCreated: mapMailboxCreated
|
||||
);
|
||||
log('MailboxAPI::createDefaultMailbox:listMailboxCreated: ${listMailboxCreated.length}');
|
||||
if (listMailboxCreated.isEmpty) {
|
||||
throw NotFoundMailboxCreatedException();
|
||||
} else {
|
||||
return listMailboxCreated;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<Mailbox> _convertMapToListMailbox({
|
||||
required Map<Id, Role> mapRoles,
|
||||
required Map<Id, Mailbox> mapMailboxName,
|
||||
required Map<Id, Mailbox> mapMailboxCreated
|
||||
}) {
|
||||
return mapRoles.keys
|
||||
.where((key) => mapMailboxCreated.containsKey(key))
|
||||
.map((key) {
|
||||
final mailboxName = mapMailboxName[key]?.name;
|
||||
final mailboxRole = mapRoles[key];
|
||||
if (mailboxName != null && mailboxRole != null) {
|
||||
return mapMailboxCreated[key]?.toMailbox(
|
||||
mailboxName,
|
||||
mailboxRole: mailboxRole
|
||||
);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
})
|
||||
.whereNotNull()
|
||||
.toList();
|
||||
}
|
||||
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
List<Mailbox> listMailbox
|
||||
) async {
|
||||
final mapUpdated = {
|
||||
for (var mailbox in listMailbox)
|
||||
mailbox.id!.id: PatchObject({'role': mailbox.role!.value})
|
||||
};
|
||||
|
||||
final setMailboxMethodForUpdate = SetMailboxMethod(accountId)
|
||||
..addUpdates(mapUpdated);
|
||||
|
||||
final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation());
|
||||
final updateInvocation = requestBuilder.invocation(setMailboxMethodForUpdate);
|
||||
|
||||
final capabilities = setMailboxMethodForUpdate.requiredCapabilities.toCapabilitiesSupportTeamMailboxes(session, accountId);
|
||||
|
||||
final response = await (requestBuilder
|
||||
..usings(capabilities))
|
||||
.build()
|
||||
.execute();
|
||||
|
||||
final updateResponse = response.parse<SetMailboxResponse>(
|
||||
updateInvocation.methodCallId,
|
||||
SetMailboxResponse.deserialize
|
||||
);
|
||||
|
||||
final listEntriesErrors = handleSetResponse([updateResponse]);
|
||||
final mapErrors = Map.fromEntries(listEntriesErrors);
|
||||
|
||||
if (mapErrors.isNotEmpty) {
|
||||
throw SetMailboxMethodException(mapErrors);
|
||||
} else {
|
||||
final mapMailboxUpdated = updateResponse?.updated ?? <Id, Mailbox>{};
|
||||
final listMailboxIdNotUpdated = listMailbox
|
||||
.map((mailbox) => mailbox.id)
|
||||
.whereNotNull()
|
||||
.where((mailboxId) => !mapMailboxUpdated.containsKey(mailboxId.id))
|
||||
.toList();
|
||||
log('MailboxAPI::setRoleDefaultMailbox:listMailboxIdNotUpdated: ${listMailboxIdNotUpdated.length}');
|
||||
return listMailboxIdNotUpdated;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -206,4 +206,14 @@ class MailboxRepositoryImpl extends MailboxRepository {
|
||||
Future<List<MailboxId>> subscribeMultipleMailbox(Session session, AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest) {
|
||||
return mapDataSource[DataSourceType.network]!.subscribeMultipleMailbox(session, accountId, subscribeRequest);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole) {
|
||||
return mapDataSource[DataSourceType.network]!.createDefaultMailbox(session, accountId, listRole);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
||||
return mapDataSource[DataSourceType.network]!.setRoleDefaultMailbox(session, accountId, listMailbox);
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
class MailboxConstants {
|
||||
static const MAILBOX_LEVEL_SEPARATOR = "/";
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
import 'package:jmap_dart_client/jmap/core/error/set_error.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||
|
||||
class SetMailboxMethodException implements Exception {
|
||||
|
||||
final Map<Id, SetError> mapErrors;
|
||||
|
||||
SetMailboxMethodException(this.mapErrors);
|
||||
}
|
||||
|
||||
class NotFoundMailboxCreatedException implements Exception {}
|
||||
|
||||
class NotFoundMailboxUpdatedRoleException implements Exception {}
|
||||
@@ -0,0 +1,24 @@
|
||||
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
|
||||
extension RoleExtension on Role {
|
||||
|
||||
String get mailboxName {
|
||||
if (this == PresentationMailbox.roleInbox) {
|
||||
return 'Inbox';
|
||||
} else if (this == PresentationMailbox.roleSent) {
|
||||
return 'Sent';
|
||||
} else if (this == PresentationMailbox.roleOutbox) {
|
||||
return 'Outbox';
|
||||
} else if (this == PresentationMailbox.roleDrafts) {
|
||||
return 'Drafts';
|
||||
} else if (this == PresentationMailbox.roleTrash) {
|
||||
return 'Trash';
|
||||
} else if (this == PresentationMailbox.roleSpam) {
|
||||
return 'Spam';
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,4 +43,8 @@ abstract class MailboxRepository {
|
||||
Future<bool> subscribeMailbox(Session session, AccountId accountId, SubscribeMailboxRequest request);
|
||||
|
||||
Future<List<MailboxId>> subscribeMultipleMailbox(Session session, AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest);
|
||||
|
||||
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
|
||||
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
||||
|
||||
class CreateDefaultMailboxLoading extends LoadingState {}
|
||||
|
||||
class CreateDefaultMailboxAllSuccess extends UIActionState {
|
||||
CreateDefaultMailboxAllSuccess({
|
||||
jmap.State? currentEmailState,
|
||||
jmap.State? currentMailboxState,
|
||||
}) : super(currentEmailState, currentMailboxState);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [...super.props];
|
||||
}
|
||||
|
||||
class CreateDefaultMailboxHasSomeFailure extends UIActionState {
|
||||
CreateDefaultMailboxHasSomeFailure({
|
||||
jmap.State? currentEmailState,
|
||||
jmap.State? currentMailboxState,
|
||||
}) : super(currentEmailState, currentMailboxState);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [...super.props];
|
||||
}
|
||||
|
||||
class CreateDefaultMailboxFailure extends FeatureFailure {
|
||||
CreateDefaultMailboxFailure(dynamic exception) : super(exception: exception);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [exception];
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:core/utils/app_logger.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/mail/mailbox/mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/create_default_mailbox_state.dart';
|
||||
|
||||
class CreateDefaultMailboxInteractor {
|
||||
final MailboxRepository _mailboxRepository;
|
||||
|
||||
CreateDefaultMailboxInteractor(this._mailboxRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
List<Role> listRole
|
||||
) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(CreateDefaultMailboxLoading());
|
||||
|
||||
final currentMailboxState = await _mailboxRepository.getMailboxState(session, accountId);
|
||||
|
||||
final listMailboxCreated = await _mailboxRepository.createDefaultMailbox(
|
||||
session,
|
||||
accountId,
|
||||
listRole
|
||||
);
|
||||
log('CreateDefaultMailboxInteractor::execute:listMailboxCreated: ${listMailboxCreated.length}');
|
||||
final listMailboxIdNotSetRole = await _mailboxRepository.setRoleDefaultMailbox(
|
||||
session,
|
||||
accountId,
|
||||
listMailboxCreated
|
||||
);
|
||||
log('CreateDefaultMailboxInteractor::execute:listMailboxIdNotSetRole: ${listMailboxIdNotSetRole.length}');
|
||||
if (listMailboxIdNotSetRole.isEmpty) {
|
||||
yield Right<Failure, Success>(CreateDefaultMailboxAllSuccess(currentMailboxState: currentMailboxState));
|
||||
} else if (listMailboxIdNotSetRole.length < listMailboxCreated.length) {
|
||||
yield Right<Failure, Success>(CreateDefaultMailboxHasSomeFailure(currentMailboxState: currentMailboxState));
|
||||
} else {
|
||||
final mapError = await _mailboxRepository.deleteMultipleMailbox(
|
||||
session,
|
||||
accountId,
|
||||
listMailboxIdNotSetRole
|
||||
);
|
||||
yield Left<Failure, Success>(CreateDefaultMailboxFailure(mapError));
|
||||
}
|
||||
} catch (e) {
|
||||
yield Left<Failure, Success>(CreateDefaultMailboxFailure(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_default_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
||||
@@ -54,6 +55,7 @@ class MailboxBindings extends BaseBindings {
|
||||
Get.find<MoveMailboxInteractor>(),
|
||||
Get.find<SubscribeMailboxInteractor>(),
|
||||
Get.find<SubscribeMultipleMailboxInteractor>(),
|
||||
Get.find<CreateDefaultMailboxInteractor>(),
|
||||
Get.find<TreeBuilder>(),
|
||||
Get.find<VerifyNameInteractor>(),
|
||||
Get.find<GetAllMailboxInteractor>(),
|
||||
@@ -99,6 +101,7 @@ class MailboxBindings extends BaseBindings {
|
||||
Get.lazyPut(() => MoveMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
Get.lazyPut(() => SubscribeMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
Get.lazyPut(() => SubscribeMultipleMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
Get.lazyPut(() => CreateDefaultMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:core/core.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -34,6 +35,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_reque
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/create_default_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
||||
@@ -43,6 +45,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_default_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
||||
@@ -59,6 +62,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_catego
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/open_mailbox_view_event.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_constants.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
|
||||
@@ -95,6 +99,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
final MoveMailboxInteractor _moveMailboxInteractor;
|
||||
final SubscribeMailboxInteractor _subscribeMailboxInteractor;
|
||||
final SubscribeMultipleMailboxInteractor _subscribeMultipleMailboxInteractor;
|
||||
final CreateDefaultMailboxInteractor _createDefaultMailboxInteractor;
|
||||
|
||||
final currentSelectMode = SelectMode.INACTIVE.obs;
|
||||
final _activeScrollTop = RxBool(false);
|
||||
@@ -116,6 +121,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
this._moveMailboxInteractor,
|
||||
this._subscribeMailboxInteractor,
|
||||
this._subscribeMultipleMailboxInteractor,
|
||||
this._createDefaultMailboxInteractor,
|
||||
TreeBuilder treeBuilder,
|
||||
VerifyNameInteractor verifyNameInteractor,
|
||||
GetAllMailboxInteractor getAllMailboxInteractor,
|
||||
@@ -173,6 +179,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
_handleUnsubscribeMultipleMailboxAllSuccess(success);
|
||||
} else if (success is SubscribeMultipleMailboxHasSomeSuccess) {
|
||||
_handleUnsubscribeMultipleMailboxHasSomeSuccess(success);
|
||||
} else if (success is CreateDefaultMailboxAllSuccess) {
|
||||
_refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
|
||||
} else if (success is CreateDefaultMailboxHasSomeFailure) {
|
||||
_refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,6 +195,8 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
_deleteMailboxFailure(failure);
|
||||
} else if (failure is RefreshChangesAllMailboxFailure) {
|
||||
_clearNewFolderId();
|
||||
} else if (failure is CreateDefaultMailboxFailure) {
|
||||
_refreshMailboxChanges();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -319,7 +331,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
}
|
||||
|
||||
void _initialMailboxVariableStorage({bool isRefreshChange = false}) {
|
||||
_setMapMailbox();
|
||||
_setMapMailbox(isRefreshChange: isRefreshChange);
|
||||
_setOutboxMailbox();
|
||||
|
||||
if (isRefreshChange) {
|
||||
@@ -329,7 +341,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
}
|
||||
}
|
||||
|
||||
void _setMapMailbox() {
|
||||
void _setMapMailbox({bool isRefreshChange = false}) {
|
||||
final mapDefaultMailboxIdByRole = {
|
||||
for (var mailboxNode in defaultMailboxTree.value.root.childrenItems ?? List<MailboxNode>.empty())
|
||||
mailboxNode.item.role!: mailboxNode.item.id
|
||||
@@ -342,6 +354,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
|
||||
mailboxDashBoardController.setMapDefaultMailboxIdByRole(mapDefaultMailboxIdByRole);
|
||||
mailboxDashBoardController.setMapMailboxById(mapMailboxById);
|
||||
|
||||
if (!isRefreshChange) {
|
||||
_handleCreateDefaultFolderIfMissing(mapDefaultMailboxIdByRole);
|
||||
}
|
||||
}
|
||||
|
||||
void _setOutboxMailbox() {
|
||||
@@ -398,6 +414,23 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
return null;
|
||||
}
|
||||
|
||||
void _handleCreateDefaultFolderIfMissing(Map<Role, MailboxId> mapDefaultMailboxRole) {
|
||||
final listRoleMissing = MailboxConstants.defaultMailboxRoles
|
||||
.whereNot(mapDefaultMailboxRole.containsKey)
|
||||
.toSet()
|
||||
.toList();
|
||||
log('MailboxController::_handleCreateDefaultFolderIfMissing():listRoleMissing: $listRoleMissing');
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
final session = mailboxDashBoardController.sessionCurrent;
|
||||
if (listRoleMissing.isNotEmpty && accountId != null && session != null) {
|
||||
consumeState(_createDefaultMailboxInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
listRoleMissing
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
void _handleDataFromNavigationRouter() {
|
||||
log('MailboxController::_handleDataFromNavigationRouter():navigationRouter: $navigationRouter');
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
|
||||
class MailboxConstants {
|
||||
static final List<Role> defaultMailboxRoles = [
|
||||
PresentationMailbox.roleInbox,
|
||||
PresentationMailbox.roleDrafts,
|
||||
PresentationMailbox.roleSent,
|
||||
PresentationMailbox.roleTrash
|
||||
];
|
||||
}
|
||||
@@ -83,7 +83,7 @@ class NetworkBindings extends Bindings {
|
||||
Get.put(HttpClient(Get.find<Dio>()));
|
||||
Get.put(DownloadClient(Get.find<DioClient>(), Get.find<CompressFileUtils>()));
|
||||
Get.put(DownloadManager(Get.find<DownloadClient>()));
|
||||
Get.put(MailboxAPI(Get.find<HttpClient>()));
|
||||
Get.put(MailboxAPI(Get.find<HttpClient>(), Get.find<Uuid>()));
|
||||
Get.put(SessionAPI(Get.find<HttpClient>()));
|
||||
Get.put(ThreadAPI(Get.find<HttpClient>()));
|
||||
Get.put(EmailAPI(
|
||||
|
||||
@@ -40,12 +40,12 @@ extension MailboxExtension on Mailbox {
|
||||
);
|
||||
}
|
||||
|
||||
Mailbox toMailbox(MailboxName mailboxName, {MailboxId? parentId}) {
|
||||
Mailbox toMailbox(MailboxName mailboxName, {MailboxId? parentId, Role? mailboxRole}) {
|
||||
return Mailbox(
|
||||
id: id,
|
||||
name: mailboxName,
|
||||
parentId: parentId,
|
||||
role: role,
|
||||
role: mailboxRole ?? role,
|
||||
sortOrder: sortOrder,
|
||||
totalEmails: totalEmails,
|
||||
unreadEmails: unreadEmails,
|
||||
|
||||
Reference in New Issue
Block a user