TF-3189 new option to enable/disable subaddressing for a personal folder

This commit is contained in:
Florent Azavant
2024-10-21 16:29:26 +02:00
committed by Dat H. Pham
parent f8f248fc3c
commit 89d80fe142
36 changed files with 455 additions and 4 deletions
@@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_
import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_response.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
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';
@@ -49,6 +50,8 @@ abstract class MailboxDataSource {
Future<List<MailboxId>> subscribeMultipleMailbox(Session session, AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest);
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request);
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
@@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_
import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_response.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
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/exceptions/exception_thrower.dart';
@@ -134,6 +135,11 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource {
throw UnimplementedError();
}
@override
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request) {
throw UnimplementedError();
}
@override
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole) {
throw UnimplementedError();
@@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_
import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_response.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
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/exceptions/exception_thrower.dart';
@@ -121,6 +122,13 @@ class MailboxDataSourceImpl extends MailboxDataSource {
}).catchError(_exceptionThrower.throwException);
}
@override
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request) {
return Future.sync(() async {
return await mailboxAPI.handleMailboxRightRequest(session, accountId, request);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole) {
return Future.sync(() async {
@@ -20,7 +20,8 @@ extension MailboxCacheExtension on MailboxCache {
unreadThreads: unreadThreads != null ? UnreadThreads(UnsignedInt(unreadThreads!)) : null,
myRights: myRights?.toMailboxRights(),
isSubscribed: isSubscribed != null ? IsSubscribed(isSubscribed!) : null,
namespace: namespace != null ? Namespace(namespace!) : null
namespace: namespace != null ? Namespace(namespace!) : null,
rights: rights != null ? Map<String, List<String>?>.from(rights!) : null,
);
}
}
@@ -17,7 +17,8 @@ extension MailboxExtension on Mailbox {
unreadThreads: unreadThreads?.value.value.round(),
myRights: myRights?.toMailboxRightsCache(),
isSubscribed: isSubscribed?.value,
namespace: namespace?.value
namespace: namespace?.value,
rights: rights?.map((key, value) => MapEntry(key, value)),
);
}
}
@@ -48,6 +48,9 @@ class MailboxCache extends HiveObject with EquatableMixin {
@HiveField(12)
final String? namespace;
@HiveField(13)
final Map<String, List<String>?>? rights;
MailboxCache(
this.id,
{
@@ -63,6 +66,7 @@ class MailboxCache extends HiveObject with EquatableMixin {
this.isSubscribed,
this.lastOpened,
this.namespace,
this.rights
}
);
@@ -80,5 +84,6 @@ class MailboxCache extends HiveObject with EquatableMixin {
myRights,
isSubscribed,
namespace,
rights
];
}
@@ -2,6 +2,8 @@ import 'dart:async';
import 'package:collection/collection.dart';
import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart' hide State;
import 'package:get/get.dart';
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';
@@ -26,20 +28,24 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/query/query_mailbox_method.da
import 'package:jmap_dart_client/jmap/mail/mailbox/set/set_mailbox_method.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/set/set_mailbox_response.dart';
import 'package:model/error_type_handler/set_method_error_handler_mixin.dart';
import 'package:model/mailbox/mailbox_constants.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/mixin/handle_error_mixin.dart';
import 'package:tmail_ui_user/features/composer/domain/exceptions/set_method_exception.dart';
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
import 'package:tmail_ui_user/features/mailbox/domain/exceptions/mailbox_exception.dart';
import 'package:tmail_ui_user/features/mailbox/domain/exceptions/set_mailbox_method_exception.dart';
import 'package:tmail_ui_user/features/mailbox/domain/exceptions/set_mailbox_rights_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/get_mailbox_by_role_response.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_response.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subaddressing_action.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
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';
@@ -401,6 +407,53 @@ class MailboxAPI with HandleSetErrorMixin {
return listMailboxIdSubscribe ?? [];
}
List<String> _updateRightsForSubaddressing(MailboxSubaddressingAction action, List<String>? currentRights) {
final updatedRights = List<String>.from(currentRights ?? []);
if (action == MailboxSubaddressingAction.allow) {
updatedRights.addIf(!updatedRights.contains(postingRight), postingRight);
} else {
updatedRights.remove(postingRight);
}
return updatedRights;
}
@visibleForTesting
List<String> updateRightsForSubaddressing(MailboxSubaddressingAction action, List<String>? currentRights)
=> _updateRightsForSubaddressing(action, currentRights);
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request) async {
final setMailboxMethod = SetMailboxMethod(accountId)
..addUpdates({
request.mailboxId.id : PatchObject({
'sharedWith/$anyoneIdentifier': _updateRightsForSubaddressing(request.subaddressingAction, request.currentRights?[anyoneIdentifier])
})
});
final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation());
final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod);
final capabilities = setMailboxMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder
..usings(capabilities))
.build()
.execute();
final setMailboxResponse = response.parse<SetMailboxResponse>(
setMailboxInvocation.methodCallId,
SetMailboxResponse.deserialize);
if (setMailboxResponse?.updated?.containsKey(request.mailboxId.id) ?? false) {
return true;
} else {
throw SetMailboxRightsException();
}
}
Future<List<Mailbox>> createDefaultMailbox(
Session session,
AccountId accountId,
@@ -30,6 +30,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_respons
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
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/repository/mailbox_repository.dart';
@@ -285,6 +286,11 @@ class MailboxRepositoryImpl extends MailboxRepository {
return mapDataSource[DataSourceType.network]!.subscribeMultipleMailbox(session, accountId, subscribeRequest);
}
@override
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request) {
return mapDataSource[DataSourceType.network]!.handleMailboxRightRequest(session, accountId, request);
}
@override
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole) {
return mapDataSource[DataSourceType.network]!.createDefaultMailbox(session, accountId, listRole);