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:
dab246
2023-11-02 15:58:51 +07:00
committed by Dat Vu
parent 39e53f0769
commit 17da789fe3
15 changed files with 30 additions and 51 deletions
@@ -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;