TF-1809: Create func get detailed email in data layer
(cherry picked from commit 76a5e6fddfc7fb79e9e487d914b29de784ba523f)
This commit is contained in:
@@ -81,4 +81,6 @@ abstract class EmailDataSource {
|
|||||||
Future<void> storeEmail(Session session, AccountId accountId, Email email);
|
Future<void> storeEmail(Session session, AccountId accountId, Email email);
|
||||||
|
|
||||||
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail);
|
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail);
|
||||||
|
|
||||||
|
Future<DetailedEmail?> getOpenedEmail(Session session, AccountId accountId, EmailId emailId);
|
||||||
}
|
}
|
||||||
@@ -171,4 +171,9 @@ class EmailDataSourceImpl extends EmailDataSource {
|
|||||||
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
|
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) {
|
||||||
throw UnimplementedError();
|
throw UnimplementedError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<DetailedEmail> getOpenedEmail(Session session, AccountId accountId, EmailId emailId) {
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -19,9 +19,11 @@ import 'package:model/email/attachment.dart';
|
|||||||
import 'package:model/email/mark_star_action.dart';
|
import 'package:model/email/mark_star_action.dart';
|
||||||
import 'package:model/email/read_actions.dart';
|
import 'package:model/email/read_actions.dart';
|
||||||
import 'package:model/extensions/email_id_extensions.dart';
|
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/composer/domain/model/email_request.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||||
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
|
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/extensions/detailed_email_extension.dart';
|
import 'package:tmail_ui_user/features/email/domain/extensions/detailed_email_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/extensions/detailed_email_hive_cache_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.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/email/domain/model/move_to_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||||
@@ -161,7 +163,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
|
|||||||
final task = HiveTask(
|
final task = HiveTask(
|
||||||
runnable: () async {
|
runnable: () async {
|
||||||
|
|
||||||
final detailedEmailExisted = await _openedEmailCacheManager.isOpenedDetailEmailCached(accountId, session.username,detailedEmail);
|
final detailedEmailExisted = await _openedEmailCacheManager.isOpenedDetailEmailCached(accountId, session.username, detailedEmail);
|
||||||
log('EmailHiveCacheDataSourceImpl::storeOpenedEmail():detailedEmailExisted: $detailedEmailExisted');
|
log('EmailHiveCacheDataSourceImpl::storeOpenedEmail():detailedEmailExisted: $detailedEmailExisted');
|
||||||
|
|
||||||
if (detailedEmailExisted) {
|
if (detailedEmailExisted) {
|
||||||
@@ -186,4 +188,18 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
|
|||||||
return _openedEmailCacheWorkerQueue.addTask(task);
|
return _openedEmailCacheWorkerQueue.addTask(task);
|
||||||
}).catchError(_exceptionThrower.throwException);
|
}).catchError(_exceptionThrower.throwException);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<DetailedEmail?> getOpenedEmail(Session session, AccountId accountId, EmailId emailId) {
|
||||||
|
return Future.sync(() async {
|
||||||
|
final detailedEmailHiveCache = await _openedEmailCacheManager.getDetailEmailExistedInCache(accountId, session.username, emailId);
|
||||||
|
|
||||||
|
final emailContent = await _fileUtils.getContentFromFile(
|
||||||
|
nameFile: emailId.asString,
|
||||||
|
folderPath: CachingConstants.emailContentFolderName
|
||||||
|
);
|
||||||
|
|
||||||
|
return detailedEmailHiveCache?.toDetailedEmailWithContent(emailContent);
|
||||||
|
}).catchError(_exceptionThrower.throwException);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -205,7 +205,7 @@ class EmailRepositoryImpl extends EmailRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<DetailedEmail> getOpenedEmail(Session session, AccountId accountId) {
|
Future<DetailedEmail> getOpenedEmail(Session session, AccountId accountId, EmailId emailId) {
|
||||||
throw UnimplementedError();
|
throw UnimplementedError();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import 'package:http_parser/http_parser.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_body_part.dart';
|
||||||
|
import 'package:model/email/attachment.dart';
|
||||||
|
import 'package:tmail_ui_user/features/offline_mode/model/attachment_hive_cache.dart';
|
||||||
|
|
||||||
|
extension AttachmentExtension on AttachmentHiveCache {
|
||||||
|
Attachment toAttachment() {
|
||||||
|
return Attachment(
|
||||||
|
partId: PartId(partId!),
|
||||||
|
blobId: Id(blobId!),
|
||||||
|
size: UnsignedInt(size!),
|
||||||
|
name: name,
|
||||||
|
type: MediaType.parse(type!),
|
||||||
|
cid: cid,
|
||||||
|
disposition: disposition?.toContentDisposition(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/extensions/list_acttachments_hive_cache_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/extensions/list_email_header_hive_cache_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 DetailedEmailHiveCacheExtension on DetailedEmailHiveCache {
|
||||||
|
DetailedEmail toDetailedEmailWithContent(String emailContent) {
|
||||||
|
return DetailedEmail(
|
||||||
|
emailId: EmailId(Id(emailId)),
|
||||||
|
attachments: attachments?.toAttachment(),
|
||||||
|
headers: headers?.toListEmailHeader(),
|
||||||
|
htmlEmailContent: emailContent,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
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 EmailHeaderHiveCacheExtension on EmailHeaderHiveCache {
|
||||||
|
EmailHeader toEmailHeader() => EmailHeader(name, value);
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import 'package:model/email/attachment.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/extensions/attachment_hive_cache_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/offline_mode/model/attachment_hive_cache.dart';
|
||||||
|
|
||||||
|
extension ListAttachmentsHiveCacheExtension on List<AttachmentHiveCache> {
|
||||||
|
List<Attachment> toAttachment() => map((attachmentHiveCache) => attachmentHiveCache.toAttachment()).toList();
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_header.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/extensions/email_header_hive_cache_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/offline_mode/model/email_header_hive_cache.dart';
|
||||||
|
|
||||||
|
extension ListEmailHeaderExtension on List<EmailHeaderHiveCache> {
|
||||||
|
List<EmailHeader> toListEmailHeader() => map((emailHeaderHiveCache) => emailHeaderHiveCache.toEmailHeader()).toList();
|
||||||
|
}
|
||||||
@@ -96,5 +96,5 @@ abstract class EmailRepository {
|
|||||||
|
|
||||||
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail);
|
Future<void> storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail);
|
||||||
|
|
||||||
Future<DetailedEmail> getOpenedEmail(Session session, AccountId accountId);
|
Future<DetailedEmail> getOpenedEmail(Session session, AccountId accountId, EmailId emailId);
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@ import 'package:core/presentation/state/success.dart';
|
|||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.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/core/session/session.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/get_opened_email_from_cache_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/get_opened_email_from_cache_state.dart';
|
||||||
|
|
||||||
@@ -12,10 +13,10 @@ class GetOpenedEmailFromCacheInteractor {
|
|||||||
|
|
||||||
GetOpenedEmailFromCacheInteractor(this._emailRepository);
|
GetOpenedEmailFromCacheInteractor(this._emailRepository);
|
||||||
|
|
||||||
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId) async* {
|
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, EmailId emailId) async* {
|
||||||
try {
|
try {
|
||||||
yield Right<Failure, Success>(GetOpenedEmailLoading());
|
yield Right<Failure, Success>(GetOpenedEmailLoading());
|
||||||
final detailedEmail = await _emailRepository.getOpenedEmail(session, accountId);
|
final detailedEmail = await _emailRepository.getOpenedEmail(session, accountId, emailId);
|
||||||
yield Right<Failure, Success>(GetOpenedEmailSuccess(detailedEmail));
|
yield Right<Failure, Success>(GetOpenedEmailSuccess(detailedEmail));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left<Failure, Success>(GetOpenedEmailFailure(e));
|
yield Left<Failure, Success>(GetOpenedEmailFailure(e));
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'package:core/utils/app_logger.dart';
|
|||||||
import 'package:core/utils/file_utils.dart';
|
import 'package:core/utils/file_utils.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:model/extensions/account_id_extensions.dart';
|
import 'package:model/extensions/account_id_extensions.dart';
|
||||||
import 'package:model/extensions/email_id_extensions.dart';
|
import 'package:model/extensions/email_id_extensions.dart';
|
||||||
import 'package:tmail_ui_user/features/caching/clients/opened_email_hive_cache_client.dart';
|
import 'package:tmail_ui_user/features/caching/clients/opened_email_hive_cache_client.dart';
|
||||||
@@ -67,9 +68,9 @@ class OpenedEmailCacheManager {
|
|||||||
DetailedEmail detailedEmail
|
DetailedEmail detailedEmail
|
||||||
) async {
|
) async {
|
||||||
final emailContentPathExists = await _isFileExisted(detailedEmail);
|
final emailContentPathExists = await _isFileExisted(detailedEmail);
|
||||||
final detailedEmailCacheExists = await _isDetailEmailExistedInCache(accountId, userName, detailedEmail);
|
final detailedEmailCacheExists = await getDetailEmailExistedInCache(accountId, userName, detailedEmail.emailId);
|
||||||
|
|
||||||
return emailContentPathExists == true && detailedEmailCacheExists;
|
return emailContentPathExists == true && detailedEmailCacheExists != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool?> _isFileExisted(DetailedEmail detailedEmail) async {
|
Future<bool?> _isFileExisted(DetailedEmail detailedEmail) async {
|
||||||
@@ -81,14 +82,15 @@ class OpenedEmailCacheManager {
|
|||||||
return fileSaved;
|
return fileSaved;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> _isDetailEmailExistedInCache(
|
Future<DetailedEmailHiveCache?> getDetailEmailExistedInCache(
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
UserName userName,
|
UserName userName,
|
||||||
DetailedEmail detailedEmail
|
EmailId emailId
|
||||||
) async {
|
) async {
|
||||||
final keyCache = TupleKey(detailedEmail.emailId.asString, accountId.asString, userName.value).encodeKey;
|
final keyCache = TupleKey(emailId.asString, accountId.asString, userName.value).encodeKey;
|
||||||
final detailedEmailCache = await _cacheClient.getItem(keyCache);
|
final detailedEmailCache = await _cacheClient.getItem(keyCache);
|
||||||
log('OpenedEmailCacheManager::_getDetailedEmailCache():_getDetailedEmailCache: $detailedEmailCache');
|
log('OpenedEmailCacheManager::_getDetailedEmailCache():_getDetailedEmailCache: $detailedEmailCache');
|
||||||
return detailedEmailCache != null;
|
return detailedEmailCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user