diff --git a/lib/features/caching/clients/session_hive_cache_client.dart b/lib/features/caching/clients/session_hive_cache_client.dart new file mode 100644 index 000000000..9071d5cda --- /dev/null +++ b/lib/features/caching/clients/session_hive_cache_client.dart @@ -0,0 +1,13 @@ + +import 'package:tmail_ui_user/features/caching/config/hive_cache_client.dart'; +import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; +import 'package:tmail_ui_user/features/session/data/model/session_hive_obj.dart'; + +class SessionHiveCacheClient extends HiveCacheClient { + + @override + String get tableName => CachingConstants.sessionCacheBoxName; + + @override + bool get encryption => true; +} \ No newline at end of file diff --git a/lib/features/caching/utils/caching_constants.dart b/lib/features/caching/utils/caching_constants.dart index 9a3277b0f..1c4f977e7 100644 --- a/lib/features/caching/utils/caching_constants.dart +++ b/lib/features/caching/utils/caching_constants.dart @@ -24,6 +24,7 @@ class CachingConstants { static const String incomingEmailedCacheBoxName = 'incoming_emailed_cache_box'; static const String openedEmailCacheBoxName = 'opened_email_cache_box'; static const String sendingEmailCacheBoxName = 'sending_email_cache_box'; + static const String sessionCacheBoxName = 'session_cache_box'; static const String incomingEmailedContentFolderName = 'incoming_emailed'; static const String openedEmailContentFolderName = 'opened_email'; diff --git a/lib/features/session/data/datasource/session_datasource.dart b/lib/features/session/data/datasource/session_datasource.dart index f89c9e42d..7693e01f8 100644 --- a/lib/features/session/data/datasource/session_datasource.dart +++ b/lib/features/session/data/datasource/session_datasource.dart @@ -2,4 +2,6 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart'; abstract class SessionDataSource { Future getSession(); + + Future storeSession(Session session); } \ No newline at end of file diff --git a/lib/features/session/data/datasource_impl/hive_session_datasource_impl.dart b/lib/features/session/data/datasource_impl/hive_session_datasource_impl.dart new file mode 100644 index 000000000..4eb8238af --- /dev/null +++ b/lib/features/session/data/datasource_impl/hive_session_datasource_impl.dart @@ -0,0 +1,26 @@ +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:tmail_ui_user/features/caching/clients/session_hive_cache_client.dart'; +import 'package:tmail_ui_user/features/session/data/datasource/session_datasource.dart'; +import 'package:tmail_ui_user/features/session/data/model/session_hive_obj.dart'; +import 'package:tmail_ui_user/features/session/domain/extensions/session_extensions.dart'; +import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; + +class HiveSessionDataSourceImpl extends SessionDataSource { + + final SessionHiveCacheClient _sessionHiveCacheClient; + final ExceptionThrower _exceptionThrower; + + HiveSessionDataSourceImpl(this._sessionHiveCacheClient, this._exceptionThrower); + + @override + Future getSession() { + throw UnimplementedError(); + } + + @override + Future storeSession(Session session) { + return Future.sync(() async { + return _sessionHiveCacheClient.insertItem(SessionHiveObj.keyValue, session.toHiveObj()); + }).catchError(_exceptionThrower.throwException); + } +} \ No newline at end of file diff --git a/lib/features/session/data/datasource_impl/session_datasource_impl.dart b/lib/features/session/data/datasource_impl/session_datasource_impl.dart index f1495400c..a12f05a53 100644 --- a/lib/features/session/data/datasource_impl/session_datasource_impl.dart +++ b/lib/features/session/data/datasource_impl/session_datasource_impl.dart @@ -16,4 +16,9 @@ class SessionDataSourceImpl extends SessionDataSource { return await _sessionAPI.getSession(); }).catchError(_exceptionThrower.throwException); } + + @override + Future storeSession(Session session) { + throw UnimplementedError(); + } } \ No newline at end of file diff --git a/lib/features/session/data/exceptions/session_exceptions.dart b/lib/features/session/data/exceptions/session_exceptions.dart new file mode 100644 index 000000000..705ee3cee --- /dev/null +++ b/lib/features/session/data/exceptions/session_exceptions.dart @@ -0,0 +1,2 @@ + +class NotFoundSessionHiveObject implements Exception {} \ No newline at end of file diff --git a/lib/features/session/data/repository/session_repository_impl.dart b/lib/features/session/data/repository/session_repository_impl.dart index 39ec4df2e..2eb8e8886 100644 --- a/lib/features/session/data/repository/session_repository_impl.dart +++ b/lib/features/session/data/repository/session_repository_impl.dart @@ -1,15 +1,21 @@ +import 'package:core/data/model/source_type/data_source_type.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:tmail_ui_user/features/session/data/datasource/session_datasource.dart'; import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; class SessionRepositoryImpl extends SessionRepository { - final SessionDataSource sessionDataSource; + final Map sessionDataSource; SessionRepositoryImpl(this.sessionDataSource); @override Future getSession() { - return sessionDataSource.getSession(); + return sessionDataSource[DataSourceType.network]!.getSession(); + } + + @override + Future storeSession(Session session) { + return sessionDataSource[DataSourceType.hiveCache]!.storeSession(session); } } \ No newline at end of file diff --git a/lib/features/session/domain/repository/session_repository.dart b/lib/features/session/domain/repository/session_repository.dart index 30a86774d..bd15401be 100644 --- a/lib/features/session/domain/repository/session_repository.dart +++ b/lib/features/session/domain/repository/session_repository.dart @@ -2,4 +2,6 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart'; abstract class SessionRepository { Future getSession(); + + Future storeSession(Session session); } \ No newline at end of file diff --git a/lib/features/session/domain/state/store_session_state.dart b/lib/features/session/domain/state/store_session_state.dart new file mode 100644 index 000000000..3f074313e --- /dev/null +++ b/lib/features/session/domain/state/store_session_state.dart @@ -0,0 +1,14 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class StoreSessionLoading extends UIState {} + +class StoreSessionSuccess extends UIState {} + +class StoreSessionFailure extends FeatureFailure { + + StoreSessionFailure(dynamic exception) : super(exception: exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/session/domain/usecases/store_session_interactor.dart b/lib/features/session/domain/usecases/store_session_interactor.dart new file mode 100644 index 000000000..e0bd244f3 --- /dev/null +++ b/lib/features/session/domain/usecases/store_session_interactor.dart @@ -0,0 +1,22 @@ +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/core/session/session.dart'; +import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; +import 'package:tmail_ui_user/features/session/domain/state/store_session_state.dart'; + +class StoreSessionInteractor { + final SessionRepository sessionRepository; + + StoreSessionInteractor(this.sessionRepository); + + Stream> execute(Session session) async* { + try { + yield Right(StoreSessionLoading()); + await sessionRepository.storeSession(session); + yield Right(StoreSessionSuccess()); + } catch (e) { + yield Left(StoreSessionFailure(e)); + } + } +} \ No newline at end of file diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index 7592a76cd..0b693afe4 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/caching/clients/recent_login_url_cache_cl import 'package:tmail_ui_user/features/caching/clients/recent_login_username_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/recent_search_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/sending_email_hive_cache_client.dart'; +import 'package:tmail_ui_user/features/caching/clients/session_hive_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/state_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/subscription_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/token_oidc_cache_client.dart'; @@ -80,6 +81,7 @@ class LocalBindings extends Bindings { Get.put(OpenedEmailCacheManager(Get.find(), Get.find())); Get.put(SendingEmailHiveCacheClient()); Get.put(SendingEmailCacheManager(Get.find())); + Get.put(SessionHiveCacheClient()); Get.put(CachingManager( Get.find(), Get.find(), diff --git a/lib/main/bindings/session/session_bindings.dart b/lib/main/bindings/session/session_bindings.dart index bd66a86cb..9dbb08d56 100644 --- a/lib/main/bindings/session/session_bindings.dart +++ b/lib/main/bindings/session/session_bindings.dart @@ -1,11 +1,15 @@ +import 'package:core/data/model/source_type/data_source_type.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/interactors_bindings.dart'; +import 'package:tmail_ui_user/features/caching/clients/session_hive_cache_client.dart'; import 'package:tmail_ui_user/features/session/data/datasource/session_datasource.dart'; +import 'package:tmail_ui_user/features/session/data/datasource_impl/hive_session_datasource_impl.dart'; import 'package:tmail_ui_user/features/session/data/datasource_impl/session_datasource_impl.dart'; import 'package:tmail_ui_user/features/session/data/network/session_api.dart'; import 'package:tmail_ui_user/features/session/data/repository/session_repository_impl.dart'; import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; +import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; class SessionBindings extends InteractorsBindings { @@ -18,8 +22,11 @@ class SessionBindings extends InteractorsBindings { @override void bindingsDataSourceImpl() { Get.put(SessionDataSourceImpl( - Get.find(), - Get.find())); + Get.find(), + Get.find())); + Get.put(HiveSessionDataSourceImpl( + Get.find(), + Get.find())); } @override @@ -34,6 +41,9 @@ class SessionBindings extends InteractorsBindings { @override void bindingsRepositoryImpl() { - Get.put(SessionRepositoryImpl(Get.find())); + Get.put(SessionRepositoryImpl({ + DataSourceType.network: Get.find(), + DataSourceType.hiveCache: Get.find(), + })); } } \ No newline at end of file