From 3c9abf8f41c5431964a909f95dd6eab2cac65cf4 Mon Sep 17 00:00:00 2001 From: Dat PHAM HOANG Date: Tue, 31 May 2022 14:35:11 +0700 Subject: [PATCH] TF-571 Handle get stored account when re-open app --- .../home/presentation/home_bindings.dart | 38 ++++++++++- .../home/presentation/home_controller.dart | 63 +++++++++++++++---- 2 files changed, 88 insertions(+), 13 deletions(-) diff --git a/lib/features/home/presentation/home_bindings.dart b/lib/features/home/presentation/home_bindings.dart index c0c5a94e9..b12706051 100644 --- a/lib/features/home/presentation/home_bindings.dart +++ b/lib/features/home/presentation/home_bindings.dart @@ -9,8 +9,22 @@ import 'package:tmail_ui_user/features/cleanup/domain/repository/cleanup_reposit import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_email_cache_interactor.dart'; import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_search_cache_interactor.dart'; import 'package:tmail_ui_user/features/home/presentation/home_controller.dart'; +import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart'; +import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart'; +import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart'; +import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_datasource_impl.dart'; +import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; +import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; +import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart'; +import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc_repository_impl.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; +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/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/thread/data/local/email_cache_manager.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; @@ -19,7 +33,7 @@ class HomeBindings extends BaseBindings { @override void bindingsController() { Get.lazyPut(() => HomeController( - Get.find(), + Get.find(), Get.find(), Get.find(), Get.find(), @@ -31,6 +45,8 @@ class HomeBindings extends BaseBindings { @override void bindingsDataSource() { Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override @@ -39,10 +55,26 @@ class HomeBindings extends BaseBindings { Get.find(), Get.find(), )); + Get.lazyPut(() => HiveAccountDatasourceImpl( + Get.find() + )); + Get.lazyPut(() => AuthenticationOIDCDataSourceImpl( + Get.find(), + Get.find() + )); } @override void bindingsInteractor() { + Get.lazyPut(() => GetStoredTokenOidcInteractor( + Get.find(), + Get.find() + )); + Get.lazyPut(() => GetAuthenticatedAccountInteractor( + Get.find(), + Get.find(), + Get.find() + )); Get.lazyPut(() => CleanupEmailCacheInteractor(Get.find())); Get.lazyPut(() => CleanupRecentSearchCacheInteractor(Get.find())); } @@ -50,10 +82,14 @@ class HomeBindings extends BaseBindings { @override void bindingsRepository() { Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override void bindingsRepositoryImpl() { Get.lazyPut(() => CleanupRepositoryImpl(Get.find())); + Get.lazyPut(() => AccountRepositoryImpl(Get.find())); + Get.lazyPut(() => AuthenticationOIDCRepositoryImpl(Get.find())); } } \ No newline at end of file diff --git a/lib/features/home/presentation/home_controller.dart b/lib/features/home/presentation/home_controller.dart index 9c3bd4b65..1cb0f95fd 100644 --- a/lib/features/home/presentation/home_controller.dart +++ b/lib/features/home/presentation/home_controller.dart @@ -1,8 +1,11 @@ import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_downloader/flutter_downloader.dart'; -import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; +import 'package:model/account/account.dart'; +import 'package:model/oidc/token_oidc.dart'; +import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/email_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/recent_search_cleanup_rule.dart'; @@ -10,13 +13,14 @@ import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_email_cac import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_search_cache_interactor.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/usecases/get_credential_interactor.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/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; -class HomeController extends GetxController { - final GetCredentialInteractor _getCredentialInteractor; +class HomeController extends BaseController { + final GetAuthenticatedAccountInteractor _getAuthenticatedAccountInteractor; final DynamicUrlInterceptors _dynamicUrlInterceptors; final AuthorizationInterceptors _authorizationInterceptors; final CleanupEmailCacheInteractor _cleanupEmailCacheInteractor; @@ -24,7 +28,7 @@ class HomeController extends GetxController { final CleanupRecentSearchCacheInteractor _cleanupRecentSearchCacheInteractor; HomeController( - this._getCredentialInteractor, + this._getAuthenticatedAccountInteractor, this._dynamicUrlInterceptors, this._authorizationInterceptors, this._cleanupEmailCacheInteractor, @@ -32,6 +36,8 @@ class HomeController extends GetxController { this._cleanupRecentSearchCacheInteractor, ); + Account? currentAccount; + @override void onInit() { log('HomeController::onInit(): '); @@ -44,6 +50,7 @@ class HomeController extends GetxController { @override void onReady() { + log('HomeController::onReady()'); _cleanupCache(); super.onReady(); } @@ -60,14 +67,12 @@ class HomeController extends GetxController { await Future.wait([ _cleanupEmailCacheInteractor.execute(EmailCleanupRule(Duration.defaultCacheInternal)), _cleanupRecentSearchCacheInteractor.execute(RecentSearchCleanupRule()) - ]).then((value) => _getCredentialAction()); + ]).then((value) => _getAuthenticatedAccount()); } - void _getCredentialAction() async { - await _getCredentialInteractor.execute() - .then((response) => response.fold( - (failure) => _goToLogin(), - (success) => success is GetCredentialViewState ? _goToMailbox(success) : _goToLogin())); + void _getAuthenticatedAccount() async { + log('HomeController::_getAuthenticatedAccount()'); + consumeState(_getAuthenticatedAccountInteractor.execute()); } void _registerReceivingSharingIntent() { @@ -84,7 +89,41 @@ class HomeController extends GetxController { pushAndPop(AppRoutes.LOGIN); } - void _goToMailbox(GetCredentialViewState credentialViewState) { + @override + void onData(Either newState) { + super.onData(newState); + newState.fold(_handleFailureViewState, _handleSuccessViewState); + } + + @override + void onDone() {} + + @override + void onError(error) { + _goToLogin(); + } + + void _handleFailureViewState(Failure failure) { + logError('HomeController::_handleFailureViewState(): ${failure.toString()}'); + _goToLogin(); + } + + void _handleSuccessViewState(Success success) { + log('HomeController::_handleSuccessViewState(): $success'); + if (success is GetStoredTokenOidcSuccess) { + _goToSessionWithTokenOidc(success); + } else if (success is GetCredentialViewState) { + _goToSessionWithBasicAuth(success); + } + } + + void _goToSessionWithTokenOidc(GetStoredTokenOidcSuccess storedTokenOidcSuccess) { + _dynamicUrlInterceptors.changeBaseUrl(storedTokenOidcSuccess.baseUrl.toString()); + _authorizationInterceptors.setToken(storedTokenOidcSuccess.tokenOidc.toToken()); + pushAndPop(AppRoutes.SESSION); + } + + void _goToSessionWithBasicAuth(GetCredentialViewState credentialViewState) { _dynamicUrlInterceptors.changeBaseUrl(credentialViewState.baseUrl.origin); _authorizationInterceptors.changeAuthorization( credentialViewState.userName.userName,