diff --git a/lib/features/login/data/datasource/company_server_login_datasource.dart b/lib/features/login/data/datasource/company_server_login_datasource.dart new file mode 100644 index 000000000..120f8d810 --- /dev/null +++ b/lib/features/login/data/datasource/company_server_login_datasource.dart @@ -0,0 +1,9 @@ +import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart'; + +abstract class CompanyServerLoginDataSource { + Future saveCompanyServerLoginInfo(CompanyServerLoginInfo loginInfo); + + Future getCompanyServerLoginInfo(); + + Future removeCompanyServerLoginInfo(); +} diff --git a/lib/features/login/data/datasource_impl/company_server_login_datasource_impl.dart b/lib/features/login/data/datasource_impl/company_server_login_datasource_impl.dart new file mode 100644 index 000000000..eeb248b5a --- /dev/null +++ b/lib/features/login/data/datasource_impl/company_server_login_datasource_impl.dart @@ -0,0 +1,35 @@ +import 'package:tmail_ui_user/features/login/data/datasource/company_server_login_datasource.dart'; +import 'package:tmail_ui_user/features/login/data/local/company_server_login_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart'; +import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; + +class CompanyServerLoginDatasourceImpl implements CompanyServerLoginDataSource { + final CompanyServerLoginCacheManager _loginCacheManager; + final ExceptionThrower _exceptionThrower; + + CompanyServerLoginDatasourceImpl( + this._loginCacheManager, + this._exceptionThrower, + ); + + @override + Future getCompanyServerLoginInfo() { + return Future.sync(() { + return _loginCacheManager.getCompanyServerLoginInfo(); + }).catchError(_exceptionThrower.throwException); + } + + @override + Future removeCompanyServerLoginInfo() { + return Future.sync(() async { + return await _loginCacheManager.removeCompanyServerLoginInfo(); + }).catchError(_exceptionThrower.throwException); + } + + @override + Future saveCompanyServerLoginInfo(CompanyServerLoginInfo loginInfo) { + return Future.sync(() async { + return await _loginCacheManager.saveCompanyServerLoginInfo(loginInfo); + }).catchError(_exceptionThrower.throwException); + } +} diff --git a/lib/features/login/data/local/company_server_login_cache_manager.dart b/lib/features/login/data/local/company_server_login_cache_manager.dart new file mode 100644 index 000000000..e20acefeb --- /dev/null +++ b/lib/features/login/data/local/company_server_login_cache_manager.dart @@ -0,0 +1,31 @@ +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tmail_ui_user/features/login/domain/exceptions/login_exception.dart'; +import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart'; + +class CompanyServerLoginCacheManager { + static const String _companyServerLoginInfoKey = 'COMPANY_SERVER_LOGIN_INFO'; + + const CompanyServerLoginCacheManager(this._sharedPreferences); + + final SharedPreferences _sharedPreferences; + + CompanyServerLoginInfo getCompanyServerLoginInfo() { + final userEmail = _sharedPreferences.getString(_companyServerLoginInfoKey); + if (userEmail?.trim().isNotEmpty == true) { + return CompanyServerLoginInfo(email: userEmail!); + } else { + throw NotFoundCompanyServerLoginInfoException(); + } + } + + Future saveCompanyServerLoginInfo( + CompanyServerLoginInfo companyServerLoginInfo, + ) async { + await _sharedPreferences.setString( + _companyServerLoginInfoKey, companyServerLoginInfo.email); + } + + Future removeCompanyServerLoginInfo() async { + await _sharedPreferences.remove(_companyServerLoginInfoKey); + } +} diff --git a/lib/features/login/data/repository/company_server_login_repository_impl.dart b/lib/features/login/data/repository/company_server_login_repository_impl.dart new file mode 100644 index 000000000..c1bde9ee5 --- /dev/null +++ b/lib/features/login/data/repository/company_server_login_repository_impl.dart @@ -0,0 +1,24 @@ +import 'package:tmail_ui_user/features/login/data/datasource/company_server_login_datasource.dart'; +import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/company_server_login_repository.dart'; + +class CompanyServerLoginRepositoryImpl implements CompanyServerLoginRepository { + final CompanyServerLoginDataSource _serverLoginDataSource; + + CompanyServerLoginRepositoryImpl(this._serverLoginDataSource); + + @override + Future getCompanyServerLoginInfo() { + return _serverLoginDataSource.getCompanyServerLoginInfo(); + } + + @override + Future removeCompanyServerLoginInfo() { + return _serverLoginDataSource.removeCompanyServerLoginInfo(); + } + + @override + Future saveCompanyServerLoginInfo(CompanyServerLoginInfo loginInfo) { + return _serverLoginDataSource.saveCompanyServerLoginInfo(loginInfo); + } +} diff --git a/lib/features/login/domain/exceptions/login_exception.dart b/lib/features/login/domain/exceptions/login_exception.dart index 6312b62f3..e9faa73bc 100644 --- a/lib/features/login/domain/exceptions/login_exception.dart +++ b/lib/features/login/domain/exceptions/login_exception.dart @@ -21,3 +21,5 @@ class NoSuitableBrowserForOIDCException implements Exception { } } +class NotFoundCompanyServerLoginInfoException implements Exception {} + diff --git a/lib/features/login/domain/model/company_server_login_info.dart b/lib/features/login/domain/model/company_server_login_info.dart new file mode 100644 index 000000000..829aeb583 --- /dev/null +++ b/lib/features/login/domain/model/company_server_login_info.dart @@ -0,0 +1,12 @@ +import 'package:equatable/equatable.dart'; + +class CompanyServerLoginInfo with EquatableMixin { + final String email; + + const CompanyServerLoginInfo({ + required this.email, + }); + + @override + List get props => [email]; +} diff --git a/lib/features/login/domain/repository/company_server_login_repository.dart b/lib/features/login/domain/repository/company_server_login_repository.dart new file mode 100644 index 000000000..bf63734f9 --- /dev/null +++ b/lib/features/login/domain/repository/company_server_login_repository.dart @@ -0,0 +1,9 @@ +import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart'; + +abstract class CompanyServerLoginRepository { + Future saveCompanyServerLoginInfo(CompanyServerLoginInfo loginInfo); + + Future getCompanyServerLoginInfo(); + + Future removeCompanyServerLoginInfo(); +} diff --git a/lib/features/login/domain/state/get_company_server_login_info_state.dart b/lib/features/login/domain/state/get_company_server_login_info_state.dart new file mode 100644 index 000000000..2a699b068 --- /dev/null +++ b/lib/features/login/domain/state/get_company_server_login_info_state.dart @@ -0,0 +1,19 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart'; + +class GettingCompanyServerLoginInfo extends LoadingState {} + +class GetCompanyServerLoginInfoSuccess extends UIState { + final CompanyServerLoginInfo serverLoginInfo; + + GetCompanyServerLoginInfoSuccess(this.serverLoginInfo); + + @override + List get props => [serverLoginInfo]; +} + +class GetCompanyServerLoginInfoFailure extends FeatureFailure { + GetCompanyServerLoginInfoFailure(dynamic exception) + : super(exception: exception); +} diff --git a/lib/features/login/domain/state/save_company_server_login_info_state.dart b/lib/features/login/domain/state/save_company_server_login_info_state.dart new file mode 100644 index 000000000..d5812abfd --- /dev/null +++ b/lib/features/login/domain/state/save_company_server_login_info_state.dart @@ -0,0 +1,11 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class SavingCompanyServerLoginInfo extends LoadingState {} + +class SaveCompanyServerLoginInfoSuccess extends UIState {} + +class SaveCompanyServerLoginInfoFailure extends FeatureFailure { + SaveCompanyServerLoginInfoFailure(dynamic exception) + : super(exception: exception); +} diff --git a/lib/features/login/domain/usecases/get_company_server_login_info_interactor.dart b/lib/features/login/domain/usecases/get_company_server_login_info_interactor.dart new file mode 100644 index 000000000..fafbd8b3b --- /dev/null +++ b/lib/features/login/domain/usecases/get_company_server_login_info_interactor.dart @@ -0,0 +1,24 @@ +import 'dart:core'; + +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/login/domain/repository/company_server_login_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/state/get_company_server_login_info_state.dart'; + +class GetCompanyServerLoginInfoInteractor { + final CompanyServerLoginRepository _serverLoginRepository; + + GetCompanyServerLoginInfoInteractor(this._serverLoginRepository); + + Stream> execute() async* { + try { + yield Right(GettingCompanyServerLoginInfo()); + final serverLoginInfo = + await _serverLoginRepository.getCompanyServerLoginInfo(); + yield Right(GetCompanyServerLoginInfoSuccess(serverLoginInfo)); + } catch (exception) { + yield Left(GetCompanyServerLoginInfoFailure(exception)); + } + } +} diff --git a/lib/features/login/domain/usecases/save_company_server_login_info_interactor.dart b/lib/features/login/domain/usecases/save_company_server_login_info_interactor.dart new file mode 100644 index 000000000..20aba87fe --- /dev/null +++ b/lib/features/login/domain/usecases/save_company_server_login_info_interactor.dart @@ -0,0 +1,26 @@ +import 'dart:core'; + +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/login/domain/model/company_server_login_info.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/company_server_login_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/state/save_company_server_login_info_state.dart'; + +class SaveCompanyServerLoginInfoInteractor { + final CompanyServerLoginRepository _serverLoginRepository; + + SaveCompanyServerLoginInfoInteractor(this._serverLoginRepository); + + Stream> execute( + CompanyServerLoginInfo serverLoginInfo, + ) async* { + try { + yield Right(SavingCompanyServerLoginInfo()); + await _serverLoginRepository.saveCompanyServerLoginInfo(serverLoginInfo); + yield Right(SaveCompanyServerLoginInfoSuccess()); + } catch (exception) { + yield Left(SaveCompanyServerLoginInfoFailure(exception)); + } + } +}