From 002a543865c859d73bd8c18782de7ea28c2708f4 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 20 Jun 2023 22:28:01 +0700 Subject: [PATCH] TF-1923 Fix logic get stored email when offline (cherry picked from commit fa74abdf2663e80e445236449c5aec3e5c9267e5) --- .../data/datasource/email_datasource.dart | 2 +- .../email_datasource_impl.dart | 2 +- .../email_hive_cache_datasource_impl.dart | 7 +++-- .../repository/email_repository_impl.dart | 4 +-- .../exceptions/email_cache_exceptions.dart | 4 ++- .../domain/repository/email_repository.dart | 2 +- .../data/local/email_cache_manager.dart | 10 +++++-- .../usecases/get_email_by_id_interactor.dart | 26 +++++++------------ 8 files changed, 28 insertions(+), 29 deletions(-) diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index ab11f90b5..d2d7793d9 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -82,7 +82,7 @@ abstract class EmailDataSource { Future storeEmail(Session session, AccountId accountId, Email email); - Future getEmailStored(Session session, AccountId accountId, EmailId emailId); + Future getStoredEmail(Session session, AccountId accountId, EmailId emailId); Future storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail); 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 7db4432d0..d3d26296b 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -185,7 +185,7 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future getEmailStored(Session session, AccountId accountId, EmailId emailId) { + Future getStoredEmail(Session session, AccountId accountId, EmailId emailId) { throw UnimplementedError(); } 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 5433abff1..f46beb033 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 @@ -229,11 +229,10 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { } @override - Future getEmailStored(Session session, AccountId accountId, EmailId emailId) { + Future getStoredEmail(Session session, AccountId accountId, EmailId emailId) { return Future.sync(() async { - final email = await _emailCacheManager.getEmailFromCache(accountId, session.username, emailId); - log('EmailHiveCacheDataSourceImpl::getEmailFromCache():emailId: $email'); - return email?.toEmail(); + final email = await _emailCacheManager.getStoredEmail(accountId, session.username, emailId); + return email.toEmail(); }).catchError(_exceptionThrower.throwException); } diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index f6d576e9c..04dd17c58 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -210,8 +210,8 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future getEmailStored(Session session, AccountId accountId, EmailId emailId) { - return emailDataSource[DataSourceType.hiveCache]!.getEmailStored(session, accountId, emailId); + Future getStoredEmail(Session session, AccountId accountId, EmailId emailId) { + return emailDataSource[DataSourceType.hiveCache]!.getStoredEmail(session, accountId, emailId); } @override diff --git a/lib/features/email/domain/exceptions/email_cache_exceptions.dart b/lib/features/email/domain/exceptions/email_cache_exceptions.dart index c0d85bf17..a167cfa3e 100644 --- a/lib/features/email/domain/exceptions/email_cache_exceptions.dart +++ b/lib/features/email/domain/exceptions/email_cache_exceptions.dart @@ -1,4 +1,6 @@ class NotFoundStoredOpenedEmailException implements Exception {} -class NotFoundStoredNewEmailException implements Exception {} \ No newline at end of file +class NotFoundStoredNewEmailException implements Exception {} + +class NotFoundStoredEmailException implements Exception {} \ 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 1c74287a2..11d413545 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -94,7 +94,7 @@ abstract class EmailRepository { Future storeEmail(Session session, AccountId accountId, Email email); - Future getEmailStored(Session session, AccountId accountId, EmailId emailId); + Future getStoredEmail(Session session, AccountId accountId, EmailId emailId); Future storeOpenedEmail(Session session, AccountId accountId, DetailedEmail detailedEmail); diff --git a/lib/features/thread/data/local/email_cache_manager.dart b/lib/features/thread/data/local/email_cache_manager.dart index 34d7a72a4..0e37fe9d5 100644 --- a/lib/features/thread/data/local/email_cache_manager.dart +++ b/lib/features/thread/data/local/email_cache_manager.dart @@ -7,6 +7,7 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/caching/clients/email_cache_client.dart'; import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/email_cleanup_rule.dart'; +import 'package:tmail_ui_user/features/email/domain/exceptions/email_cache_exceptions.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/email_cache_extension.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/email_extension.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/list_email_cache_extension.dart'; @@ -97,8 +98,13 @@ class EmailCacheManager { return _emailCacheClient.insertItem(keyCache, emailCache); } - Future getEmailFromCache(AccountId accountId, UserName userName, EmailId emailId) { + Future getStoredEmail(AccountId accountId, UserName userName, EmailId emailId) async { final keyCache = TupleKey(emailId.asString, accountId.asString, userName.value).encodeKey; - return _emailCacheClient.getItem(keyCache, needToReopen: true); + final emailCache = await _emailCacheClient.getItem(keyCache, needToReopen: true); + if (emailCache != null) { + return emailCache; + } else { + throw NotFoundStoredEmailException(); + } } } \ No newline at end of file diff --git a/lib/features/thread/domain/usecases/get_email_by_id_interactor.dart b/lib/features/thread/domain/usecases/get_email_by_id_interactor.dart index 267329851..65b0ccc47 100644 --- a/lib/features/thread/domain/usecases/get_email_by_id_interactor.dart +++ b/lib/features/thread/domain/usecases/get_email_by_id_interactor.dart @@ -1,7 +1,6 @@ -import 'dart:io'; - import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/app_logger.dart'; import 'package:core/utils/platform_info.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; @@ -30,11 +29,12 @@ class GetEmailByIdInteractor { try { yield Right(GetEmailByIdLoading()); if (PlatformInfo.isMobile) { - yield* _tryToGetEmailFromCache(session, accountId, emailId, properties: properties); + yield* _getStoredEmail(session, accountId, emailId, properties: properties); } else { yield* _getEmailByIdFromServer(session, accountId, emailId, properties: properties); } } catch (e) { + logError('GetEmailByIdInteractor::execute():EXCEPTION: $e'); yield Left(GetEmailByIdFailure(e)); } } @@ -51,12 +51,13 @@ class GetEmailByIdInteractor { final email = await _threadRepository.getEmailById(session, accountId, emailId, properties: properties); yield Right(GetEmailByIdSuccess(email)); } catch (e) { + logError('GetEmailByIdInteractor::_getEmailByIdFromServer():EXCEPTION: $e'); yield Left(GetEmailByIdFailure(e)); } } - Stream> _tryToGetEmailFromCache( + Stream> _getStoredEmail( Session session, AccountId accountId, EmailId emailId, @@ -65,20 +66,11 @@ class GetEmailByIdInteractor { } ) async* { try { - - final email = await _emailRepository.getEmailStored(session, accountId, emailId); - - if (email != null) { - yield Right(GetEmailByIdSuccess(email.toPresentationEmail())); - } else { - yield* _getEmailByIdFromServer(session, accountId, emailId, properties: properties); - } + final email = await _emailRepository.getStoredEmail(session, accountId, emailId); + yield Right(GetEmailByIdSuccess(email.toPresentationEmail())); } catch (e) { - if (e is PathNotFoundException) { - yield* _getEmailByIdFromServer(session, accountId, emailId, properties: properties); - } else { - yield Left(GetEmailByIdFailure(e)); - } + logError('GetEmailByIdInteractor::_tryToGetEmailFromCache():EXCEPTION: $e'); + yield* _getEmailByIdFromServer(session, accountId, emailId, properties: properties); } } } \ No newline at end of file