TF-1718 Add unsubscribeMail method to datasource/repository/interactor on jmap server

Signed-off-by: dab246 <tdvu@linagora.com>
(cherry picked from commit f9159b651866fbe8e2a1866231b5413cecc5b597)
This commit is contained in:
dab246
2023-11-16 12:40:12 +07:00
committed by Dat Vu
parent 41eb95257d
commit 4d8c7dc52e
10 changed files with 124 additions and 2 deletions
@@ -104,4 +104,6 @@ abstract class EmailDataSource {
Future<List<SendingEmail>> updateMultipleSendingEmail(AccountId accountId, UserName userName, List<SendingEmail> newSendingEmails);
Future<SendingEmail> getStoredSendingEmail(AccountId accountId, UserName userName, String sendingId);
Future<Email> unsubscribeMail(Session session, AccountId accountId, EmailId emailId);
}
@@ -224,4 +224,11 @@ class EmailDataSourceImpl extends EmailDataSource {
Future<SendingEmail> getStoredSendingEmail(AccountId accountId, UserName userName, String sendingId) {
throw UnimplementedError();
}
@override
Future<Email> unsubscribeMail(Session session, AccountId accountId, EmailId emailId) {
return Future.sync(() async {
return await emailAPI.unsubscribeMail(session, accountId, emailId);
}).catchError(_exceptionThrower.throwException);
}
}
@@ -287,4 +287,9 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
return sendingEmailCache.toSendingEmail();
}).catchError(_exceptionThrower.throwException);
}
@override
Future<Email> unsubscribeMail(Session session, AccountId accountId, EmailId emailId) {
throw UnimplementedError();
}
}
+34 -2
View File
@@ -39,9 +39,11 @@ import 'package:model/account/authentication_type.dart';
import 'package:model/download/download_task_id.dart';
import 'package:model/email/attachment.dart';
import 'package:model/email/email_action_type.dart';
import 'package:model/email/email_property.dart';
import 'package:model/email/mark_star_action.dart';
import 'package:model/email/read_actions.dart';
import 'package:model/extensions/email_extension.dart';
import 'package:model/extensions/email_id_extensions.dart';
import 'package:model/extensions/keyword_identifier_extension.dart';
import 'package:model/extensions/list_email_extension.dart';
import 'package:model/extensions/list_email_id_extension.dart';
@@ -230,7 +232,7 @@ class EmailAPI with HandleSetErrorMixin {
final getEmailMethod = GetEmailMethod(accountId)
..addIds(emails.listEmailIds.toIds().toSet())
..addProperties(Properties({'keywords'}));
..addProperties(Properties({EmailProperty.keywords}));
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
@@ -438,7 +440,7 @@ class EmailAPI with HandleSetErrorMixin {
final getEmailMethod = GetEmailMethod(accountId)
..addIds(emails.listEmailIds.toIds().toSet())
..addProperties(Properties({'keywords'}));
..addProperties(Properties({EmailProperty.keywords}));
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
@@ -655,4 +657,34 @@ class EmailAPI with HandleSetErrorMixin {
throw NotFoundEmailException();
}
}
Future<Email> unsubscribeMail(Session session, AccountId accountId, EmailId emailId) async {
final setEmailMethod = SetEmailMethod(accountId)
..addUpdates(emailId.generateMapUpdateObjectUnsubscribeMail());
final getEmailMethod = GetEmailMethod(accountId)
..addIds({emailId.id})
..addProperties(ThreadConstants.propertiesDefault);
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
requestBuilder.invocation(setEmailMethod);
final getEmailInvocation = requestBuilder.invocation(getEmailMethod);
final capabilities = setEmailMethod.requiredCapabilities.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder
..usings(capabilities))
.build()
.execute();
final getEmailResponse = response.parse<GetEmailResponse>(
getEmailInvocation.methodCallId,
GetEmailResponse.deserialize);
if (getEmailResponse?.list.isNotEmpty == true) {
return getEmailResponse!.list.first;
} else {
throw NotFoundEmailException();
}
}
}
@@ -212,4 +212,9 @@ class EmailRepositoryImpl extends EmailRepository {
Future<String> transformHtmlEmailContent(String htmlContent, TransformConfiguration configuration) {
return _htmlDataSource.transformHtmlEmailContent(htmlContent, configuration);
}
@override
Future<Email> unsubscribeMail(Session session, AccountId accountId, EmailId emailId) {
return emailDataSource[DataSourceType.network]!.unsubscribeMail(session, accountId, emailId);
}
}
@@ -104,4 +104,6 @@ abstract class EmailRepository {
String htmlContent,
TransformConfiguration configuration
);
Future<Email> unsubscribeMail(Session session, AccountId accountId, EmailId emailId);
}
@@ -0,0 +1,27 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
class UnsubscribeEmailLoading extends LoadingState {}
class UnsubscribeEmailSuccess extends UIActionState {
final Email newEmail;
UnsubscribeEmailSuccess(
this.newEmail,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
@override
List<Object?> get props => [newEmail, ...super.props];
}
class UnsubscribeEmailFailure extends FeatureFailure {
UnsubscribeEmailFailure({dynamic exception}) : super(exception: exception);
}
@@ -0,0 +1,25 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart';
class UnsubscribeEmailInteractor {
final EmailRepository emailRepository;
UnsubscribeEmailInteractor(this.emailRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, EmailId emailId) async* {
try {
yield Right(UnsubscribeEmailLoading());
final currentEmailState = await emailRepository.getEmailState(session, accountId);
final newEmail = await emailRepository.unsubscribeMail(session, accountId, emailId);
yield Right(UnsubscribeEmailSuccess(newEmail, currentEmailState: currentEmailState));
} catch (e) {
yield Left(UnsubscribeEmailFailure(exception: e));
}
}
}
@@ -1,5 +1,14 @@
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/core/patch_object.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/extensions/keyword_identifier_extension.dart';
extension EmailIdExtension on EmailId {
String get asString => id.value;
Map<Id, PatchObject> generateMapUpdateObjectUnsubscribeMail() {
return {
id: KeyWordIdentifierExtension.unsubscribeMail.generateUnsubscribeActionPath()
};
}
}
@@ -4,6 +4,8 @@ import 'package:model/email/mark_star_action.dart';
import 'package:model/email/read_actions.dart';
extension KeyWordIdentifierExtension on KeyWordIdentifier {
static final unsubscribeMail = KeyWordIdentifier('\$unsubscribe');
String generatePath() {
return '${PatchObject.keywordsProperty}/$value';
}
@@ -31,4 +33,10 @@ extension KeyWordIdentifierExtension on KeyWordIdentifier {
generatePath(): true
});
}
PatchObject generateUnsubscribeActionPath() {
return PatchObject({
generatePath(): true
});
}
}