From c3f42710c3e65af7466b0d1600b5e16a48d88975 Mon Sep 17 00:00:00 2001 From: Jonas Martinez <36544012+jonas-martinez@users.noreply.github.com> Date: Tue, 17 Oct 2023 12:37:09 +0200 Subject: [PATCH] feat: Remove AuthModel to only use OAuthModel (#103) --- lib/models/auth_model.dart | 83 --------------------- lib/navigator/guard.dart | 7 +- lib/oauth/oauth_model.dart | 70 +++++++++++++++-- lib/views/profile/change_password_form.dart | 8 +- 4 files changed, 70 insertions(+), 98 deletions(-) delete mode 100644 lib/models/auth_model.dart diff --git a/lib/models/auth_model.dart b/lib/models/auth_model.dart deleted file mode 100644 index 666e183..0000000 --- a/lib/models/auth_model.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:client_common/api/request_models/ask_code_lost_password_request.dart'; -import 'package:client_common/api/request_models/change_password_request.dart'; -import 'package:client_common/api/request_models/send_code_lost_password_request.dart'; -import 'package:client_common/api/request_models/validate_dev_request.dart'; -import 'package:client_common/api/response_models/empty_response.dart'; -import 'package:client_common/api/response_models/user.dart'; -import 'package:client_common/api/response_models/user_response.dart'; -import 'package:client_common/api/user_api.dart'; -import 'package:client_common/models/status.dart'; -import 'package:client_common/navigator/common_navigator.dart'; -import 'package:flutter/material.dart'; -import 'package:oauth2_client/access_token_response.dart'; - -/// The model that manages the authentication of the user. -class AuthModel extends ChangeNotifier { - /// The access token of the user. - AccessTokenResponse? accessToken; - User? user; - - final Status refreshStatus = Status(); - final Status validateUserStatus = Status(); - final Status resendRegistrationTokenStatus = Status(); - final Status validateDevStatus = Status(); - - final Status logoutStatus = Status(); - - final Status askCodeLostPasswordStatus = Status(); - final Status sendCodeLostPasswordStatus = Status(); - final Status changePasswordStatus = Status(); - - /// The route to redirect to after the user has logged in or out. - String? redirectToRoute; - - /// The user is authenticated if his access token is set. - bool isAuthenticated() { - return accessToken != null && user != null; - } - - bool isOneOfRole(List roles) { - if (user == null) return false; - return roles.contains(user?.role); - } - - Future validateDev() async { - var res = await validateDevStatus.handle(() => UserApi.validateDev(ValidateDevRequest()), notifyListeners); - user = res.user; - return res; - } - - Future logout() async { - var res = await logoutStatus.handle(UserApi.logout, notifyListeners); - accessToken = null; - user = null; - notifyListeners(); - return res; - } - - Future askCodeLostPassword(String email) async { - var res = await askCodeLostPasswordStatus.handle( - () => UserApi.askCodeLostPassword(AskCodeLostPasswordRequest(email)), notifyListeners); - notifyListeners(); - return res; - } - - Future sendCodeLostPassword(String code, String email, String password, String confirmation) async { - var res = await sendCodeLostPasswordStatus.handle( - () => UserApi.sendCodeLostPassword(SendCodeLostPasswordRequest(code, email, password, confirmation)), - notifyListeners); - notifyListeners(); - return res; - } - - Future changePassword(String old, String password, String confirmation) async { - var res = await changePasswordStatus.handle( - () => UserApi.changePassword(ChangePasswordRequest(old, password, confirmation)), notifyListeners); - notifyListeners(); - return res; - } - - String getRedirectionRouteAfterAuthentication() { - return redirectToRoute ?? CommonNavigator.homeRoute; - } -} diff --git a/lib/navigator/guard.dart b/lib/navigator/guard.dart index 9b22d49..e6eb2ea 100644 --- a/lib/navigator/guard.dart +++ b/lib/navigator/guard.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:client_common/api/response_models/app_response.dart'; import 'package:client_common/api/response_models/user.dart'; -import 'package:client_common/models/auth_model.dart'; import 'package:client_common/models/user_application_model.dart'; import 'package:client_common/navigator/common_navigator.dart'; import 'package:client_common/oauth/oauth_model.dart'; @@ -25,13 +24,11 @@ class Guard { static final Guard checkNotHaveApp = Guard(isValid: haveApp(false), onInvalid: toHome); static Future isDev(BuildContext context) async { - AuthModel authModel = context.read(); - return authModel.isOneOfRole(_devOrMore); + return context.read().isOneOfRole(_devOrMore); } static Future isNotDev(BuildContext context) async { - AuthModel authModel = context.read(); - return authModel.isOneOfRole(UserRole.values.where((ur) => !_devOrMore.contains(ur)).toList()); + return context.read().isOneOfRole(UserRole.values.where((ur) => !_devOrMore.contains(ur)).toList()); } static IsValid haveApp(bool mustHaveApp) { diff --git a/lib/oauth/oauth_model.dart b/lib/oauth/oauth_model.dart index 8784eb6..89d45ee 100644 --- a/lib/oauth/oauth_model.dart +++ b/lib/oauth/oauth_model.dart @@ -1,5 +1,15 @@ import 'dart:async'; +import 'package:client_common/api/request_models/ask_code_lost_password_request.dart'; +import 'package:client_common/api/request_models/change_password_request.dart'; +import 'package:client_common/api/request_models/send_code_lost_password_request.dart'; +import 'package:client_common/api/request_models/validate_dev_request.dart'; +import 'package:client_common/api/response_models/empty_response.dart'; +import 'package:client_common/api/response_models/user.dart'; +import 'package:client_common/api/response_models/user_response.dart'; +import 'package:client_common/api/user_api.dart'; +import 'package:client_common/models/status.dart'; +import 'package:client_common/navigator/common_navigator.dart'; import 'package:client_common/oauth/oauth.dart'; import 'package:client_common/utils/connexion_utils_stub.dart' if (dart.library.io) 'package:client_common/utils/connexion_utils_io.dart' @@ -9,7 +19,6 @@ import 'package:oauth2_client/access_token_response.dart'; import 'package:oauth2_client/oauth2_helper.dart'; class OAuthModel extends ChangeNotifier { - AccessTokenResponse? accessToken; late OAuth2Helper helper; String beforeRedirectPath = "/"; @@ -17,6 +26,22 @@ class OAuthModel extends ChangeNotifier { String redirectUrl; List scopes; + User? user; + + final Status refreshStatus = Status(); + final Status validateUserStatus = Status(); + final Status resendRegistrationTokenStatus = Status(); + final Status validateDevStatus = Status(); + + final Status logoutStatus = Status(); + + final Status askCodeLostPasswordStatus = Status(); + final Status sendCodeLostPasswordStatus = Status(); + final Status changePasswordStatus = Status(); + + /// The route to redirect to after the user has logged in or out. + String? redirectToRoute; + OAuthModel(this.clientId, this.redirectUrl, {this.scopes = const []}) { helper = OAuth2Helper( LenraOAuth2Client( @@ -30,11 +55,7 @@ class OAuthModel extends ChangeNotifier { } Future authenticate() async { - accessToken = await helper.getToken(); - - notifyListeners(); - - return accessToken; + return await helper.getToken(); } Future logout() async { @@ -64,4 +85,41 @@ class OAuthModel extends ChangeNotifier { return "http"; } } + + bool isOneOfRole(List roles) { + if (user == null) return false; + return roles.contains(user?.role); + } + + Future validateDev() async { + var res = await validateDevStatus.handle(() => UserApi.validateDev(ValidateDevRequest()), notifyListeners); + user = res.user; + return res; + } + + Future askCodeLostPassword(String email) async { + var res = await askCodeLostPasswordStatus.handle( + () => UserApi.askCodeLostPassword(AskCodeLostPasswordRequest(email)), notifyListeners); + notifyListeners(); + return res; + } + + Future sendCodeLostPassword(String code, String email, String password, String confirmation) async { + var res = await sendCodeLostPasswordStatus.handle( + () => UserApi.sendCodeLostPassword(SendCodeLostPasswordRequest(code, email, password, confirmation)), + notifyListeners); + notifyListeners(); + return res; + } + + Future changePassword(String old, String password, String confirmation) async { + var res = await changePasswordStatus.handle( + () => UserApi.changePassword(ChangePasswordRequest(old, password, confirmation)), notifyListeners); + notifyListeners(); + return res; + } + + String getRedirectionRouteAfterAuthentication() { + return redirectToRoute ?? CommonNavigator.homeRoute; + } } diff --git a/lib/views/profile/change_password_form.dart b/lib/views/profile/change_password_form.dart index 6fcabab..1d78fc2 100644 --- a/lib/views/profile/change_password_form.dart +++ b/lib/views/profile/change_password_form.dart @@ -1,5 +1,5 @@ import 'package:client_common/api/response_models/api_error.dart'; -import 'package:client_common/models/auth_model.dart'; +import 'package:client_common/oauth/oauth_model.dart'; import 'package:client_common/views/error.dart'; import 'package:client_common/views/loading_button.dart'; import 'package:flutter/material.dart'; @@ -34,8 +34,8 @@ class _ChangePasswordState extends State { @override Widget build(BuildContext context) { - bool isChangingPassword = context.select((m) => m.changePasswordStatus.isFetching()); - ApiError? changePasswordError = context.select((m) => m.changePasswordStatus.error); + bool isChangingPassword = context.select((m) => m.changePasswordStatus.isFetching()); + ApiError? changePasswordError = context.select((m) => m.changePasswordStatus.error); return Form( key: _formKey, @@ -112,7 +112,7 @@ class _ChangePasswordState extends State { child: LoadingButton( onPressed: () { if (_formKey.currentState!.validate()) { - context.read().changePassword( + context.read().changePassword( oldPassword, newPassword, newPasswordConfirmation,