TF-3189 new option to enable/disable subaddressing for a personal folder
This commit is contained in:
committed by
Dat H. Pham
parent
f8f248fc3c
commit
89d80fe142
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user