TF-1810 Add StoreDetailedEmailToCacheInteractor to store detailed email to cache

(cherry picked from commit 60a91537f7ea1225b5ca67f6dd9ef358b33939da)
This commit is contained in:
dab246
2023-05-10 12:06:20 +07:00
committed by Dat Vu
parent d6a5c88281
commit 892fceb037
28 changed files with 440 additions and 75 deletions
@@ -0,0 +1,17 @@
import 'package:model/email/attachment.dart';
import 'package:tmail_ui_user/features/offline_mode/model/attachment_hive_cache.dart';
extension AttachmentExtension on Attachment {
AttachmentHiveCache toHiveCache() {
return AttachmentHiveCache(
partId: partId?.value,
blobId: blobId?.value,
size: size?.value.toInt(),
name: name,
type: type?.mimeType,
cid: cid,
disposition: disposition?.name
);
}
}
@@ -0,0 +1,31 @@
import 'package:model/extensions/email_id_extensions.dart';
import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart';
import 'package:tmail_ui_user/features/email/domain/extensions/list_attachments_extension.dart';
import 'package:tmail_ui_user/features/email/domain/extensions/list_email_header_extension.dart';
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
import 'package:tmail_ui_user/features/offline_mode/model/detailed_email_hive_cache.dart';
extension DetailedEmailExtension on DetailedEmail {
DetailedEmailHiveCache toHiveCache() {
return DetailedEmailHiveCache(
emailId: emailId.asString,
timeSaved: DateTime.now(),
attachments: attachments?.toHiveCache(),
headers: headers?.toHiveCache(),
emailContentPath: emailContentPath
);
}
String get folderPath => '${CachingConstants.appFolderName}/${CachingConstants.emailContentFolderName}';
DetailedEmail fromEmailContentPath(String path) {
return DetailedEmail(
emailId: emailId,
attachments: attachments,
headers: headers,
htmlEmailContent: htmlEmailContent,
emailContentPath: path,
);
}
}
@@ -0,0 +1,7 @@
import 'package:jmap_dart_client/jmap/mail/email/email_header.dart';
import 'package:tmail_ui_user/features/offline_mode/model/email_header_hive_cache.dart';
extension EmailHeaderExtension on EmailHeader {
EmailHeaderHiveCache toHiveCache() => EmailHeaderHiveCache(name: name, value: value);
}
@@ -0,0 +1,8 @@
import 'package:model/email/attachment.dart';
import 'package:tmail_ui_user/features/email/domain/extensions/attachment_extension.dart';
import 'package:tmail_ui_user/features/offline_mode/model/attachment_hive_cache.dart';
extension ListAttachmentsExtension on List<Attachment> {
List<AttachmentHiveCache> toHiveCache() => map((attachment) => attachment.toHiveCache()).toList();
}
@@ -0,0 +1,8 @@
import 'package:jmap_dart_client/jmap/mail/email/email_header.dart';
import 'package:tmail_ui_user/features/email/domain/extensions/email_header_extension.dart';
import 'package:tmail_ui_user/features/offline_mode/model/email_header_hive_cache.dart';
extension ListEmailHeaderExtension on List<EmailHeader> {
List<EmailHeaderHiveCache> toHiveCache() => map((emailHeader) => emailHeader.toHiveCache()).toList();
}
@@ -0,0 +1,29 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_header.dart';
import 'package:model/email/attachment.dart';
class DetailedEmail with EquatableMixin {
final EmailId emailId;
final List<Attachment>? attachments;
final List<EmailHeader>? headers;
final String? htmlEmailContent;
final String? emailContentPath;
DetailedEmail({
required this.emailId,
this.attachments,
this.headers,
this.htmlEmailContent,
this.emailContentPath
});
@override
List<Object?> get props => [
emailId,
attachments,
headers,
htmlEmailContent,
emailContentPath
];
}
@@ -17,6 +17,7 @@ import 'package:model/email/email_content.dart';
import 'package:model/email/mark_star_action.dart';
import 'package:model/email/read_actions.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
@@ -86,4 +87,6 @@ abstract class EmailRepository {
Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId);
Future<jmap.State?> getEmailState(Session session, AccountId accountId);
Future<void> storeDetailedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail);
}
@@ -0,0 +1,13 @@
import 'package:core/core.dart';
class StoreDetailedEmailToCacheLoading extends UIState {}
class StoreDetailedEmailToCacheSuccess extends UIState {}
class StoreDetailedEmailToCacheFailure extends FeatureFailure {
StoreDetailedEmailToCacheFailure(dynamic exception) : super(exception: exception);
@override
List<Object?> get props => [exception];
}
@@ -0,0 +1,24 @@
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: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/store_detailed_email_to_cache_state.dart';
class StoreDetailedEmailToCacheInteractor {
final EmailRepository _emailRepository;
StoreDetailedEmailToCacheInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, DetailedEmail detailedEmail) async* {
try {
yield Right<Failure, Success>(StoreDetailedEmailToCacheLoading());
await _emailRepository.storeDetailedEmailToCache(session, accountId, detailedEmail);
yield Right<Failure, Success>(StoreDetailedEmailToCacheSuccess());
} catch (e) {
yield Left<Failure, Success>(StoreDetailedEmailToCacheFailure(e));
}
}
}