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)); 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 final mailboxRequest = mailboxDashBoardController.outboxMailbox?.id == null
? CreateNewMailboxRequest( ? CreateNewMailboxRequest(
Id(_uuid.v1()), Id(_uuid.v1()),
PresentationMailbox.outboxMailboxName MailboxName(PresentationMailbox.outboxRole.inCaps)
) )
: null; : null;
@@ -50,5 +50,5 @@ abstract class MailboxDataSource {
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole); 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 @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 Future.sync(() async {
return await mailboxAPI.setRoleDefaultMailbox(session, accountId, listMailbox); return await mailboxAPI.setRoleDefaultMailbox(session, accountId, listMailbox);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
@@ -455,7 +455,7 @@ class MailboxAPI with HandleSetErrorMixin {
.toList(); .toList();
} }
Future<List<MailboxId>> setRoleDefaultMailbox( Future<void> setRoleDefaultMailbox(
Session session, Session session,
AccountId accountId, AccountId accountId,
List<Mailbox> listMailbox List<Mailbox> listMailbox
@@ -488,15 +488,6 @@ class MailboxAPI with HandleSetErrorMixin {
if (mapErrors.isNotEmpty) { if (mapErrors.isNotEmpty) {
throw SetMailboxMethodException(mapErrors); 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 @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); return mapDataSource[DataSourceType.network]!.setRoleDefaultMailbox(session, accountId, listMailbox);
} }
} }
@@ -17,6 +17,8 @@ extension RoleExtension on Role {
return 'Trash'; return 'Trash';
} else if (this == PresentationMailbox.roleSpam) { } else if (this == PresentationMailbox.roleSpam) {
return 'Spam'; return 'Spam';
} else if (this == PresentationMailbox.roleTemplates) {
return 'Templates';
} else { } else {
return ''; return '';
} }
@@ -46,5 +46,5 @@ abstract class MailboxRepository {
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole); 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]; 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 { class CreateDefaultMailboxFailure extends FeatureFailure {
CreateDefaultMailboxFailure(dynamic exception) : super(exception: exception); CreateDefaultMailboxFailure(dynamic exception) : super(exception: exception);
@@ -29,24 +29,12 @@ class CreateDefaultMailboxInteractor {
listRole listRole
); );
log('CreateDefaultMailboxInteractor::execute:listMailboxCreated: ${listMailboxCreated.length}'); log('CreateDefaultMailboxInteractor::execute:listMailboxCreated: ${listMailboxCreated.length}');
final listMailboxIdNotSetRole = await _mailboxRepository.setRoleDefaultMailbox( await _mailboxRepository.setRoleDefaultMailbox(
session, session,
accountId, accountId,
listMailboxCreated listMailboxCreated
); );
log('CreateDefaultMailboxInteractor::execute:listMailboxIdNotSetRole: ${listMailboxIdNotSetRole.length}'); yield Right<Failure, Success>(CreateDefaultMailboxAllSuccess(currentMailboxState: currentMailboxState));
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) { } catch (e) {
yield Left<Failure, Success>(CreateDefaultMailboxFailure(e)); yield Left<Failure, Success>(CreateDefaultMailboxFailure(e));
} }
@@ -181,8 +181,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
_handleUnsubscribeMultipleMailboxHasSomeSuccess(success); _handleUnsubscribeMultipleMailboxHasSomeSuccess(success);
} else if (success is CreateDefaultMailboxAllSuccess) { } else if (success is CreateDefaultMailboxAllSuccess) {
_refreshMailboxChanges(currentMailboxState: success.currentMailboxState); _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) { } else if (failure is RefreshChangesAllMailboxFailure) {
_clearNewFolderId(); _clearNewFolderId();
} else if (failure is CreateDefaultMailboxFailure) { } else if (failure is CreateDefaultMailboxFailure) {
_refreshMailboxChanges(); refreshAllMailbox();
} }
} }
@@ -364,8 +362,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
try { try {
final outboxMailboxIdByRole = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleOutbox]; final outboxMailboxIdByRole = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleOutbox];
if (outboxMailboxIdByRole == null) { if (outboxMailboxIdByRole == null) {
final outboxMailboxByName = allMailboxes final outboxMailboxByName = findNodeByNameOnFirstLevel(PresentationMailbox.outboxRole)?.item;
.firstWhere((mailbox) => mailbox.name?.toLowerCase() == PresentationMailbox.lowerCaseOutboxMailboxName);
mailboxDashBoardController.setOutboxMailbox(outboxMailboxByName); mailboxDashBoardController.setOutboxMailbox(outboxMailboxByName);
} else { } else {
mailboxDashBoardController.setOutboxMailbox(mailboxDashBoardController.mapMailboxById[outboxMailboxIdByRole]!); mailboxDashBoardController.setOutboxMailbox(mailboxDashBoardController.mapMailboxById[outboxMailboxIdByRole]!);
@@ -416,8 +413,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
void _handleCreateDefaultFolderIfMissing(Map<Role, MailboxId> mapDefaultMailboxRole) { void _handleCreateDefaultFolderIfMissing(Map<Role, MailboxId> mapDefaultMailboxRole) {
final listRoleMissing = MailboxConstants.defaultMailboxRoles final listRoleMissing = MailboxConstants.defaultMailboxRoles
.whereNot(mapDefaultMailboxRole.containsKey) .whereNot((role) => mapDefaultMailboxRole.containsKey(role) || findNodeByNameOnFirstLevel(role.value) != null)
.toSet()
.toList(); .toList();
log('MailboxController::_handleCreateDefaultFolderIfMissing():listRoleMissing: $listRoleMissing'); log('MailboxController::_handleCreateDefaultFolderIfMissing():listRoleMissing: $listRoleMissing');
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
@@ -1,6 +1,7 @@
import 'dart:collection'; import 'dart:collection';
import 'package:collection/collection.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/mailbox/expand_mode.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 @override
List<Object?> get props => [root]; List<Object?> get props => [root];
} }
@@ -5,8 +5,11 @@ import 'package:model/mailbox/presentation_mailbox.dart';
class MailboxConstants { class MailboxConstants {
static final List<Role> defaultMailboxRoles = [ static final List<Role> defaultMailboxRoles = [
PresentationMailbox.roleInbox, PresentationMailbox.roleInbox,
PresentationMailbox.roleOutbox,
PresentationMailbox.roleDrafts, PresentationMailbox.roleDrafts,
PresentationMailbox.roleSent, 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 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; bool get isSubscribedMailbox => isSubscribed != null && isSubscribed?.value == true;
@@ -27,9 +27,6 @@ class PresentationMailbox with EquatableMixin {
static final roleDrafts = Role(draftsRole); static final roleDrafts = Role(draftsRole);
static final roleSpam = Role(spamRole); static final roleSpam = Role(spamRole);
static final outboxMailboxName = MailboxName('Outbox');
static final lowerCaseOutboxMailboxName = MailboxName('outbox');
final MailboxId id; final MailboxId id;
final MailboxName? name; final MailboxName? name;
final MailboxId? parentId; final MailboxId? parentId;