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:
dab246
2023-10-31 01:30:11 +07:00
committed by Dat Vu
parent 5e69c8bd1c
commit c279730309
18 changed files with 375 additions and 36 deletions
@@ -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;
}
}
+3 -27
View File
@@ -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(
+2 -2
View File
@@ -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,