diff --git a/lib/features/session/data/datasource/session_datasource.dart b/lib/features/session/data/datasource/session_datasource.dart index 7693e01f8..4fe998566 100644 --- a/lib/features/session/data/datasource/session_datasource.dart +++ b/lib/features/session/data/datasource/session_datasource.dart @@ -4,4 +4,6 @@ abstract class SessionDataSource { Future getSession(); Future storeSession(Session session); + + Future getStoredSession(); } \ 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 index 4eb8238af..07275b624 100644 --- a/lib/features/session/data/datasource_impl/hive_session_datasource_impl.dart +++ b/lib/features/session/data/datasource_impl/hive_session_datasource_impl.dart @@ -1,6 +1,8 @@ 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/exceptions/session_exceptions.dart'; +import 'package:tmail_ui_user/features/session/data/extensions/session_hive_obj_extension.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'; @@ -23,4 +25,16 @@ class HiveSessionDataSourceImpl extends SessionDataSource { return _sessionHiveCacheClient.insertItem(SessionHiveObj.keyValue, session.toHiveObj()); }).catchError(_exceptionThrower.throwException); } + + @override + Future getStoredSession() { + return Future.sync(() async { + final sessionHiveObj = await _sessionHiveCacheClient.getItem(SessionHiveObj.keyValue); + if (sessionHiveObj != null) { + return sessionHiveObj.toSession(); + } else { + throw NotFoundSessionHiveObject(); + } + }).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 a12f05a53..41777496f 100644 --- a/lib/features/session/data/datasource_impl/session_datasource_impl.dart +++ b/lib/features/session/data/datasource_impl/session_datasource_impl.dart @@ -21,4 +21,9 @@ class SessionDataSourceImpl extends SessionDataSource { Future storeSession(Session session) { throw UnimplementedError(); } + + @override + Future getStoredSession() { + throw UnimplementedError(); + } } \ 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 2eb8e8886..3613f4cd3 100644 --- a/lib/features/session/data/repository/session_repository_impl.dart +++ b/lib/features/session/data/repository/session_repository_impl.dart @@ -18,4 +18,9 @@ class SessionRepositoryImpl extends SessionRepository { Future storeSession(Session session) { return sessionDataSource[DataSourceType.hiveCache]!.storeSession(session); } + + @override + Future getStoredSession() { + return sessionDataSource[DataSourceType.hiveCache]!.getStoredSession(); + } } \ 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 bd15401be..c715fdba7 100644 --- a/lib/features/session/domain/repository/session_repository.dart +++ b/lib/features/session/domain/repository/session_repository.dart @@ -4,4 +4,6 @@ abstract class SessionRepository { Future getSession(); Future storeSession(Session session); + + Future getStoredSession(); } \ No newline at end of file diff --git a/lib/features/session/domain/state/get_stored_session_state.dart b/lib/features/session/domain/state/get_stored_session_state.dart new file mode 100644 index 000000000..84d3a73b0 --- /dev/null +++ b/lib/features/session/domain/state/get_stored_session_state.dart @@ -0,0 +1,23 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; + +class GetStoredSessionLoading extends UIState {} + +class GetStoredSessionSuccess extends UIState { + + final Session session; + + GetStoredSessionSuccess(this.session); + + @override + List get props => [session]; +} + +class GetStoredSessionFailure extends FeatureFailure { + + GetStoredSessionFailure(dynamic exception) : super(exception: exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/session/domain/usecases/get_stored_session_interactor.dart b/lib/features/session/domain/usecases/get_stored_session_interactor.dart new file mode 100644 index 000000000..beacc16dc --- /dev/null +++ b/lib/features/session/domain/usecases/get_stored_session_interactor.dart @@ -0,0 +1,21 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; +import 'package:tmail_ui_user/features/session/domain/state/get_stored_session_state.dart'; + +class GetStoredSessionInteractor { + final SessionRepository sessionRepository; + + GetStoredSessionInteractor(this.sessionRepository); + + Stream> execute() async* { + try { + yield Right(GetStoredSessionLoading()); + final session = await sessionRepository.getStoredSession(); + yield Right(GetStoredSessionSuccess(session)); + } catch (e) { + yield Left(GetStoredSessionFailure(e)); + } + } +} \ No newline at end of file