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.htmlBody,
|
||||||
EmailProperty.attachments,
|
EmailProperty.attachments,
|
||||||
EmailProperty.headers,
|
EmailProperty.headers,
|
||||||
EmailProperty.keywords
|
EmailProperty.keywords,
|
||||||
|
EmailProperty.mailboxIds,
|
||||||
}))
|
}))
|
||||||
..addFetchHTMLBodyValues(true);
|
..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:core/core.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
|
|
||||||
class GetEmailContentLoading extends UIState {
|
class GetEmailContentLoading extends UIState {
|
||||||
@@ -13,13 +14,13 @@ class GetEmailContentSuccess extends UIState {
|
|||||||
final List<EmailContent> emailContents;
|
final List<EmailContent> emailContents;
|
||||||
final List<EmailContent> emailContentsDisplayed;
|
final List<EmailContent> emailContentsDisplayed;
|
||||||
final List<Attachment> attachments;
|
final List<Attachment> attachments;
|
||||||
final bool readReceiptRequested;
|
final Email? emailCurrent;
|
||||||
|
|
||||||
GetEmailContentSuccess(
|
GetEmailContentSuccess(
|
||||||
this.emailContents,
|
this.emailContents,
|
||||||
this.emailContentsDisplayed,
|
this.emailContentsDisplayed,
|
||||||
this.attachments,
|
this.attachments,
|
||||||
this.readReceiptRequested
|
this.emailCurrent
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -27,7 +28,7 @@ class GetEmailContentSuccess extends UIState {
|
|||||||
emailContents,
|
emailContents,
|
||||||
emailContentsDisplayed,
|
emailContentsDisplayed,
|
||||||
attachments,
|
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,
|
newEmailContents,
|
||||||
newEmailContentsDisplayed,
|
newEmailContentsDisplayed,
|
||||||
email.allAttachments,
|
email.allAttachments,
|
||||||
email.needShowNotificationMessageReadReceipt));
|
email));
|
||||||
} else if (email.allAttachments.isNotEmpty) {
|
} else if (email.allAttachments.isNotEmpty) {
|
||||||
yield Right<Failure, Success>(GetEmailContentSuccess(
|
yield Right<Failure, Success>(GetEmailContentSuccess([], [], email.allAttachments, email));
|
||||||
[],
|
|
||||||
[],
|
|
||||||
email.allAttachments,
|
|
||||||
email.needShowNotificationMessageReadReceipt));
|
|
||||||
} else if (email.headers?.isNotEmpty == true) {
|
} else if (email.headers?.isNotEmpty == true) {
|
||||||
yield Right<Failure, Success>(GetEmailContentSuccess(
|
yield Right<Failure, Success>(GetEmailContentSuccess([], [], [], email));
|
||||||
[],
|
|
||||||
[],
|
|
||||||
[],
|
|
||||||
email.needShowNotificationMessageReadReceipt));
|
|
||||||
} else {
|
} else {
|
||||||
yield Left(GetEmailContentFailure(null));
|
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