TF-657 Add interactor/repository/datasource for SendReceiptToSender
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart';
|
||||
|
||||
abstract class MdnDataSource {
|
||||
Future<MDN?> sendReceiptToSender(AccountId accountId, SendReceiptToSenderRequest request);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';
|
||||
import 'package:tmail_ui_user/features/email/data/datasource/mdn_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/email/data/network/mdn_api.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart';
|
||||
|
||||
class MdnDataSourceImpl extends MdnDataSource {
|
||||
|
||||
final MdnAPI _mdnAPI;
|
||||
|
||||
MdnDataSourceImpl(this._mdnAPI);
|
||||
|
||||
@override
|
||||
Future<MDN?> sendReceiptToSender(AccountId accountId, SendReceiptToSenderRequest request) {
|
||||
return Future.sync(() async {
|
||||
return await _mdnAPI.sendReceiptToSender(accountId, request);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -55,7 +55,8 @@ class EmailAPI {
|
||||
EmailProperty.htmlBody,
|
||||
EmailProperty.attachments,
|
||||
EmailProperty.headers,
|
||||
EmailProperty.keywords
|
||||
EmailProperty.keywords,
|
||||
EmailProperty.mailboxIds,
|
||||
}))
|
||||
..addFetchHTMLBodyValues(true);
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
import 'dart:async';
|
||||
|
||||
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/patch_object.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/reference_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/reference_prefix.dart';
|
||||
import 'package:jmap_dart_client/jmap/jmap_request.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/submission/email_submission_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';
|
||||
import 'package:jmap_dart_client/jmap/mdn/send/mdn_send_method.dart';
|
||||
import 'package:jmap_dart_client/jmap/mdn/send/mdn_send_response.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart';
|
||||
|
||||
class MdnAPI {
|
||||
|
||||
final HttpClient _httpClient;
|
||||
|
||||
MdnAPI(this._httpClient);
|
||||
|
||||
Future<MDN?> sendReceiptToSender(
|
||||
AccountId accountId,
|
||||
SendReceiptToSenderRequest request,
|
||||
) async {
|
||||
final mdnSendMethod = MDNSendMethod(
|
||||
accountId,
|
||||
{request.sendId: request.mdn},
|
||||
request.identityId
|
||||
)..addOnSuccessUpdateEmail({
|
||||
EmailSubmissionId(ReferenceId(ReferencePrefix.defaultPrefix, request.sendId)): PatchObject({
|
||||
KeyWordIdentifier.mdnSent.toPatchObjectJson(): true
|
||||
})
|
||||
});
|
||||
|
||||
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
|
||||
final mdnSendInvocation = requestBuilder.invocation(mdnSendMethod);
|
||||
final response = await (requestBuilder
|
||||
..usings(mdnSendMethod.requiredCapabilities))
|
||||
.build()
|
||||
.execute();
|
||||
|
||||
final mdnSendResponse = response.parse<MDNSendResponse>(
|
||||
mdnSendInvocation.methodCallId,
|
||||
MDNSendResponse.deserialize);
|
||||
|
||||
return mdnSendResponse?.sent?[request.sendId];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';
|
||||
import 'package:tmail_ui_user/features/email/data/datasource/mdn_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/repository/mdn_repository.dart';
|
||||
|
||||
class MdnRepositoryImpl extends MdnRepository {
|
||||
|
||||
final MdnDataSource _dataSource;
|
||||
|
||||
MdnRepositoryImpl(this._dataSource);
|
||||
|
||||
@override
|
||||
Future<MDN?> sendReceiptToSender(AccountId accountId, SendReceiptToSenderRequest request) {
|
||||
return _dataSource.sendReceiptToSender(accountId, request);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';
|
||||
|
||||
class SendReceiptToSenderRequest with EquatableMixin {
|
||||
|
||||
final MDN mdn;
|
||||
final IdentityId identityId;
|
||||
final Id sendId;
|
||||
|
||||
SendReceiptToSenderRequest({
|
||||
required this.mdn,
|
||||
required this.identityId,
|
||||
required this.sendId
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [mdn, identityId, sendId];
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart';
|
||||
|
||||
abstract class MdnRepository {
|
||||
Future<MDN?> sendReceiptToSender(AccountId accountId, SendReceiptToSenderRequest request);
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:model/model.dart';
|
||||
|
||||
class GetEmailContentLoading extends UIState {
|
||||
@@ -13,13 +14,13 @@ class GetEmailContentSuccess extends UIState {
|
||||
final List<EmailContent> emailContents;
|
||||
final List<EmailContent> emailContentsDisplayed;
|
||||
final List<Attachment> attachments;
|
||||
final bool readReceiptRequested;
|
||||
final Email? emailCurrent;
|
||||
|
||||
GetEmailContentSuccess(
|
||||
this.emailContents,
|
||||
this.emailContentsDisplayed,
|
||||
this.attachments,
|
||||
this.readReceiptRequested
|
||||
this.emailCurrent
|
||||
);
|
||||
|
||||
@override
|
||||
@@ -27,7 +28,7 @@ class GetEmailContentSuccess extends UIState {
|
||||
emailContents,
|
||||
emailContentsDisplayed,
|
||||
attachments,
|
||||
readReceiptRequested
|
||||
emailCurrent
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';
|
||||
|
||||
class SendReceiptToSenderLoading extends UIState {}
|
||||
|
||||
class SendReceiptToSenderSuccess extends UIState {
|
||||
|
||||
final MDN mdn;
|
||||
|
||||
SendReceiptToSenderSuccess(this.mdn);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [mdn];
|
||||
}
|
||||
|
||||
class SendReceiptToSenderFailure extends FeatureFailure {
|
||||
|
||||
final dynamic exception;
|
||||
|
||||
SendReceiptToSenderFailure(this.exception);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [exception];
|
||||
}
|
||||
@@ -30,19 +30,11 @@ class GetEmailContentInteractor {
|
||||
newEmailContents,
|
||||
newEmailContentsDisplayed,
|
||||
email.allAttachments,
|
||||
email.needShowNotificationMessageReadReceipt));
|
||||
email));
|
||||
} else if (email.allAttachments.isNotEmpty) {
|
||||
yield Right<Failure, Success>(GetEmailContentSuccess(
|
||||
[],
|
||||
[],
|
||||
email.allAttachments,
|
||||
email.needShowNotificationMessageReadReceipt));
|
||||
yield Right<Failure, Success>(GetEmailContentSuccess([], [], email.allAttachments, email));
|
||||
} else if (email.headers?.isNotEmpty == true) {
|
||||
yield Right<Failure, Success>(GetEmailContentSuccess(
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
email.needShowNotificationMessageReadReceipt));
|
||||
yield Right<Failure, Success>(GetEmailContentSuccess([], [], [], email));
|
||||
} else {
|
||||
yield Left(GetEmailContentFailure(null));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/repository/mdn_repository.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/send_receipt_to_sender_state.dart';
|
||||
|
||||
class SendReceiptToSenderInteractor {
|
||||
final MdnRepository _mdnRepository;
|
||||
|
||||
SendReceiptToSenderInteractor(this._mdnRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(AccountId accountId, SendReceiptToSenderRequest request) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(SendReceiptToSenderLoading());
|
||||
final mdn = await _mdnRepository.sendReceiptToSender(accountId, request);
|
||||
if (mdn != null) {
|
||||
yield Right<Failure, Success>(SendReceiptToSenderSuccess(mdn));
|
||||
} else {
|
||||
yield Left<Failure, Success>(SendReceiptToSenderFailure(null));
|
||||
}
|
||||
} catch (e) {
|
||||
yield Left<Failure, Success>(SendReceiptToSenderFailure(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user