TF-1705 Auto create default folder no role if missing on server CYRUS
Signed-off-by: dab246 <tdvu@linagora.com> (cherry picked from commit 918a554f1fbc5816d48dd00bf01be8624b9dcc9b)
This commit is contained in:
@@ -539,4 +539,13 @@ abstract class BaseMailboxController extends BaseController {
|
||||
consumeState(refreshAllMailboxInteractor!.execute(session, accountId, newMailboxState));
|
||||
}
|
||||
}
|
||||
|
||||
MailboxNode? findNodeByNameOnFirstLevel(String name) {
|
||||
MailboxNode? mailboxNode = defaultMailboxTree.value.findNodeOnFirstLevel((node) => node.item.name?.name.toLowerCase() == name);
|
||||
if (mailboxNode != null) {
|
||||
return mailboxNode;
|
||||
}
|
||||
mailboxNode = personalMailboxTree.value.findNodeOnFirstLevel((node) => node.item.name?.name.toLowerCase() == name);
|
||||
return mailboxNode;
|
||||
}
|
||||
}
|
||||
@@ -957,7 +957,7 @@ class ComposerController extends BaseController {
|
||||
final mailboxRequest = mailboxDashBoardController.outboxMailbox?.id == null
|
||||
? CreateNewMailboxRequest(
|
||||
Id(_uuid.v1()),
|
||||
PresentationMailbox.outboxMailboxName
|
||||
MailboxName(PresentationMailbox.outboxRole.inCaps)
|
||||
)
|
||||
: null;
|
||||
|
||||
|
||||
@@ -50,5 +50,5 @@ abstract class MailboxDataSource {
|
||||
|
||||
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
|
||||
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
|
||||
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
|
||||
}
|
||||
@@ -127,7 +127,7 @@ class MailboxDataSourceImpl extends MailboxDataSource {
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
||||
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
||||
return Future.sync(() async {
|
||||
return await mailboxAPI.setRoleDefaultMailbox(session, accountId, listMailbox);
|
||||
}).catchError(_exceptionThrower.throwException);
|
||||
|
||||
@@ -455,7 +455,7 @@ class MailboxAPI with HandleSetErrorMixin {
|
||||
.toList();
|
||||
}
|
||||
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(
|
||||
Future<void> setRoleDefaultMailbox(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
List<Mailbox> listMailbox
|
||||
@@ -488,15 +488,6 @@ class MailboxAPI with HandleSetErrorMixin {
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -213,7 +213,7 @@ class MailboxRepositoryImpl extends MailboxRepository {
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
||||
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
||||
return mapDataSource[DataSourceType.network]!.setRoleDefaultMailbox(session, accountId, listMailbox);
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,8 @@ extension RoleExtension on Role {
|
||||
return 'Trash';
|
||||
} else if (this == PresentationMailbox.roleSpam) {
|
||||
return 'Spam';
|
||||
} else if (this == PresentationMailbox.roleTemplates) {
|
||||
return 'Templates';
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -46,5 +46,5 @@ abstract class MailboxRepository {
|
||||
|
||||
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
|
||||
|
||||
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
|
||||
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
|
||||
}
|
||||
@@ -15,16 +15,6 @@ class CreateDefaultMailboxAllSuccess extends UIActionState {
|
||||
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);
|
||||
|
||||
|
||||
@@ -29,24 +29,12 @@ class CreateDefaultMailboxInteractor {
|
||||
listRole
|
||||
);
|
||||
log('CreateDefaultMailboxInteractor::execute:listMailboxCreated: ${listMailboxCreated.length}');
|
||||
final listMailboxIdNotSetRole = await _mailboxRepository.setRoleDefaultMailbox(
|
||||
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));
|
||||
}
|
||||
yield Right<Failure, Success>(CreateDefaultMailboxAllSuccess(currentMailboxState: currentMailboxState));
|
||||
} catch (e) {
|
||||
yield Left<Failure, Success>(CreateDefaultMailboxFailure(e));
|
||||
}
|
||||
|
||||
@@ -181,8 +181,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
_handleUnsubscribeMultipleMailboxHasSomeSuccess(success);
|
||||
} else if (success is CreateDefaultMailboxAllSuccess) {
|
||||
_refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
|
||||
} else if (success is CreateDefaultMailboxHasSomeFailure) {
|
||||
_refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,7 +194,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
} else if (failure is RefreshChangesAllMailboxFailure) {
|
||||
_clearNewFolderId();
|
||||
} else if (failure is CreateDefaultMailboxFailure) {
|
||||
_refreshMailboxChanges();
|
||||
refreshAllMailbox();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -364,8 +362,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
try {
|
||||
final outboxMailboxIdByRole = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleOutbox];
|
||||
if (outboxMailboxIdByRole == null) {
|
||||
final outboxMailboxByName = allMailboxes
|
||||
.firstWhere((mailbox) => mailbox.name?.toLowerCase() == PresentationMailbox.lowerCaseOutboxMailboxName);
|
||||
final outboxMailboxByName = findNodeByNameOnFirstLevel(PresentationMailbox.outboxRole)?.item;
|
||||
mailboxDashBoardController.setOutboxMailbox(outboxMailboxByName);
|
||||
} else {
|
||||
mailboxDashBoardController.setOutboxMailbox(mailboxDashBoardController.mapMailboxById[outboxMailboxIdByRole]!);
|
||||
@@ -416,8 +413,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
|
||||
void _handleCreateDefaultFolderIfMissing(Map<Role, MailboxId> mapDefaultMailboxRole) {
|
||||
final listRoleMissing = MailboxConstants.defaultMailboxRoles
|
||||
.whereNot(mapDefaultMailboxRole.containsKey)
|
||||
.toSet()
|
||||
.whereNot((role) => mapDefaultMailboxRole.containsKey(role) || findNodeByNameOnFirstLevel(role.value) != null)
|
||||
.toList();
|
||||
log('MailboxController::_handleCreateDefaultFolderIfMissing():listRoleMissing: $listRoleMissing');
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
|
||||
import 'dart:collection';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:model/mailbox/expand_mode.dart';
|
||||
@@ -141,6 +142,8 @@ class MailboxTree with EquatableMixin {
|
||||
}
|
||||
}
|
||||
|
||||
MailboxNode? findNodeOnFirstLevel(NodeQuery nodeQuery) => root.childrenItems?.firstWhereOrNull(nodeQuery);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [root];
|
||||
}
|
||||
@@ -5,8 +5,11 @@ import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
class MailboxConstants {
|
||||
static final List<Role> defaultMailboxRoles = [
|
||||
PresentationMailbox.roleInbox,
|
||||
PresentationMailbox.roleOutbox,
|
||||
PresentationMailbox.roleDrafts,
|
||||
PresentationMailbox.roleSent,
|
||||
PresentationMailbox.roleTrash
|
||||
PresentationMailbox.roleTrash,
|
||||
PresentationMailbox.roleSpam,
|
||||
PresentationMailbox.roleTemplates,
|
||||
];
|
||||
}
|
||||
@@ -41,7 +41,7 @@ extension PresentationMailboxExtension on PresentationMailbox {
|
||||
|
||||
bool get isSent => role == PresentationMailbox.roleSent;
|
||||
|
||||
bool get isOutbox => name == PresentationMailbox.lowerCaseOutboxMailboxName || role == PresentationMailbox.roleOutbox;
|
||||
bool get isOutbox => name?.name == PresentationMailbox.outboxRole || role == PresentationMailbox.roleOutbox;
|
||||
|
||||
bool get isSubscribedMailbox => isSubscribed != null && isSubscribed?.value == true;
|
||||
|
||||
|
||||
@@ -27,9 +27,6 @@ class PresentationMailbox with EquatableMixin {
|
||||
static final roleDrafts = Role(draftsRole);
|
||||
static final roleSpam = Role(spamRole);
|
||||
|
||||
static final outboxMailboxName = MailboxName('Outbox');
|
||||
static final lowerCaseOutboxMailboxName = MailboxName('outbox');
|
||||
|
||||
final MailboxId id;
|
||||
final MailboxName? name;
|
||||
final MailboxId? parentId;
|
||||
|
||||
Reference in New Issue
Block a user