From 0dd387365a3575cd6a902c9c3034c9a5d6b7b32c Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 8 Jun 2022 19:12:29 +0700 Subject: [PATCH] TF-624 Reload page when logged oidc --- .../reloadable/reloadable_controller.dart | 46 +++++++++++++++---- .../login/presentation/login_controller.dart | 14 ++---- .../mailbox_dashboard_bindings.dart | 14 ++++++ .../mailbox_dashboard_controller.dart | 7 ++- .../manage_account_dashboard_bindings.dart | 16 ++++++- .../manage_account_dashboard_controller.dart | 8 +++- 6 files changed, 82 insertions(+), 23 deletions(-) diff --git a/lib/features/base/reloadable/reloadable_controller.dart b/lib/features/base/reloadable/reloadable_controller.dart index ccbcab2b2..7cba8ef04 100644 --- a/lib/features/base/reloadable/reloadable_controller.dart +++ b/lib/features/base/reloadable/reloadable_controller.dart @@ -6,14 +6,16 @@ import 'package:dartz/dartz.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:model/account/authentication_type.dart'; +import 'package:model/oidc/token_oidc.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart'; +import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/log_out_oidc_state.dart'; @@ -24,7 +26,6 @@ import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; abstract class ReloadableController extends BaseController { - final GetCredentialInteractor _getCredentialInteractor = Get.find(); final DynamicUrlInterceptors _dynamicUrlInterceptors = Get.find(); final AuthorizationInterceptors _authorizationInterceptors = Get.find(); final GetSessionInteractor _getSessionInteractor = Get.find(); @@ -33,10 +34,13 @@ abstract class ReloadableController extends BaseController { final LogoutOidcInteractor _logoutOidcInteractor; final DeleteAuthorityOidcInteractor _deleteAuthorityOidcInteractor; + final GetAuthenticatedAccountInteractor _getAuthenticatedAccountInteractor; ReloadableController( - this._logoutOidcInteractor, - this._deleteAuthorityOidcInteractor); + this._logoutOidcInteractor, + this._deleteAuthorityOidcInteractor, + this._getAuthenticatedAccountInteractor, + ); @override void onData(Either newState) { @@ -44,11 +48,13 @@ abstract class ReloadableController extends BaseController { viewState.value.fold( (failure) { if (failure is GetCredentialFailure) { - _goToLogin(); + _goToLogin(arguments: LoginArguments(LoginFormType.credentialForm)); } else if (failure is GetSessionFailure) { _handleGetSessionFailure(); } else if (failure is LogoutOidcFailure) { log('ReloadableController::onData(): LogoutOidcFailure: $failure'); + } else if (failure is GetStoredTokenOidcFailure) { + _goToLogin(arguments: LoginArguments(LoginFormType.ssoForm)); } }, (success) { @@ -58,6 +64,8 @@ abstract class ReloadableController extends BaseController { _handleGetSessionSuccess(success); } else if (success is LogoutOidcSuccess) { handleLogoutOidcSuccess(success); + } else if (success is GetStoredTokenOidcSuccess) { + _handleGetStoredTokenOIDCSuccess(success); } } ); @@ -67,11 +75,11 @@ abstract class ReloadableController extends BaseController { * trigger reload by getting Credential again then setting up Interceptor and retrieving session * */ void reload() { - _getCredentialAction(); + _getAuthenticatedAccountAction(); } - void _getCredentialAction() { - consumeState(_getCredentialInteractor.execute().asStream()); + void _getAuthenticatedAccountAction() { + consumeState(_getAuthenticatedAccountInteractor.execute()); } void _goToLogin({LoginArguments? arguments}) { @@ -98,9 +106,15 @@ abstract class ReloadableController extends BaseController { void _handleGetSessionFailure() async { await Future.wait([ _deleteCredentialInteractor.execute(), + _deleteAuthorityOidcInteractor.execute(), _cachingManager.clearAll(), ]); - _goToLogin(); + final authenticationType = _authorizationInterceptors.authenticationType; + if (authenticationType == AuthenticationType.oidc) { + _goToLogin(arguments: LoginArguments(LoginFormType.ssoForm)); + } else { + _goToLogin(arguments: LoginArguments(LoginFormType.credentialForm)); + } } void _handleGetSessionSuccess(GetSessionSuccess success) { @@ -120,7 +134,7 @@ abstract class ReloadableController extends BaseController { ]); _authorizationInterceptors.clear(); await HiveCacheConfig().closeHive(); - _goToLogin(); + _goToLogin(arguments: LoginArguments(LoginFormType.credentialForm)); } } @@ -135,4 +149,16 @@ abstract class ReloadableController extends BaseController { await HiveCacheConfig().closeHive(); _goToLogin(arguments: LoginArguments(LoginFormType.ssoForm)); } + + void _handleGetStoredTokenOIDCSuccess(GetStoredTokenOidcSuccess tokenOidcSuccess) { + _setUpInterceptorsOidc(tokenOidcSuccess); + _getSessionAction(); + } + + void _setUpInterceptorsOidc(GetStoredTokenOidcSuccess tokenOidcSuccess) { + _dynamicUrlInterceptors.changeBaseUrl(tokenOidcSuccess.baseUrl.toString()); + _authorizationInterceptors.setTokenAndAuthorityOidc( + newToken: tokenOidcSuccess.tokenOidc.toToken(), + newConfig: tokenOidcSuccess.oidcConfiguration); + } } \ No newline at end of file diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index 59c80dce4..2c32b0c80 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -78,20 +78,14 @@ class LoginController extends GetxController { ? Password(password.trim()) : null; - @override - void onInit() { - if (BuildUtils.isWeb) { - _getAuthenticationInfo(); - } - super.onInit(); - } - @override void onReady() { if (BuildUtils.isWeb) { final arguments = Get.arguments; if (arguments is LoginArguments) { loginFormType.value = arguments.loginFormType; + } else { + _getAuthenticationInfo(); } } super.onReady(); @@ -100,10 +94,12 @@ class LoginController extends GetxController { void _getAuthenticationInfo() async { await _getAuthenticationInfoInteractor.execute() .then((result) => result.fold( - (failure) => {}, + (failure) => _checkOIDCIsAvailable(), (success) { if (success is GetAuthenticationInfoSuccess) { _getStoredOidcConfiguration(); + } else { + _checkOIDCIsAvailable(); } })); } diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart index 61c121377..19383d212 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart @@ -29,6 +29,9 @@ import 'package:tmail_ui_user/features/login/domain/repository/account_repositor import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart'; @@ -75,6 +78,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.put(MailboxDashBoardController( Get.find(), Get.find(), + Get.find(), Get.find(), Get.find(), Get.find(), @@ -133,6 +137,16 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), )); Get.lazyPut(() => DeleteAuthorityOidcInteractor(Get.find())); + Get.lazyPut(() => GetCredentialInteractor(Get.find())); + Get.lazyPut(() => GetStoredTokenOidcInteractor( + Get.find(), + Get.find(), + )); + Get.lazyPut(() => GetAuthenticatedAccountInteractor( + Get.find(), + Get.find(), + Get.find(), + )); } @override diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index 64a79c5a3..e84e2df3a 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -36,6 +36,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_perman import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_all_recent_search_latest_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/mark_as_mailbox_read_state.dart'; @@ -107,13 +108,16 @@ class MailboxDashBoardController extends ReloadableController { MailboxDashBoardController( LogoutOidcInteractor logoutOidcInteractor, DeleteAuthorityOidcInteractor deleteAuthorityOidcInteractor, + GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor, this._moveToMailboxInteractor, this._deleteEmailPermanentlyInteractor, this._saveRecentSearchInteractor, this._getAllRecentSearchLatestInteractor, this._quickSearchEmailInteractor, this._markAsMailboxReadInteractor, - ) : super(logoutOidcInteractor, deleteAuthorityOidcInteractor); + ) : super(logoutOidcInteractor, + deleteAuthorityOidcInteractor, + getAuthenticatedAccountInteractor); @override void onInit() { @@ -413,6 +417,7 @@ class MailboxDashBoardController extends ReloadableController { void handleReloaded(Session session) { sessionCurrent = session; accountId.value = sessionCurrent?.accounts.keys.first; + _getUserProfile(); } UnsignedInt? get maxSizeAttachmentsPerEmail { diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart b/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart index cbc65dbcd..d1a9ec28e 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart @@ -15,6 +15,9 @@ import 'package:tmail_ui_user/features/login/domain/repository/account_repositor import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; @@ -34,7 +37,8 @@ class ManageAccountDashBoardBindings extends BaseBindings { void bindingsController() { Get.lazyPut(() => ManageAccountDashBoardController( Get.find(), - Get.find() + Get.find(), + Get.find() )); } @@ -63,6 +67,16 @@ class ManageAccountDashBoardBindings extends BaseBindings { Get.find(), )); Get.lazyPut(() => DeleteAuthorityOidcInteractor(Get.find())); + Get.lazyPut(() => GetCredentialInteractor(Get.find())); + Get.lazyPut(() => GetStoredTokenOidcInteractor( + Get.find(), + Get.find(), + )); + Get.lazyPut(() => GetAuthenticatedAccountInteractor( + Get.find(), + Get.find(), + Get.find(), + )); } @override diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart index 660202ed1..f5cf7d507 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -9,6 +9,7 @@ import 'package:model/model.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; @@ -31,8 +32,11 @@ class ManageAccountDashBoardController extends ReloadableController { ManageAccountDashBoardController( LogoutOidcInteractor logoutOidcInteractor, - DeleteAuthorityOidcInteractor deleteAuthorityOidcInteractor - ) : super(logoutOidcInteractor, deleteAuthorityOidcInteractor); + DeleteAuthorityOidcInteractor deleteAuthorityOidcInteractor, + GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor, + ) : super(logoutOidcInteractor, + deleteAuthorityOidcInteractor, + getAuthenticatedAccountInteractor); @override void onReady() {