TF-4050 refactor: move attachment preview & download logic to download controller

This commit is contained in:
dab246
2025-10-23 12:14:39 +07:00
committed by Dat H. Pham
parent 1398a30ed6
commit 92286b48e1
33 changed files with 1055 additions and 651 deletions
@@ -18,13 +18,13 @@ import 'package:tmail_ui_user/features/login/domain/repository/credential_reposi
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/download_repository.dart';
class DownloadAttachmentForWebInteractor {
final DownloadRepository _downloadRepository;
final DownloadRepository downloadRepository;
final CredentialRepository credentialRepository;
final AccountRepository _accountRepository;
final AuthenticationOIDCRepository _authenticationOIDCRepository;
DownloadAttachmentForWebInteractor(
this._downloadRepository,
this.downloadRepository,
this.credentialRepository,
this._accountRepository,
this._authenticationOIDCRepository);
@@ -56,7 +56,7 @@ class DownloadAttachmentForWebInteractor {
);
}
final bytesDownloaded = await _downloadRepository.downloadAttachmentForWeb(
final bytesDownloaded = await downloadRepository.downloadAttachmentForWeb(
taskId,
attachment,
accountId,
@@ -9,7 +9,6 @@ import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:model/download/download_task_id.dart';
import 'package:model/email/attachment.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/get_html_content_from_attachment_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart';
@@ -17,11 +16,9 @@ import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment
class GetHtmlContentFromAttachmentInteractor {
GetHtmlContentFromAttachmentInteractor(
this._downloadAttachmentForWebInteractor,
this._emailRepository,
);
final DownloadAttachmentForWebInteractor _downloadAttachmentForWebInteractor;
final EmailRepository _emailRepository;
Stream<Either<Failure, Success>> execute(
AccountId accountId,
@@ -89,10 +86,10 @@ class GetHtmlContentFromAttachmentInteractor {
Attachment attachment,
) async {
try {
final sanitizedHtmlContent = await _emailRepository.sanitizeHtmlContent(
htmlContent,
transformConfiguration,
);
final sanitizedHtmlContent = await _downloadAttachmentForWebInteractor
.downloadRepository
.sanitizeHtmlContent(htmlContent, transformConfiguration);
return Right(GetHtmlContentFromAttachmentSuccess(
sanitizedHtmlContent: sanitizedHtmlContent,
htmlAttachmentTitle: attachment.generateFileName(),
@@ -1,19 +1,19 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/get_preview_email_eml_content_shared_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/download_repository.dart';
class GetPreviewEmailEMLContentSharedInteractor {
final EmailRepository _emailRepository;
final DownloadRepository _downloadRepository;
const GetPreviewEmailEMLContentSharedInteractor(this._emailRepository);
const GetPreviewEmailEMLContentSharedInteractor(this._downloadRepository);
Stream<Either<Failure, Success>> execute(String keyStored) async* {
try {
yield Right<Failure, Success>(GettingPreviewEmailEMLContentShared());
final previewEMLContent = await _emailRepository
final previewEMLContent = await _downloadRepository
.getPreviewEmailEMLContentShared(keyStored);
yield Right<Failure, Success>(GetPreviewEmailEMLContentSharedSuccess(previewEMLContent));
@@ -1,18 +1,18 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/get_preview_eml_content_in_memory_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/download_repository.dart';
class GetPreviewEmlContentInMemoryInteractor {
final EmailRepository _emailRepository;
final DownloadRepository _downloadRepository;
const GetPreviewEmlContentInMemoryInteractor(this._emailRepository);
const GetPreviewEmlContentInMemoryInteractor(this._downloadRepository);
Stream<Either<Failure, Success>> execute(String keyStored) async* {
try {
yield Right<Failure, Success>(GettingPreviewEMLContentInMemory());
final emlPreviewer = await _emailRepository.getPreviewEMLContentInMemory(keyStored);
final emlPreviewer = await _downloadRepository.getPreviewEMLContentInMemory(keyStored);
yield Right<Failure, Success>(GetPreviewEMLContentInMemorySuccess(emlPreviewer));
} catch (e) {
yield Left<Failure, Success>(GetPreviewEMLContentInMemoryFailure(
@@ -1,21 +1,23 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/move_preview_eml_content_from_persistent_to_memory_state.dart';
import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/download_repository.dart';
class MovePreviewEmlContentFromPersistentToMemoryInteractor {
final EmailRepository _emailRepository;
final DownloadRepository _downloadRepository;
const MovePreviewEmlContentFromPersistentToMemoryInteractor(this._emailRepository);
const MovePreviewEmlContentFromPersistentToMemoryInteractor(
this._downloadRepository,
);
Stream<Either<Failure, Success>> execute(EMLPreviewer emlPreviewer) async* {
try {
yield Right<Failure, Success>(MovingPreviewEmailEMLContentFromPersistentToMemory());
await Future.wait([
_emailRepository.removePreviewEmailEMLContentShared(emlPreviewer.id),
_emailRepository.storePreviewEMLContentToSessionStorage(emlPreviewer),
_downloadRepository.removePreviewEmailEMLContentShared(emlPreviewer.id),
_downloadRepository.storePreviewEMLContentToSessionStorage(emlPreviewer),
]);
yield Right<Failure, Success>(MovePreviewEmailEMLContentFromPersistentToMemorySuccess());
} catch (e) {
@@ -3,29 +3,38 @@ 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/id.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:tmail_ui_user/features/email/domain/state/parse_email_by_blob_id_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/download_repository.dart';
class ParseEmailByBlobIdInteractor {
final EmailRepository _emailRepository;
final DownloadRepository _downloadRepository;
const ParseEmailByBlobIdInteractor(this._emailRepository);
const ParseEmailByBlobIdInteractor(this._downloadRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, Id blobId) async* {
Stream<Either<Failure, Success>> execute(
AccountId accountId,
Session session,
String ownEmailAddress,
Id blobId,
) async* {
try {
yield Right<Failure, Success>(ParsingEmailByBlobId());
final emailParsed = await _emailRepository.parseEmailByBlobIds(
final emailParsed = await _downloadRepository.parseEmailByBlobIds(
accountId,
{blobId},
);
yield Right<Failure, Success>(ParseEmailByBlobIdSuccess(
emailParsed.first,
blobId,
email: emailParsed.first,
blobId: blobId,
session: session,
accountId: accountId,
ownEmailAddress: ownEmailAddress,
));
} catch (e) {
yield Left<Failure, Success>(ParseEmailByBlobIdFailure(e));
}
}
}
}
@@ -3,14 +3,14 @@ import 'package:core/presentation/state/success.dart';
import 'package:core/utils/platform_info.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/email/domain/model/preview_email_eml_request.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/preview_email_from_eml_file_state.dart';
import 'package:tmail_ui_user/features/email/presentation/model/eml_previewer.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/download_repository.dart';
class PreviewEmailFromEmlFileInteractor {
final EmailRepository _emailRepository;
final DownloadRepository _downloadRepository;
const PreviewEmailFromEmlFileInteractor(this._emailRepository);
const PreviewEmailFromEmlFileInteractor(this._downloadRepository);
Stream<Either<Failure, Success>> execute(
PreviewEmailEMLRequest previewEmailEMLRequest,
@@ -18,7 +18,7 @@ class PreviewEmailFromEmlFileInteractor {
try {
yield Right<Failure, Success>(PreviewingEmailFromEmlFile());
final previewEMLContent = await _emailRepository
final previewEMLContent = await _downloadRepository
.generatePreviewEmailEMLContent(previewEmailEMLRequest);
final emlPreviewer = EMLPreviewer(
@@ -29,13 +29,22 @@ class PreviewEmailFromEmlFileInteractor {
if (PlatformInfo.isWeb) {
if (previewEmailEMLRequest.isShared) {
await _emailRepository.sharePreviewEmailEMLContent(emlPreviewer);
await _downloadRepository.sharePreviewEmailEMLContent(emlPreviewer);
} else {
await _emailRepository.storePreviewEMLContentToSessionStorage(emlPreviewer);
await _downloadRepository.storePreviewEMLContentToSessionStorage(
emlPreviewer,
);
}
}
yield Right<Failure, Success>(PreviewEmailFromEmlFileSuccess(emlPreviewer));
yield Right<Failure, Success>(
PreviewEmailFromEmlFileSuccess(
emlPreviewer,
previewEmailEMLRequest.accountId,
previewEmailEMLRequest.session,
previewEmailEMLRequest.ownEmailAddress,
),
);
} catch (e) {
yield Left<Failure, Success>(PreviewEmailFromEmlFileFailure(e));
}
@@ -1,18 +1,18 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/remove_preview_email_eml_content_shared_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/download_repository.dart';
class RemovePreviewEmailEmlContentSharedInteractor {
final EmailRepository _emailRepository;
final DownloadRepository _downloadRepository;
const RemovePreviewEmailEmlContentSharedInteractor(this._emailRepository);
const RemovePreviewEmailEmlContentSharedInteractor(this._downloadRepository);
Stream<Either<Failure, Success>> execute(String keyStored) async* {
try {
yield Right<Failure, Success>(RemovingPreviewEmailEMLContentShared());
await _emailRepository.removePreviewEmailEMLContentShared(keyStored);
await _downloadRepository.removePreviewEmailEMLContentShared(keyStored);
yield Right<Failure, Success>(RemovePreviewEmailEMLContentSharedSuccess());
} catch (e) {
yield Left<Failure, Success>(RemovePreviewEmailEMLContentSharedFailure(e));