TF-1810 Add GetDetailedEmailByIdInteractor to get detailed email
(cherry picked from commit 765cebec00ae26458fe7f5e17ec6026f82f1fd0f)
This commit is contained in:
@@ -1,2 +1,4 @@
|
||||
|
||||
class CannotDeleteOldEmailException implements Exception {}
|
||||
class CannotDeleteOldEmailException implements Exception {}
|
||||
|
||||
class NotFoundEmailException implements Exception {}
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:model/extensions/email_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
|
||||
|
||||
extension EmailExtension on Email {
|
||||
DetailedEmail toDetailedEmail({String? htmlEmailContent}) {
|
||||
return DetailedEmail(
|
||||
emailId: id!,
|
||||
attachments: allAttachments,
|
||||
headers: headers?.toList(),
|
||||
htmlEmailContent: htmlEmailContent
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -89,4 +89,6 @@ abstract class EmailRepository {
|
||||
Future<jmap.State?> getEmailState(Session session, AccountId accountId);
|
||||
|
||||
Future<void> storeDetailedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail);
|
||||
|
||||
Future<Email> getDetailedEmailById(Session session, AccountId accountId, EmailId emailId);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:model/email/presentation_email.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
|
||||
|
||||
class GetDetailedEmailByIdLoading extends UIState {}
|
||||
|
||||
class GetDetailedEmailByIdSuccess extends UIState {
|
||||
|
||||
final PresentationEmail presentationEmail;
|
||||
final DetailedEmail detailedEmail;
|
||||
|
||||
GetDetailedEmailByIdSuccess(this.presentationEmail, this.detailedEmail);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [presentationEmail, detailedEmail];
|
||||
}
|
||||
|
||||
class GetDetailedEmailByIdFailure extends FeatureFailure {
|
||||
|
||||
GetDetailedEmailByIdFailure(dynamic exception) : super(exception: exception);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [exception];
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
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:model/email/presentation_email.dart';
|
||||
import 'package:model/extensions/email_extension.dart';
|
||||
import 'package:model/extensions/list_attachment_extension.dart';
|
||||
import 'package:model/extensions/list_email_content_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/extensions/email_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/get_detailed_email_by_id_state.dart';
|
||||
|
||||
class GetDetailedEmailByIdInteractor {
|
||||
final EmailRepository _emailRepository;
|
||||
|
||||
GetDetailedEmailByIdInteractor(this._emailRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
EmailId emailId,
|
||||
String? baseDownloadUrl
|
||||
) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(GetDetailedEmailByIdLoading());
|
||||
|
||||
final email = await _emailRepository.getDetailedEmailById(session, accountId, emailId);
|
||||
|
||||
final parsedEmail = await _parsingEmailToDetailedEmail(accountId, email, baseDownloadUrl);
|
||||
|
||||
yield Right<Failure, Success>(GetDetailedEmailByIdSuccess(parsedEmail.value1, parsedEmail.value2));
|
||||
} catch (e) {
|
||||
yield Left<Failure, Success>(GetDetailedEmailByIdFailure(e));
|
||||
}
|
||||
}
|
||||
|
||||
Future<Tuple2<PresentationEmail, DetailedEmail>> _parsingEmailToDetailedEmail(
|
||||
AccountId accountId,
|
||||
Email email,
|
||||
String? baseDownloadUrl
|
||||
) async {
|
||||
String? htmlEmailContent;
|
||||
|
||||
final listEmailContent = email.emailContentList;
|
||||
if (listEmailContent.isNotEmpty) {
|
||||
final newEmailContents = await _emailRepository.transformEmailContent(
|
||||
listEmailContent,
|
||||
email.allAttachments.listAttachmentsDisplayedInContent,
|
||||
baseDownloadUrl,
|
||||
accountId);
|
||||
|
||||
htmlEmailContent = newEmailContents.asHtmlString;
|
||||
}
|
||||
|
||||
final detailedEmail = email.toDetailedEmail(htmlEmailContent: htmlEmailContent);
|
||||
final presentationEmail = email.toPresentationEmail();
|
||||
|
||||
return Tuple2(presentationEmail, detailedEmail);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user