Skip to content

Commit ee6087d

Browse files
committed
TF-2387 Handle signIn twake workplace via use company server
1 parent 7eaded5 commit ee6087d

File tree

6 files changed

+82
-28
lines changed

6 files changed

+82
-28
lines changed

env.file

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,4 @@ APP_GRID_AVAILABLE=supported
66
FCM_AVAILABLE=supported
77
IOS_FCM=supported
88
FORWARD_WARNING_MESSAGE=
9-
PLATFORM=other
10-
REGISTRATION_URL=http://localhost/
11-
SAAS_SERVER_URL=http://localhost/
9+
PLATFORM=other

lib/features/login/presentation/login_bindings.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:tmail_ui_user/features/caching/clients/recent_login_username_cac
66
import 'package:tmail_ui_user/features/login/data/datasource/login_datasource.dart';
77
import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_login_datasource_impl.dart';
88
import 'package:tmail_ui_user/features/login/data/datasource_impl/login_datasource_impl.dart';
9+
import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart';
910
import 'package:tmail_ui_user/features/login/data/network/dns_service.dart';
1011
import 'package:tmail_ui_user/features/login/data/repository/login_repository_impl.dart';
1112
import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart';
@@ -26,6 +27,11 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_inte
2627
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart';
2728
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart';
2829
import 'package:tmail_ui_user/features/login/presentation/login_controller.dart';
30+
import 'package:tmail_ui_user/features/starting_page/data/datasource/saas_authentication_datasource.dart';
31+
import 'package:tmail_ui_user/features/starting_page/data/datasource_impl/saas_authentication_datasource_impl.dart';
32+
import 'package:tmail_ui_user/features/starting_page/data/repository/saas_authentication_repository_impl.dart';
33+
import 'package:tmail_ui_user/features/starting_page/domain/repository/saas_authentication_repository.dart';
34+
import 'package:tmail_ui_user/features/starting_page/domain/usecase/sign_in_twake_workplace_interactor.dart';
2935
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
3036
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
3137

@@ -47,12 +53,15 @@ class LoginBindings extends BaseBindings {
4753
Get.find<SaveLoginUsernameOnMobileInteractor>(),
4854
Get.find<GetAllRecentLoginUsernameOnMobileInteractor>(),
4955
Get.find<DNSLookupToGetJmapUrlInteractor>(),
56+
Get.find<SignInTwakeWorkplaceInteractor>(),
5057
));
5158
}
5259

5360
@override
5461
void bindingsDataSource() {
5562
Get.lazyPut<LoginDataSource>(() => Get.find<LoginDataSourceImpl>());
63+
Get.lazyPut<SaasAuthenticationDataSource>(
64+
() => Get.find<SaasAuthenticationDataSourceImpl>());
5665
}
5766

5867
@override
@@ -66,6 +75,10 @@ class LoginBindings extends BaseBindings {
6675
Get.find<DNSService>(),
6776
Get.find<RemoteExceptionThrower>(),
6877
));
78+
Get.lazyPut(() => SaasAuthenticationDataSourceImpl(
79+
Get.find<AuthenticationClientBase>(),
80+
Get.find<RemoteExceptionThrower>(),
81+
));
6982
}
7083

7184
@override
@@ -98,11 +111,19 @@ class LoginBindings extends BaseBindings {
98111
Get.lazyPut(() => SaveLoginUsernameOnMobileInteractor(Get.find<LoginRepository>(),));
99112
Get.lazyPut(() => GetAllRecentLoginUsernameOnMobileInteractor(Get.find<LoginRepository>()));
100113
Get.lazyPut(() => DNSLookupToGetJmapUrlInteractor(Get.find<LoginRepository>()));
114+
Get.lazyPut(() => SignInTwakeWorkplaceInteractor(
115+
Get.find<SaasAuthenticationRepository>(),
116+
Get.find<AuthenticationOIDCRepository>(),
117+
Get.find<AccountRepository>(),
118+
Get.find<CredentialRepository>(),
119+
));
101120
}
102121

103122
@override
104123
void bindingsRepository() {
105124
Get.lazyPut<LoginRepository>(() => Get.find<LoginRepositoryImpl>());
125+
Get.lazyPut<SaasAuthenticationRepository>(
126+
() => Get.find<SaasAuthenticationRepositoryImpl>());
106127
}
107128

108129
@override
@@ -113,5 +134,7 @@ class LoginBindings extends BaseBindings {
113134
DataSourceType.network: Get.find<LoginDataSource>(),
114135
}
115136
));
137+
Get.lazyPut(() => SaasAuthenticationRepositoryImpl(
138+
Get.find<SaasAuthenticationDataSource>()));
116139
}
117140
}

lib/features/login/presentation/login_controller.dart

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:model/account/password.dart';
1414
import 'package:model/oidc/oidc_configuration.dart';
1515
import 'package:model/oidc/request/oidc_request.dart';
1616
import 'package:model/oidc/response/oidc_response.dart';
17+
import 'package:model/oidc/token_oidc.dart';
1718
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
1819
import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart';
1920
import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart';
@@ -49,6 +50,8 @@ import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_m
4950
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart';
5051
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
5152
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart';
53+
import 'package:tmail_ui_user/features/starting_page/domain/state/sign_in_twake_workplace_state.dart';
54+
import 'package:tmail_ui_user/features/starting_page/domain/usecase/sign_in_twake_workplace_interactor.dart';
5255
import 'package:tmail_ui_user/main/routes/app_routes.dart';
5356
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
5457
import 'package:tmail_ui_user/main/routes/route_utils.dart';
@@ -70,6 +73,7 @@ class LoginController extends ReloadableController {
7073
final SaveLoginUsernameOnMobileInteractor _saveLoginUsernameOnMobileInteractor;
7174
final GetAllRecentLoginUsernameOnMobileInteractor _getAllRecentLoginUsernameOnMobileInteractor;
7275
final DNSLookupToGetJmapUrlInteractor _dnsLookupToGetJmapUrlInteractor;
76+
final SignInTwakeWorkplaceInteractor _signInTwakeWorkplaceInteractor;
7377

7478
final TextEditingController urlInputController = TextEditingController();
7579
final TextEditingController usernameInputController = TextEditingController();
@@ -99,6 +103,7 @@ class LoginController extends ReloadableController {
99103
this._saveLoginUsernameOnMobileInteractor,
100104
this._getAllRecentLoginUsernameOnMobileInteractor,
101105
this._dnsLookupToGetJmapUrlInteractor,
106+
this._signInTwakeWorkplaceInteractor,
102107
);
103108

104109
@override
@@ -130,7 +135,8 @@ class LoginController extends ReloadableController {
130135
_handleCheckOIDCIsAvailableFailure(failure);
131136
} else if (failure is GetStoredOidcConfigurationFailure ||
132137
failure is GetOIDCIsAvailableFailure ||
133-
failure is GetOIDCConfigurationFailure
138+
failure is GetOIDCConfigurationFailure ||
139+
failure is SignInTwakeWorkplaceFailure
134140
) {
135141
_handleCommonOIDCFailure();
136142
} else if (failure is GetTokenOIDCFailure) {
@@ -168,6 +174,12 @@ class LoginController extends ReloadableController {
168174
_loginSuccessAction(success);
169175
} else if (success is DNSLookupToGetJmapUrlSuccess) {
170176
_handleDNSLookupToGetJmapUrlSuccess(success);
177+
} else if (success is SignInTwakeWorkplaceSuccess) {
178+
_synchronizeTokenAndGetSession(
179+
baseUri: success.baseUri,
180+
tokenOIDC: success.tokenOIDC,
181+
oidcConfiguration: success.oidcConfiguration,
182+
);
171183
} else {
172184
super.handleSuccessViewState(success);
173185
}
@@ -180,7 +192,9 @@ class LoginController extends ReloadableController {
180192
_handleCheckOIDCIsAvailableFailure(failure);
181193
} else if (failure is GetStoredOidcConfigurationFailure ||
182194
failure is GetOIDCConfigurationFailure ||
183-
failure is GetOIDCIsAvailableFailure) {
195+
failure is GetOIDCIsAvailableFailure ||
196+
failure is SignInTwakeWorkplaceFailure
197+
) {
184198
_handleCommonOIDCFailure();
185199
} else if (failure is GetTokenOIDCFailure) {
186200
_handleNoSuitableBrowserOIDC(failure)
@@ -326,11 +340,41 @@ class LoginController extends ReloadableController {
326340
void _getOIDCConfigurationSuccess(GetOIDCConfigurationSuccess success) {
327341
if (PlatformInfo.isWeb) {
328342
_authenticateOidcOnBrowserAction(success.oidcConfiguration);
343+
} else if (success.oidcConfiguration.authority == AppConfig.saasRegistrationUrl) {
344+
_getTokenOIDCOnSaaSPlatform(success.oidcConfiguration);
329345
} else {
330346
_getTokenOIDCAction(success.oidcConfiguration);
331347
}
332348
}
333349

350+
void _getTokenOIDCOnSaaSPlatform(OIDCConfiguration oidcConfiguration) {
351+
if (_currentBaseUrl != null) {
352+
consumeState(_signInTwakeWorkplaceInteractor.execute(
353+
baseUri: _currentBaseUrl!,
354+
oidcConfiguration: oidcConfiguration,
355+
));
356+
} else {
357+
dispatchState(Left(GetTokenOIDCFailure(CanNotFoundBaseUrl())));
358+
}
359+
}
360+
361+
void _synchronizeTokenAndGetSession({
362+
required Uri baseUri,
363+
required TokenOIDC tokenOIDC,
364+
required OIDCConfiguration oidcConfiguration,
365+
}) {
366+
dynamicUrlInterceptors.setJmapUrl(baseUri.toString());
367+
dynamicUrlInterceptors.changeBaseUrl(baseUri.toString());
368+
authorizationInterceptors.setTokenAndAuthorityOidc(
369+
newToken: tokenOIDC,
370+
newConfig: oidcConfiguration);
371+
authorizationIsolateInterceptors.setTokenAndAuthorityOidc(
372+
newToken: tokenOIDC,
373+
newConfig: oidcConfiguration);
374+
375+
getSessionAction();
376+
}
377+
334378
void _getTokenOIDCAction(OIDCConfiguration config) {
335379
if (_currentBaseUrl != null) {
336380
consumeState(_getTokenOIDCInteractor.execute(_currentBaseUrl!, config));
@@ -357,15 +401,11 @@ class LoginController extends ReloadableController {
357401
}
358402

359403
void _getTokenOIDCSuccess(GetTokenOIDCSuccess success) {
360-
dynamicUrlInterceptors.setJmapUrl(_currentBaseUrl?.toString());
361-
dynamicUrlInterceptors.changeBaseUrl(_currentBaseUrl?.toString());
362-
authorizationInterceptors.setTokenAndAuthorityOidc(
363-
newToken: success.tokenOIDC,
364-
newConfig: success.configuration);
365-
authorizationIsolateInterceptors.setTokenAndAuthorityOidc(
366-
newToken: success.tokenOIDC,
367-
newConfig: success.configuration);
368-
getSessionAction();
404+
_synchronizeTokenAndGetSession(
405+
baseUri: _currentBaseUrl!,
406+
tokenOIDC: success.tokenOIDC,
407+
oidcConfiguration: success.configuration,
408+
);
369409
}
370410

371411
void _loginSuccessAction(AuthenticationUserSuccess success) {

lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,6 @@ class TwakeWelcomeController extends ReloadableController {
4646
void onClickSignIn(BuildContext context) {
4747
TipDialogHelper.loading(AppLocalizations.of(context).loadingPleaseWait);
4848

49-
if (AppConfig.saasJmapServerUrl.isEmpty) {
50-
consumeState(Stream.value(Left(SignInTwakeWorkplaceFailure(CanNotFoundSaasServerUrl()))));
51-
return;
52-
}
53-
5449
final baseUri = Uri.tryParse(AppConfig.saasJmapServerUrl);
5550

5651
if (baseUri == null) {
@@ -71,11 +66,6 @@ class TwakeWelcomeController extends ReloadableController {
7166
void onSignUpTwakeWorkplace(BuildContext context) {
7267
TipDialogHelper.loading(AppLocalizations.of(context).loadingPleaseWait);
7368

74-
if (AppConfig.saasJmapServerUrl.isEmpty) {
75-
consumeState(Stream.value(Left(SignUpTwakeWorkplaceFailure(CanNotFoundSaasServerUrl()))));
76-
return;
77-
}
78-
7969
final baseUri = Uri.tryParse(AppConfig.saasJmapServerUrl);
8070

8171
if (baseUri == null) {

lib/main/utils/app_config.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ class AppConfig {
1616
static const String iOSKeychainSharingService = 'com.linagora.ios.teammail.sessions';
1717
static const String saasPlatform = 'saas';
1818
static const String linagoraPrivacyUrl = 'https://www.linagora.com/en/legal/privacy';
19+
static const String saasRegistrationUrl = 'https://sign-up.stg.lin-saas.com';
20+
static const String saasJmapServerUrl = 'https://jmap.stg.lin-saas.com';
1921

2022
static String get baseUrl => dotenv.get('SERVER_URL', fallback: '');
2123
static String get domainRedirectUrl => dotenv.get('DOMAIN_REDIRECT_URL', fallback: '');
@@ -66,8 +68,4 @@ class AppConfig {
6668
static String get _platformEnv => dotenv.get('PLATFORM', fallback: 'other');
6769

6870
static bool get isSaasPlatForm => _platformEnv.toLowerCase() == saasPlatform;
69-
70-
static String get saasRegistrationUrl => dotenv.get('SAAS_REGISTRATION_URL', fallback: '');
71-
72-
static String get saasJmapServerUrl => dotenv.get('SAAS_JMAP_SERVER_URL', fallback: '');
7371
}

test/features/login/presentation/login_controller_test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import 'package:tmail_ui_user/features/login/presentation/login_controller.dart'
3333
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
3434
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
3535
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
36+
import 'package:tmail_ui_user/features/starting_page/domain/usecase/sign_in_twake_workplace_interactor.dart';
3637
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
3738
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
3839
import 'package:uuid/uuid.dart';
@@ -62,6 +63,7 @@ import 'login_controller_test.mocks.dart';
6263
MockSpec<SaveLoginUsernameOnMobileInteractor>(),
6364
MockSpec<GetAllRecentLoginUsernameOnMobileInteractor>(),
6465
MockSpec<DNSLookupToGetJmapUrlInteractor>(),
66+
MockSpec<SignInTwakeWorkplaceInteractor>(),
6567
MockSpec<GetSessionInteractor>(),
6668
MockSpec<GetAuthenticatedAccountInteractor>(),
6769
MockSpec<UpdateAccountCacheInteractor>(),
@@ -84,6 +86,7 @@ void main() {
8486
late MockSaveLoginUsernameOnMobileInteractor mockSaveLoginUsernameOnMobileInteractor;
8587
late MockGetAllRecentLoginUsernameOnMobileInteractor mockGetAllRecentLoginUsernameOnMobileInteractor;
8688
late MockDNSLookupToGetJmapUrlInteractor mockDNSLookupToGetJmapUrlInteractor;
89+
late MockSignInTwakeWorkplaceInteractor mockSignInTwakeWorkplaceInteractor;
8790
late MockGetSessionInteractor mockGetSessionInteractor;
8891
late MockGetAuthenticatedAccountInteractor mockGetAuthenticatedAccountInteractor;
8992
late MockUpdateAccountCacheInteractor mockUpdateAccountCacheInteractor;
@@ -118,6 +121,7 @@ void main() {
118121
mockSaveLoginUsernameOnMobileInteractor = MockSaveLoginUsernameOnMobileInteractor();
119122
mockGetAllRecentLoginUsernameOnMobileInteractor = MockGetAllRecentLoginUsernameOnMobileInteractor();
120123
mockDNSLookupToGetJmapUrlInteractor = MockDNSLookupToGetJmapUrlInteractor();
124+
mockSignInTwakeWorkplaceInteractor = MockSignInTwakeWorkplaceInteractor();
121125

122126
// mock reloadable controller
123127
mockGetSessionInteractor = MockGetSessionInteractor();
@@ -175,6 +179,7 @@ void main() {
175179
mockSaveLoginUsernameOnMobileInteractor,
176180
mockGetAllRecentLoginUsernameOnMobileInteractor,
177181
mockDNSLookupToGetJmapUrlInteractor,
182+
mockSignInTwakeWorkplaceInteractor,
178183
);
179184

180185

0 commit comments

Comments
 (0)