diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 7b346cacc..c9ebff048 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -81,4 +81,6 @@ abstract class EmailDataSource { Future storeEmail(Session session, AccountId accountId, Email email); Future storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail); + + Future getOpenedEmail(Session session, AccountId accountId, EmailId emailId); } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart index 82a66cb8e..bb2cc8fb3 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -171,4 +171,9 @@ class EmailDataSourceImpl extends EmailDataSource { Future storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail) { throw UnimplementedError(); } + + @override + Future getOpenedEmail(Session session, AccountId accountId, EmailId emailId) { + throw UnimplementedError(); + } } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart index 842b165a4..6c0ec2132 100644 --- a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart @@ -19,9 +19,11 @@ import 'package:model/email/attachment.dart'; import 'package:model/email/mark_star_action.dart'; import 'package:model/email/read_actions.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/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_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/move_to_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( 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'); if (detailedEmailExisted) { @@ -186,4 +188,18 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { return _openedEmailCacheWorkerQueue.addTask(task); }).catchError(_exceptionThrower.throwException); } + + @override + Future 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); + } } \ No newline at end of file diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 49989e611..5ddc6c0f2 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -205,7 +205,7 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future getOpenedEmail(Session session, AccountId accountId) { + Future getOpenedEmail(Session session, AccountId accountId, EmailId emailId) { throw UnimplementedError(); } } \ No newline at end of file diff --git a/lib/features/email/domain/extensions/attachment_hive_cache_extension.dart b/lib/features/email/domain/extensions/attachment_hive_cache_extension.dart new file mode 100644 index 000000000..8e684b5b7 --- /dev/null +++ b/lib/features/email/domain/extensions/attachment_hive_cache_extension.dart @@ -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(), + ); + } +} \ No newline at end of file diff --git a/lib/features/email/domain/extensions/detailed_email_hive_cache_extension.dart b/lib/features/email/domain/extensions/detailed_email_hive_cache_extension.dart new file mode 100644 index 000000000..a391d7d5f --- /dev/null +++ b/lib/features/email/domain/extensions/detailed_email_hive_cache_extension.dart @@ -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, + ); + } +} \ No newline at end of file diff --git a/lib/features/email/domain/extensions/email_header_hive_cache_extension.dart b/lib/features/email/domain/extensions/email_header_hive_cache_extension.dart new file mode 100644 index 000000000..29255cadc --- /dev/null +++ b/lib/features/email/domain/extensions/email_header_hive_cache_extension.dart @@ -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); +} \ No newline at end of file diff --git a/lib/features/email/domain/extensions/list_acttachments_hive_cache_extension.dart b/lib/features/email/domain/extensions/list_acttachments_hive_cache_extension.dart new file mode 100644 index 000000000..f18ec07d1 --- /dev/null +++ b/lib/features/email/domain/extensions/list_acttachments_hive_cache_extension.dart @@ -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 { + List toAttachment() => map((attachmentHiveCache) => attachmentHiveCache.toAttachment()).toList(); +} \ No newline at end of file diff --git a/lib/features/email/domain/extensions/list_email_header_hive_cache_extension.dart b/lib/features/email/domain/extensions/list_email_header_hive_cache_extension.dart new file mode 100644 index 000000000..2e2794c4f --- /dev/null +++ b/lib/features/email/domain/extensions/list_email_header_hive_cache_extension.dart @@ -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 { + List toListEmailHeader() => map((emailHeaderHiveCache) => emailHeaderHiveCache.toEmailHeader()).toList(); +} \ No newline at end of file diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index b72cacbed..45e51d5f3 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -96,5 +96,5 @@ abstract class EmailRepository { Future storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail); - Future getOpenedEmail(Session session, AccountId accountId); + Future getOpenedEmail(Session session, AccountId accountId, EmailId emailId); } \ No newline at end of file diff --git a/lib/features/email/domain/usecases/get_opened_email_from_cache_interactor.dart b/lib/features/email/domain/usecases/get_opened_email_from_cache_interactor.dart index 6f1b92419..f3966c7af 100644 --- a/lib/features/email/domain/usecases/get_opened_email_from_cache_interactor.dart +++ b/lib/features/email/domain/usecases/get_opened_email_from_cache_interactor.dart @@ -4,6 +4,7 @@ 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: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'; @@ -12,10 +13,10 @@ class GetOpenedEmailFromCacheInteractor { GetOpenedEmailFromCacheInteractor(this._emailRepository); - Stream> execute(Session session, AccountId accountId) async* { + Stream> execute(Session session, AccountId accountId, EmailId emailId) async* { try { yield Right(GetOpenedEmailLoading()); - final detailedEmail = await _emailRepository.getOpenedEmail(session, accountId); + final detailedEmail = await _emailRepository.getOpenedEmail(session, accountId, emailId); yield Right(GetOpenedEmailSuccess(detailedEmail)); } catch (e) { yield Left(GetOpenedEmailFailure(e)); diff --git a/lib/features/offline_mode/manager/opened_email_cache_manager.dart b/lib/features/offline_mode/manager/opened_email_cache_manager.dart index 3f1288caf..3c541146a 100644 --- a/lib/features/offline_mode/manager/opened_email_cache_manager.dart +++ b/lib/features/offline_mode/manager/opened_email_cache_manager.dart @@ -2,6 +2,7 @@ import 'package:core/utils/app_logger.dart'; import 'package:core/utils/file_utils.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/mail/email/email.dart'; import 'package:model/extensions/account_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'; @@ -67,9 +68,9 @@ class OpenedEmailCacheManager { DetailedEmail detailedEmail ) async { 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 _isFileExisted(DetailedEmail detailedEmail) async { @@ -81,14 +82,15 @@ class OpenedEmailCacheManager { return fileSaved; } - Future _isDetailEmailExistedInCache( - AccountId accountId, - UserName userName, - DetailedEmail detailedEmail + Future getDetailEmailExistedInCache( + AccountId accountId, + UserName userName, + EmailId emailId ) 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); log('OpenedEmailCacheManager::_getDetailedEmailCache():_getDetailedEmailCache: $detailedEmailCache'); - return detailedEmailCache != null; + return detailedEmailCache; } + } \ No newline at end of file