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
@@ -2,5 +2,5 @@
enum DataSourceType { enum DataSourceType {
network, network,
local, local,
cache hiveCache;
} }
+32 -25
View File
@@ -6,13 +6,11 @@ import 'package:path_provider/path_provider.dart';
class FileUtils { class FileUtils {
Future<String> _getInternalStorageDirPath( Future<String> _getInternalStorageDirPath({
String nameFile, required String nameFile,
{ String? folderPath,
String? folderPath, String? extensionFile
String? extensionFile }) async {
}
) async {
if (!BuildUtils.isWeb) { if (!BuildUtils.isWeb) {
String fileDirectory = (await getApplicationDocumentsDirectory()).absolute.path; String fileDirectory = (await getApplicationDocumentsDirectory()).absolute.path;
@@ -39,16 +37,14 @@ class FileUtils {
} }
} }
Future<File> saveToFile( Future<File> saveToFile({
String nameFile, required String nameFile,
String content, required String content,
{ String? folderPath,
String? folderPath, String? extensionFile
String? extensionFile }) async {
}) async {
final internalStorageDirPath = await _getInternalStorageDirPath( final internalStorageDirPath = await _getInternalStorageDirPath(
nameFile, nameFile: nameFile,
folderPath: folderPath, folderPath: folderPath,
extensionFile: extensionFile extensionFile: extensionFile
); );
@@ -59,16 +55,13 @@ class FileUtils {
return await file.writeAsString(content, mode: FileMode.append); return await file.writeAsString(content, mode: FileMode.append);
} }
Future<String> getFromFile( Future<String> getFromFile({
String nameFile, required String nameFile,
{ String? folderPath,
String? folderPath, String? extensionFile
String? extensionFile }) async {
}
) async {
final internalStorageDirPath = await _getInternalStorageDirPath( final internalStorageDirPath = await _getInternalStorageDirPath(
nameFile, nameFile: nameFile,
folderPath: folderPath, folderPath: folderPath,
extensionFile: extensionFile extensionFile: extensionFile
); );
@@ -80,4 +73,18 @@ class FileUtils {
return emailContent; return emailContent;
} }
}
enum ExtensionType {
text,
json;
String get value {
switch(this) {
case ExtensionType.text:
return 'txt';
case ExtensionType.json:
return 'json';
}
}
} }
+3 -3
View File
@@ -16,7 +16,7 @@ void main() {
test('Store private HTLM String to File', () async { test('Store private HTLM String to File', () async {
final file = await FileUtils().saveToFile(fileName, fileContent); final file = await FileUtils().saveToFile(nameFile: fileName, content: fileContent);
expect(await file.exists(), equals(true)); expect(await file.exists(), equals(true));
@@ -28,9 +28,9 @@ void main() {
test('Get HTML String from File Private', () async { test('Get HTML String from File Private', () async {
/// Create a temporary file that will be deleted after `getFromFile` is done /// Create a temporary file that will be deleted after `getFromFile` is done
final file = await FileUtils().saveToFile(fileName, fileContent); final file = await FileUtils().saveToFile(nameFile: fileName, content: fileContent);
final htmlString = await FileUtils().getFromFile(fileName); final htmlString = await FileUtils().getFromFile(nameFile: fileName);
expect(htmlString.isNotEmpty, equals(true)); expect(htmlString.isNotEmpty, equals(true));
@@ -1,4 +1,6 @@
import 'package:tmail_ui_user/main/utils/app_constants.dart';
class CachingConstants { class CachingConstants {
static const int MAILBOX_CACHE_IDENTIFY = 1; static const int MAILBOX_CACHE_IDENTIFY = 1;
static const int MAILBOX_RIGHTS_CACHE_IDENTIFY = 2; static const int MAILBOX_RIGHTS_CACHE_IDENTIFY = 2;
@@ -22,4 +24,7 @@ class CachingConstants {
static const String detailedEmailCacheBoxName = 'detailed_email_cache_box'; static const String detailedEmailCacheBoxName = 'detailed_email_cache_box';
static const int maxNumberRecentEmails = 10; static const int maxNumberRecentEmails = 10;
static const String appFolderName = AppConstants.applicationName;
static const String emailContentFolderName = 'EmailContent';
} }
@@ -1,4 +1,5 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:core/utils/file_utils.dart';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart';
@@ -21,6 +22,7 @@ import 'package:tmail_ui_user/features/composer/presentation/controller/rich_tex
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/data/datasource/html_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
@@ -42,6 +44,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_composer_cache_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_composer_cache_on_web_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_manager.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart';
import 'package:tmail_ui_user/features/upload/data/datasource/attachment_upload_datasource.dart'; import 'package:tmail_ui_user/features/upload/data/datasource/attachment_upload_datasource.dart';
import 'package:tmail_ui_user/features/upload/data/datasource_impl/attachment_upload_datasource_impl.dart'; import 'package:tmail_ui_user/features/upload/data/datasource_impl/attachment_upload_datasource_impl.dart';
import 'package:tmail_ui_user/features/upload/data/network/file_uploader.dart'; import 'package:tmail_ui_user/features/upload/data/network/file_uploader.dart';
@@ -89,6 +93,11 @@ class ComposerBindings extends BaseBindings {
Get.find<DioClient>(), Get.find<DioClient>(),
Get.find<RemoteExceptionThrower>())); Get.find<RemoteExceptionThrower>()));
Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>(), Get.find<CacheExceptionThrower>())); Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>(), Get.find<CacheExceptionThrower>()));
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<DetailedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<FileUtils>(),
Get.find<CacheExceptionThrower>()));
} }
@override @override
@@ -116,9 +125,12 @@ class ComposerBindings extends BaseBindings {
Get.find<StateDataSource>(), Get.find<StateDataSource>(),
)); ));
Get.lazyPut(() => EmailRepositoryImpl( Get.lazyPut(() => EmailRepositoryImpl(
Get.find<EmailDataSource>(), {
Get.find<HtmlDataSource>(), DataSourceType.network: Get.find<EmailDataSource>(),
Get.find<StateDataSource>(), DataSourceType.hiveCache: Get.find<EmailHiveCacheDataSourceImpl>()
},
Get.find<HtmlDataSource>(),
Get.find<StateDataSource>(),
)); ));
} }
@@ -448,22 +448,6 @@ class ComposerController extends BaseController {
_autoFocusFieldWhenLauncher(); _autoFocusFieldWhenLauncher();
} }
String? getContentEmail(BuildContext context) {
if (composerArguments.value != null) {
switch(composerArguments.value!.emailActionType) {
case EmailActionType.reply:
case EmailActionType.forward:
case EmailActionType.replyAll:
return getEmailContentQuotedAsHtml(context, composerArguments.value!);
case EmailActionType.edit:
return getEmailContentDraftsAsHtml();
default:
return '';
}
}
return '';
}
String? _getHeaderEmailQuoted(BuildContext context, ComposerArguments arguments) { String? _getHeaderEmailQuoted(BuildContext context, ComposerArguments arguments) {
final presentationEmail = arguments.presentationEmail; final presentationEmail = arguments.presentationEmail;
if (presentationEmail != null) { if (presentationEmail != null) {
@@ -15,6 +15,7 @@ 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: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/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';
@@ -72,4 +73,6 @@ abstract class EmailDataSource {
Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds); Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds);
Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId); Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId);
Future<void> storeDetailedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail);
} }
@@ -13,6 +13,7 @@ import 'package:model/model.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/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.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';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
@@ -148,4 +149,9 @@ class EmailDataSourceImpl extends EmailDataSource {
return await emailAPI.deleteEmailPermanently(session, accountId, emailId); return await emailAPI.deleteEmailPermanently(session, accountId, emailId);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override
Future<void> storeDetailedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail) {
throw UnimplementedError();
}
} }
@@ -0,0 +1,136 @@
import 'dart:async';
import 'dart:typed_data';
import 'package:core/data/network/download/downloaded_response.dart';
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/file_utils.dart';
import 'package:dartz/dartz.dart';
import 'package:dio/dio.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:model/account/account_request.dart';
import 'package:model/download/download_task_id.dart';
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/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/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';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_manager.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart';
import 'package:tmail_ui_user/features/offline_mode/worker/hive_task.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
class EmailHiveCacheDataSourceImpl extends EmailDataSource {
final DetailedEmailCacheManager _emailCacheManager;
final DetailedEmailCacheWorkerQueue _cacheWorkerQueue;
final FileUtils _fileUtils;
final ExceptionThrower _exceptionThrower;
EmailHiveCacheDataSourceImpl(
this._emailCacheManager,
this._cacheWorkerQueue,
this._fileUtils,
this._exceptionThrower
);
@override
Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId) {
throw UnimplementedError();
}
@override
Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds) {
throw UnimplementedError();
}
@override
Future<Uint8List> downloadAttachmentForWeb(DownloadTaskId taskId, Attachment attachment, AccountId accountId, String baseDownloadUrl, AccountRequest accountRequest, StreamController<Either<Failure, Success>> onReceiveController) {
throw UnimplementedError();
}
@override
Future<List<DownloadTaskId>> downloadAttachments(List<Attachment> attachments, AccountId accountId, String baseDownloadUrl, AccountRequest accountRequest) {
throw UnimplementedError();
}
@override
Future<DownloadedResponse> exportAttachment(Attachment attachment, AccountId accountId, String baseDownloadUrl, AccountRequest accountRequest, CancelToken cancelToken) {
throw UnimplementedError();
}
@override
Future<Email> getEmailContent(Session session, AccountId accountId, EmailId emailId) {
throw UnimplementedError();
}
@override
Future<List<Email>> markAsRead(Session session, AccountId accountId, List<Email> emails, ReadActions readActions) {
throw UnimplementedError();
}
@override
Future<List<Email>> markAsStar(Session session, AccountId accountId, List<Email> emails, MarkStarAction markStarAction) {
throw UnimplementedError();
}
@override
Future<List<EmailId>> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
throw UnimplementedError();
}
@override
Future<bool> removeEmailDrafts(Session session, AccountId accountId, EmailId emailId) {
throw UnimplementedError();
}
@override
Future<Email> saveEmailAsDrafts(Session session, AccountId accountId, Email email) {
throw UnimplementedError();
}
@override
Future<bool> sendEmail(Session session, AccountId accountId, EmailRequest emailRequest, {CreateNewMailboxRequest? mailboxRequest}) {
throw UnimplementedError();
}
@override
Future<void> storeDetailedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail) {
return Future.sync(() async {
final task = HiveTask(
runnable: () async {
final fileSaved = await _fileUtils.saveToFile(
nameFile: detailedEmail.emailId.asString,
content: detailedEmail.htmlEmailContent ?? '',
folderPath: detailedEmail.folderPath,
extensionFile: ExtensionType.text.value
);
log('EmailHiveCacheDataSourceImpl::storeDetailedEmailToCache():fileSavedPath: ${fileSaved.path}');
final detailedEmailSaved = detailedEmail.fromEmailContentPath(fileSaved.path);
final detailedEmailCache = await _emailCacheManager.handleStoreDetailedEmailToCache(
accountId,
session.username,
detailedEmailSaved.toHiveCache());
return detailedEmailCache;
});
return await _cacheWorkerQueue.addTask(task);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<Email> updateEmailDrafts(Session session, AccountId accountId, Email newEmail) {
throw UnimplementedError();
}
}
@@ -2,17 +2,26 @@
import 'dart:async'; import 'dart:async';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:core/core.dart'; import 'package:core/data/model/source_type/data_source_type.dart';
import 'package:core/data/network/download/downloaded_response.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.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/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart'; import 'package:model/account/account_request.dart';
import 'package:model/download/download_task_id.dart';
import 'package:model/email/attachment.dart';
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/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/data/datasource/html_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.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/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart';
@@ -21,7 +30,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r
class EmailRepositoryImpl extends EmailRepository { class EmailRepositoryImpl extends EmailRepository {
final EmailDataSource emailDataSource; final Map<DataSourceType, EmailDataSource> emailDataSource;
final HtmlDataSource _htmlDataSource; final HtmlDataSource _htmlDataSource;
final StateDataSource _stateDataSource; final StateDataSource _stateDataSource;
@@ -33,7 +42,7 @@ class EmailRepositoryImpl extends EmailRepository {
@override @override
Future<Email> getEmailContent(Session session, AccountId accountId, EmailId emailId) { Future<Email> getEmailContent(Session session, AccountId accountId, EmailId emailId) {
return emailDataSource.getEmailContent(session ,accountId, emailId); return emailDataSource[DataSourceType.network]!.getEmailContent(session ,accountId, emailId);
} }
@override @override
@@ -43,7 +52,7 @@ class EmailRepositoryImpl extends EmailRepository {
EmailRequest emailRequest, EmailRequest emailRequest,
{CreateNewMailboxRequest? mailboxRequest} {CreateNewMailboxRequest? mailboxRequest}
) { ) {
return emailDataSource.sendEmail(session, accountId, emailRequest, mailboxRequest: mailboxRequest); return emailDataSource[DataSourceType.network]!.sendEmail(session, accountId, emailRequest, mailboxRequest: mailboxRequest);
} }
@override @override
@@ -53,7 +62,7 @@ class EmailRepositoryImpl extends EmailRepository {
List<Email> emails, List<Email> emails,
ReadActions readActions ReadActions readActions
) { ) {
return emailDataSource.markAsRead(session, accountId, emails, readActions); return emailDataSource[DataSourceType.network]!.markAsRead(session, accountId, emails, readActions);
} }
@override @override
@@ -63,7 +72,7 @@ class EmailRepositoryImpl extends EmailRepository {
String baseDownloadUrl, String baseDownloadUrl,
AccountRequest accountRequest AccountRequest accountRequest
) { ) {
return emailDataSource.downloadAttachments(attachments, accountId, baseDownloadUrl, accountRequest); return emailDataSource[DataSourceType.network]!.downloadAttachments(attachments, accountId, baseDownloadUrl, accountRequest);
} }
@override @override
@@ -74,7 +83,7 @@ class EmailRepositoryImpl extends EmailRepository {
AccountRequest accountRequest, AccountRequest accountRequest,
CancelToken cancelToken CancelToken cancelToken
) { ) {
return emailDataSource.exportAttachment( return emailDataSource[DataSourceType.network]!.exportAttachment(
attachment, attachment,
accountId, accountId,
baseDownloadUrl, baseDownloadUrl,
@@ -84,7 +93,7 @@ class EmailRepositoryImpl extends EmailRepository {
@override @override
Future<List<EmailId>> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) { Future<List<EmailId>> moveToMailbox(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
return emailDataSource.moveToMailbox(session, accountId, moveRequest); return emailDataSource[DataSourceType.network]!.moveToMailbox(session, accountId, moveRequest);
} }
@override @override
@@ -94,7 +103,7 @@ class EmailRepositoryImpl extends EmailRepository {
List<Email> emails, List<Email> emails,
MarkStarAction markStarAction MarkStarAction markStarAction
) { ) {
return emailDataSource.markAsStar(session, accountId, emails, markStarAction); return emailDataSource[DataSourceType.network]!.markAsStar(session, accountId, emails, markStarAction);
} }
@override @override
@@ -122,17 +131,17 @@ class EmailRepositoryImpl extends EmailRepository {
@override @override
Future<Email> saveEmailAsDrafts(Session session, AccountId accountId, Email email) { Future<Email> saveEmailAsDrafts(Session session, AccountId accountId, Email email) {
return emailDataSource.saveEmailAsDrafts(session, accountId, email); return emailDataSource[DataSourceType.network]!.saveEmailAsDrafts(session, accountId, email);
} }
@override @override
Future<bool> removeEmailDrafts(Session session, AccountId accountId, EmailId emailId) { Future<bool> removeEmailDrafts(Session session, AccountId accountId, EmailId emailId) {
return emailDataSource.removeEmailDrafts(session, accountId, emailId); return emailDataSource[DataSourceType.network]!.removeEmailDrafts(session, accountId, emailId);
} }
@override @override
Future<Email> updateEmailDrafts(Session session, AccountId accountId, Email newEmail) { Future<Email> updateEmailDrafts(Session session, AccountId accountId, Email newEmail) {
return emailDataSource.updateEmailDrafts(session, accountId, newEmail); return emailDataSource[DataSourceType.network]!.updateEmailDrafts(session, accountId, newEmail);
} }
@override @override
@@ -144,7 +153,7 @@ class EmailRepositoryImpl extends EmailRepository {
AccountRequest accountRequest, AccountRequest accountRequest,
StreamController<Either<Failure, Success>> onReceiveController StreamController<Either<Failure, Success>> onReceiveController
) { ) {
return emailDataSource.downloadAttachmentForWeb( return emailDataSource[DataSourceType.network]!.downloadAttachmentForWeb(
taskId, taskId,
attachment, attachment,
accountId, accountId,
@@ -155,12 +164,12 @@ class EmailRepositoryImpl extends EmailRepository {
@override @override
Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds) { Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds) {
return emailDataSource.deleteMultipleEmailsPermanently(session, accountId, emailIds); return emailDataSource[DataSourceType.network]!.deleteMultipleEmailsPermanently(session, accountId, emailIds);
} }
@override @override
Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId) { Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId) {
return emailDataSource.deleteEmailPermanently(session, accountId, emailId); return emailDataSource[DataSourceType.network]!.deleteEmailPermanently(session, accountId, emailId);
} }
@override @override
@@ -174,4 +183,9 @@ class EmailRepositoryImpl extends EmailRepository {
Future<jmap.State?> getEmailState(Session session, AccountId accountId) { Future<jmap.State?> getEmailState(Session session, AccountId accountId) {
return _stateDataSource.getState(accountId, session.username, StateType.email); return _stateDataSource.getState(accountId, session.username, StateType.email);
} }
@override
Future<void> storeDetailedEmailToCache(Session session, AccountId accountId, DetailedEmail detailedEmail) {
return emailDataSource[DataSourceType.hiveCache]!.storeDetailedEmailToCache(session, accountId, detailedEmail);
}
} }
@@ -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/mark_star_action.dart';
import 'package:model/email/read_actions.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/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/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';
@@ -86,4 +87,6 @@ abstract class EmailRepository {
Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId); Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId);
Future<jmap.State?> getEmailState(Session session, AccountId accountId); 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));
}
}
}
@@ -1,10 +1,12 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:core/utils/file_utils.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/caching/clients/state_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/state_cache_client.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/data/datasource/html_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
@@ -40,6 +42,8 @@ import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repositor
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_manager.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart';
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
@@ -90,6 +94,11 @@ class EmailBindings extends BaseBindings {
Get.find<DioClient>(), Get.find<DioClient>(),
Get.find<RemoteExceptionThrower>())); Get.find<RemoteExceptionThrower>()));
Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>(), Get.find<CacheExceptionThrower>())); Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>(), Get.find<CacheExceptionThrower>()));
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<DetailedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<FileUtils>(),
Get.find<CacheExceptionThrower>()));
} }
@override @override
@@ -141,9 +150,12 @@ class EmailBindings extends BaseBindings {
Get.find<StateDataSource>(), Get.find<StateDataSource>(),
)); ));
Get.lazyPut(() => EmailRepositoryImpl( Get.lazyPut(() => EmailRepositoryImpl(
Get.find<EmailDataSource>(), {
Get.find<HtmlDataSource>(), DataSourceType.network: Get.find<EmailDataSource>(),
Get.find<StateDataSource>() DataSourceType.hiveCache: Get.find<EmailHiveCacheDataSourceImpl>()
},
Get.find<HtmlDataSource>(),
Get.find<StateDataSource>()
)); ));
Get.lazyPut(() => AccountRepositoryImpl(Get.find<AccountDatasource>())); Get.lazyPut(() => AccountRepositoryImpl(Get.find<AccountDatasource>()));
} }
@@ -63,6 +63,6 @@ class SpamReportRepositoryImpl extends SpamReportRepository {
@override @override
Future<Mailbox> getSpamMailboxCached(AccountId accountId, UserName userName) { Future<Mailbox> getSpamMailboxCached(AccountId accountId, UserName userName) {
return mapDataSource[DataSourceType.cache]!.getSpamMailboxCached(accountId, userName); return mapDataSource[DataSourceType.hiveCache]!.getSpamMailboxCached(accountId, userName);
} }
} }
@@ -1,6 +1,7 @@
import 'package:core/data/model/source_type/data_source_type.dart'; import 'package:core/data/model/source_type/data_source_type.dart';
import 'package:core/data/network/dio_client.dart'; import 'package:core/data/network/dio_client.dart';
import 'package:core/utils/config/app_config_loader.dart'; import 'package:core/utils/config/app_config_loader.dart';
import 'package:core/utils/file_utils.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/caching/clients/recent_search_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/recent_search_cache_client.dart';
@@ -11,6 +12,7 @@ import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_inter
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/data/datasource/html_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
@@ -92,6 +94,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_manager.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart';
import 'package:tmail_ui_user/features/quotas/presentation/quotas_controller_bindings.dart'; import 'package:tmail_ui_user/features/quotas/presentation/quotas_controller_bindings.dart';
import 'package:tmail_ui_user/features/search/email/domain/usecases/refresh_changes_search_email_interactor.dart'; import 'package:tmail_ui_user/features/search/email/domain/usecases/refresh_changes_search_email_interactor.dart';
import 'package:tmail_ui_user/features/search/email/presentation/search_email_bindings.dart'; import 'package:tmail_ui_user/features/search/email/presentation/search_email_bindings.dart';
@@ -227,6 +231,11 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut(() => SpamReportCacheDataSourceImpl( Get.lazyPut(() => SpamReportCacheDataSourceImpl(
Get.find<MailboxCacheManager>(), Get.find<MailboxCacheManager>(),
Get.find<CacheExceptionThrower>())); Get.find<CacheExceptionThrower>()));
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<DetailedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<FileUtils>(),
Get.find<CacheExceptionThrower>()));
} }
@override @override
@@ -322,9 +331,12 @@ class MailboxDashBoardBindings extends BaseBindings {
@override @override
void bindingsRepositoryImpl() { void bindingsRepositoryImpl() {
Get.lazyPut(() => EmailRepositoryImpl( Get.lazyPut(() => EmailRepositoryImpl(
Get.find<EmailDataSource>(), {
Get.find<HtmlDataSource>(), DataSourceType.network: Get.find<EmailDataSource>(),
Get.find<StateDataSource>(), DataSourceType.hiveCache: Get.find<EmailHiveCacheDataSourceImpl>()
},
Get.find<HtmlDataSource>(),
Get.find<StateDataSource>(),
)); ));
Get.lazyPut(() => SearchRepositoryImpl(Get.find<SearchDataSource>())); Get.lazyPut(() => SearchRepositoryImpl(Get.find<SearchDataSource>()));
Get.lazyPut(() => ThreadRepositoryImpl( Get.lazyPut(() => ThreadRepositoryImpl(
@@ -348,7 +360,7 @@ class MailboxDashBoardBindings extends BaseBindings {
{ {
DataSourceType.network: Get.find<SpamReportDataSource>(), DataSourceType.network: Get.find<SpamReportDataSource>(),
DataSourceType.local: Get.find<SharePreferenceSpamReportDataSourceImpl>(), DataSourceType.local: Get.find<SharePreferenceSpamReportDataSourceImpl>(),
DataSourceType.cache: Get.find<SpamReportCacheDataSourceImpl>() DataSourceType.hiveCache: Get.find<SpamReportCacheDataSourceImpl>()
}, },
)); ));
} }
@@ -15,7 +15,7 @@ class DetailedEmailCacheManager {
DetailedEmailCacheManager(this._cacheClient); DetailedEmailCacheManager(this._cacheClient);
Future<void> handleStoreDetailedEmailToCache( Future<DetailedEmailHiveCache> handleStoreDetailedEmailToCache(
AccountId accountId, AccountId accountId,
UserName userName, UserName userName,
DetailedEmailHiveCache detailedEmailCache DetailedEmailHiveCache detailedEmailCache
@@ -27,8 +27,9 @@ class DetailedEmailCacheManager {
log('DetailedEmailCacheManager::handleStoreDetailedEmailToCache():latestEmail: $latestEmail'); log('DetailedEmailCacheManager::handleStoreDetailedEmailToCache():latestEmail: $latestEmail');
await removeDetailedEmail(accountId, userName, latestEmail.emailId); await removeDetailedEmail(accountId, userName, latestEmail.emailId);
} }
await insertDetailedEmail(accountId, userName, detailedEmailCache);
return insertDetailedEmail(accountId, userName, detailedEmailCache); return detailedEmailCache;
} }
Future<void> insertDetailedEmail( Future<void> insertDetailedEmail(
@@ -0,0 +1,8 @@
import 'package:tmail_ui_user/features/offline_mode/worker/hive_worker_queue.dart';
class DetailedEmailCacheWorkerQueue extends WorkerQueue {
@override
String get workerName => 'DetailedEmailCache';
}
@@ -1,11 +1,13 @@
import 'package:core/data/model/source_type/data_source_type.dart'; import 'package:core/data/model/source_type/data_source_type.dart';
import 'package:core/data/network/dio_client.dart'; import 'package:core/data/network/dio_client.dart';
import 'package:core/utils/file_utils.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/interactors_bindings.dart'; import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
import 'package:tmail_ui_user/features/caching/clients/state_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/state_cache_client.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/data/datasource/html_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart';
import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
@@ -19,6 +21,8 @@ import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/state_dataso
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart'; import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart'; import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.dart'; import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_manager.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart';
import 'package:tmail_ui_user/features/push_notification/data/datasource/fcm_datasource.dart'; import 'package:tmail_ui_user/features/push_notification/data/datasource/fcm_datasource.dart';
import 'package:tmail_ui_user/features/push_notification/data/datasource_impl/fcm_datasource_impl.dart'; import 'package:tmail_ui_user/features/push_notification/data/datasource_impl/fcm_datasource_impl.dart';
import 'package:tmail_ui_user/features/push_notification/data/datasource_impl/cache_fcm_datasource_impl.dart'; import 'package:tmail_ui_user/features/push_notification/data/datasource_impl/cache_fcm_datasource_impl.dart';
@@ -92,6 +96,11 @@ class FcmInteractorBindings extends InteractorsBindings {
Get.lazyPut(() => StateDataSourceImpl( Get.lazyPut(() => StateDataSourceImpl(
Get.find<StateCacheClient>(), Get.find<StateCacheClient>(),
Get.find<CacheExceptionThrower>())); Get.find<CacheExceptionThrower>()));
Get.lazyPut(() => EmailHiveCacheDataSourceImpl(
Get.find<DetailedEmailCacheManager>(),
Get.find<DetailedEmailCacheWorkerQueue>(),
Get.find<FileUtils>(),
Get.find<CacheExceptionThrower>()));
} }
@override @override
@@ -135,7 +144,10 @@ class FcmInteractorBindings extends InteractorsBindings {
}, },
)); ));
Get.lazyPut(() => EmailRepositoryImpl( Get.lazyPut(() => EmailRepositoryImpl(
Get.find<EmailDataSource>(), {
DataSourceType.network: Get.find<EmailDataSource>(),
DataSourceType.hiveCache: Get.find<EmailHiveCacheDataSourceImpl>()
},
Get.find<HtmlDataSource>(), Get.find<HtmlDataSource>(),
Get.find<StateDataSource>())); Get.find<StateDataSource>()));
} }
@@ -4,6 +4,7 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/app_toast.dart'; import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/utils/config/app_config_loader.dart'; import 'package:core/utils/config/app_config_loader.dart';
import 'package:core/utils/file_utils.dart';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
@@ -58,5 +59,6 @@ class CoreBindings extends Bindings {
Get.put(const Uuid()); Get.put(const Uuid());
Get.put(CompressFileUtils()); Get.put(CompressFileUtils());
Get.put(AppConfigLoader()); Get.put(AppConfigLoader());
Get.put(FileUtils());
} }
} }
@@ -4,6 +4,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:tmail_ui_user/features/caching/clients/account_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/account_cache_client.dart';
import 'package:tmail_ui_user/features/caching/clients/authentication_info_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/authentication_info_cache_client.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/caching/clients/detailed_email_hive_cache_client.dart';
import 'package:tmail_ui_user/features/caching/clients/email_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/email_cache_client.dart';
import 'package:tmail_ui_user/features/caching/clients/encryption_key_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/encryption_key_cache_client.dart';
import 'package:tmail_ui_user/features/caching/clients/fcm_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/fcm_cache_client.dart';
@@ -26,6 +27,8 @@ import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart'; import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/share_preference_spam_report_data_source.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/share_preference_spam_report_data_source.dart';
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_manager.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart';
import 'package:tmail_ui_user/features/push_notification/data/local/fcm_cache_manager.dart'; import 'package:tmail_ui_user/features/push_notification/data/local/fcm_cache_manager.dart';
import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart';
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
@@ -36,6 +39,7 @@ class LocalBindings extends Bindings {
void dependencies() { void dependencies() {
_bindingException(); _bindingException();
_bindingCaching(); _bindingCaching();
_bindingWorkerQueue();
} }
void _bindingCaching() { void _bindingCaching() {
@@ -64,6 +68,8 @@ class LocalBindings extends Bindings {
Get.put(FcmCacheClient()); Get.put(FcmCacheClient());
Get.put(FCMCacheManager(Get.find<FcmCacheClient>(),Get.find<FCMSubscriptionCacheClient>())); Get.put(FCMCacheManager(Get.find<FcmCacheClient>(),Get.find<FCMSubscriptionCacheClient>()));
Get.put(HiveCacheVersionClient(Get.find<SharedPreferences>(), Get.find<CacheExceptionThrower>())); Get.put(HiveCacheVersionClient(Get.find<SharedPreferences>(), Get.find<CacheExceptionThrower>()));
Get.put(DetailedEmailHiveCacheClient());
Get.put(DetailedEmailCacheManager(Get.find<DetailedEmailHiveCacheClient>()));
Get.put(CachingManager( Get.put(CachingManager(
Get.find<MailboxCacheClient>(), Get.find<MailboxCacheClient>(),
Get.find<StateCacheClient>(), Get.find<StateCacheClient>(),
@@ -80,4 +86,8 @@ class LocalBindings extends Bindings {
void _bindingException() { void _bindingException() {
Get.put(CacheExceptionThrower()); Get.put(CacheExceptionThrower());
} }
void _bindingWorkerQueue() {
Get.put(DetailedEmailCacheWorkerQueue());
}
} }
+1
View File
@@ -1,4 +1,5 @@
class AppConstants { class AppConstants {
static const int limitCharToStartSearch = 3; static const int limitCharToStartSearch = 3;
static const String applicationName = 'TeamMail';
} }