auth/wyatt_arch_migration #25
| @ -1,338 +0,0 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'dart:async'; | ||||
| 
 | ||||
| import 'package:firebase_auth/firebase_auth.dart'; | ||||
| import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; | ||||
| import 'package:google_sign_in/google_sign_in.dart'; | ||||
| import 'package:sign_in_with_apple/sign_in_with_apple.dart'; | ||||
| import 'package:twitter_login/twitter_login.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/core/enum/auth_cubit_status.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/core/exceptions/exceptions_firebase.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/core/extensions/firebase_auth_user_x.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/core/utils/cryptography.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/data/models/user_firebase.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/domain/entities/user.dart' | ||||
|     as wyatt; | ||||
| import 'package:wyatt_authentication_bloc/src/domain/repositories/authentication_repository.dart'; | ||||
| 
 | ||||
| class AuthenticationRepositoryFirebase implements AuthenticationRepository { | ||||
|   final _controller = StreamController<AuthCubitStatus>(); | ||||
|   final FirebaseAuth _firebaseAuth; | ||||
|   final TwitterLogin? _twitterLogin; | ||||
| 
 | ||||
|   UserFirebase _userCache = const UserFirebase.empty(); | ||||
| 
 | ||||
|   AuthenticationRepositoryFirebase({ | ||||
|     FirebaseAuth? firebaseAuth, | ||||
|     TwitterLogin? twitterLogin, | ||||
|   })  : _firebaseAuth = firebaseAuth ?? FirebaseAuth.instance, | ||||
|         _twitterLogin = twitterLogin { | ||||
|     _controller.sink.add(AuthCubitStatus.stoped); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Stream<AuthCubitStatus> get cubitStatus => | ||||
|       _controller.stream.asBroadcastStream(); | ||||
| 
 | ||||
|   @override | ||||
|   void changeCubitStatus(AuthCubitStatus status) => | ||||
|       _controller.sink.add(status); | ||||
| 
 | ||||
|   @override | ||||
|   Stream<wyatt.User> get user => | ||||
|       _firebaseAuth.userChanges().map((firebaseUser) { | ||||
|         final UserFirebase user = (firebaseUser == null) | ||||
|             ? const UserFirebase.empty() | ||||
|             : firebaseUser.model; | ||||
|         _userCache = user; | ||||
|         return user; | ||||
|       }); | ||||
| 
 | ||||
|   @override | ||||
|   wyatt.User get currentUser => _userCache; | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> applyActionCode(String code) async { | ||||
|     try { | ||||
|       await _firebaseAuth.applyActionCode(code); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw ApplyActionCodeFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw ApplyActionCodeFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<String?> signUp({ | ||||
|     required String email, | ||||
|     required String password, | ||||
|   }) async { | ||||
|     try { | ||||
|       final creds = await _firebaseAuth.createUserWithEmailAndPassword( | ||||
|         email: email, | ||||
|         password: password, | ||||
|       ); | ||||
|       return creds.user?.uid; | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw SignUpWithEmailAndPasswordFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw SignUpWithEmailAndPasswordFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<List<String>> fetchSignInMethodsForEmail({ | ||||
|     required String email, | ||||
|   }) async { | ||||
|     try { | ||||
|       return await _firebaseAuth.fetchSignInMethodsForEmail(email); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw FetchSignInMethodsForEmailFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw FetchSignInMethodsForEmailFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> signInAnonymously() async { | ||||
|     try { | ||||
|       await _firebaseAuth.signInAnonymously(); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw SignInAnonymouslyFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw SignInAnonymouslyFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> signInWithGoogle() async { | ||||
|     // Trigger the authentication flow | ||||
|     final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn(); | ||||
| 
 | ||||
|     // Obtain the auth details from the request | ||||
|     final GoogleSignInAuthentication? googleAuth = | ||||
|         await googleUser?.authentication; | ||||
| 
 | ||||
|     // Create a new credential | ||||
|     final credential = GoogleAuthProvider.credential( | ||||
|       accessToken: googleAuth?.accessToken, | ||||
|       idToken: googleAuth?.idToken, | ||||
|     ); | ||||
| 
 | ||||
|     try { | ||||
|       await _firebaseAuth.signInWithCredential(credential); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw SignInWithGoogleFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw SignInWithGoogleFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> signInWithFacebook() async { | ||||
|     // Trigger the sign-in flow | ||||
|     final LoginResult loginResult = await FacebookAuth.instance.login(); | ||||
| 
 | ||||
|     // Create a credential from the access token | ||||
|     final OAuthCredential credential = | ||||
|         FacebookAuthProvider.credential(loginResult.accessToken?.token ?? ''); | ||||
| 
 | ||||
|     try { | ||||
|       await _firebaseAuth.signInWithCredential(credential); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw SignInWithFacebookFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw SignInWithFacebookFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> signInWithApple() async { | ||||
|     // To prevent replay attacks with the credential returned from Apple, we | ||||
|     // include a nonce in the credential request. When signing in with | ||||
|     // Firebase, the nonce in the id token returned by Apple, is expected to | ||||
|     // match the sha256 hash of `rawNonce`. | ||||
|     final rawNonce = Cryptography.generateNonce(); | ||||
|     final nonce = Cryptography.sha256ofString(rawNonce); | ||||
| 
 | ||||
|     // Request credential for the currently signed in Apple account. | ||||
|     final appleCredential = await SignInWithApple.getAppleIDCredential( | ||||
|       scopes: [ | ||||
|         AppleIDAuthorizationScopes.email, | ||||
|         AppleIDAuthorizationScopes.fullName, | ||||
|       ], | ||||
|       nonce: nonce, | ||||
|     ); | ||||
| 
 | ||||
|     // Create an `OAuthCredential` from the credential returned by Apple. | ||||
|     final credential = OAuthProvider('apple.com').credential( | ||||
|       idToken: appleCredential.identityToken, | ||||
|       rawNonce: rawNonce, | ||||
|     ); | ||||
| 
 | ||||
|     // Sign in the user with Firebase. If the nonce we generated earlier does | ||||
|     // not match the nonce in `appleCredential.identityToken`, | ||||
|     // sign in will fail. | ||||
|     try { | ||||
|       await _firebaseAuth.signInWithCredential(credential); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw SignInWithAppleFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw SignInWithAppleFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> signInWithTwitter() async { | ||||
|     final twitterLogin = _twitterLogin; | ||||
|     if (twitterLogin == null) { | ||||
|       throw SignInWithTwitterFailureFirebase(); | ||||
|     } | ||||
| 
 | ||||
|     // Trigger the sign-in flow | ||||
|     final authResult = await twitterLogin.login(); | ||||
| 
 | ||||
|     // Create a credential from the access token | ||||
|     final credential = TwitterAuthProvider.credential( | ||||
|       accessToken: authResult.authToken!, | ||||
|       secret: authResult.authTokenSecret!, | ||||
|     ); | ||||
| 
 | ||||
|     try { | ||||
|       await _firebaseAuth.signInWithCredential(credential); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw SignInWithCredentialFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw SignInWithCredentialFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> signInWithEmailLink(String email, String emailLink) async { | ||||
|     try { | ||||
|       await _firebaseAuth.signInWithEmailLink( | ||||
|         email: email, | ||||
|         emailLink: emailLink, | ||||
|       ); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw SignInWithEmailLinkFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw SignInWithEmailLinkFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> signInWithEmailAndPassword({ | ||||
|     required String email, | ||||
|     required String password, | ||||
|   }) async { | ||||
|     try { | ||||
|       await _firebaseAuth.signInWithEmailAndPassword( | ||||
|         email: email, | ||||
|         password: password, | ||||
|       ); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw SignInWithEmailAndPasswordFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw SignInWithEmailAndPasswordFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> sendEmailVerification() async { | ||||
|     try { | ||||
|       await _userCache.inner!.sendEmailVerification(); | ||||
|     } catch (e) { | ||||
|       throw SendEmailVerificationFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> sendPasswordResetEmail({required String email}) async { | ||||
|     try { | ||||
|       await _firebaseAuth.sendPasswordResetEmail(email: email); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw SendPasswordResetEmailFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw SendPasswordResetEmailFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> sendSignInLinkEmail({required String email}) async { | ||||
|     try { | ||||
|       // TODO(hpcl): implement sendSignInLinkEmail | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw SendSignInLinkEmailFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw SendSignInLinkEmailFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> confirmPasswordReset({ | ||||
|     required String code, | ||||
|     required String newPassword, | ||||
|   }) async { | ||||
|     try { | ||||
|       await _firebaseAuth.confirmPasswordReset( | ||||
|         code: code, | ||||
|         newPassword: newPassword, | ||||
|       ); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw ConfirmPasswordResetFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw ConfirmPasswordResetFailureFirebase(); | ||||
|     } | ||||
|     throw UnimplementedError(); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> verifyPasswordResetCode({required String code}) async { | ||||
|     try { | ||||
|       await _firebaseAuth.verifyPasswordResetCode(code); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw VerifyPasswordResetCodeFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw VerifyPasswordResetCodeFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> signOut() async { | ||||
|     try { | ||||
|       await Future.wait([ | ||||
|         _firebaseAuth.signOut(), | ||||
|       ]); | ||||
|       _userCache = const UserFirebase.empty(); | ||||
|     } catch (_) { | ||||
|       throw SignOutFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> refresh() async { | ||||
|     try { | ||||
|       await _userCache.inner!.reload(); | ||||
|     } on FirebaseAuthException catch (e) { | ||||
|       throw RefreshFailureFirebase.fromCode(e.code); | ||||
|     } catch (_) { | ||||
|       throw RefreshFailureFirebase(); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,156 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:wyatt_architecture/wyatt_architecture.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/data/models/account_wrapper_model.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/domain/data_sources/local/authentication_local_data_source.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/domain/data_sources/remote/authentication_remote_data_source.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/domain/entities/account.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/domain/entities/account_wrapper.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/domain/repositories/authentication_repository.dart'; | ||||
| import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | ||||
| 
 | ||||
| class AuthenticationRepositoryImpl<T extends Object> | ||||
|     extends AuthenticationRepository<T> { | ||||
|   final AuthenticationLocalDataSource<T> _authenticationLocalDataSource; | ||||
|   final AuthenticationRemoteDataSource _authenticationRemoteDataSource; | ||||
| 
 | ||||
|   final FutureResult<T?> Function(Account? account)? _onSignUpSuccess; | ||||
|   final FutureResult<T?> Function(Account? account)? _onAccountChanges; | ||||
| 
 | ||||
|   AuthenticationRepositoryImpl( | ||||
|     this._authenticationLocalDataSource, | ||||
|     this._authenticationRemoteDataSource, | ||||
|     this._onSignUpSuccess, | ||||
|     this._onAccountChanges, | ||||
|   ); | ||||
| 
 | ||||
|   @override | ||||
|   FutureResult<Account> signInWithEmailAndPassword({ | ||||
|     required String email, | ||||
|     required String password, | ||||
|   }) => | ||||
|       Result.tryCatchAsync<Account, AppException, AppException>( | ||||
|         () async { | ||||
|           final account = | ||||
|               await _authenticationRemoteDataSource.signInWithEmailAndPassword( | ||||
|             email: email, | ||||
|             password: password, | ||||
|           ); | ||||
|           _authenticationLocalDataSource.storeAccount(account); | ||||
|           return account; | ||||
|         }, | ||||
|         (error) => error, | ||||
|       ); | ||||
| 
 | ||||
|   @override | ||||
|   FutureResult<void> signOut() => | ||||
|       Result.tryCatchAsync<void, AppException, AppException>( | ||||
|         () async { | ||||
|           await _authenticationRemoteDataSource.signOut(); | ||||
|           _authenticationLocalDataSource.destroy(); | ||||
|         }, | ||||
|         (error) => error, | ||||
|       ); | ||||
| 
 | ||||
|   @override | ||||
|   FutureResult<Account> signUp({ | ||||
|     required String email, | ||||
|     required String password, | ||||
|   }) => | ||||
|       Result.tryCatchAsync<Account, AppException, AppException>( | ||||
|         () async { | ||||
|           final account = await _authenticationRemoteDataSource.signUp( | ||||
|             email: email, | ||||
|             password: password, | ||||
|           ); | ||||
|           _authenticationLocalDataSource.storeAccount(account); | ||||
|           if (_onSignUpSuccess.isNotNull) { | ||||
|             final dataResult = await _onSignUpSuccess!.call(account); | ||||
|             dataResult.fold( | ||||
|               _authenticationLocalDataSource.storeData, | ||||
|               (error) => throw error, | ||||
|             ); | ||||
|           } | ||||
|           return account; | ||||
|         }, | ||||
|         (error) => error, | ||||
|       ); | ||||
| 
 | ||||
|   @override | ||||
|   Result<void, AppException> destroyCache() => | ||||
|       Result.tryCatch<void, AppException, AppException>( | ||||
|         _authenticationLocalDataSource.destroy, | ||||
|         (error) => error, | ||||
|       ); | ||||
| 
 | ||||
|   @override | ||||
|   Result<Account, AppException> getAccount() => | ||||
|       Result.tryCatch<Account, AppException, AppException>( | ||||
|         _authenticationLocalDataSource.loadAccount, | ||||
|         (error) => error, | ||||
|       ); | ||||
| 
 | ||||
|   @override | ||||
|   Result<Account, AppException> setAccount( | ||||
|     Account account, | ||||
|   ) => | ||||
|       Result.tryCatch<Account, AppException, AppException>( | ||||
|         () { | ||||
|           _authenticationLocalDataSource.storeAccount(account); | ||||
|           return account; | ||||
|         }, | ||||
|         (error) => error, | ||||
|       ); | ||||
| 
 | ||||
|   @override | ||||
|   Result<T, AppException> getData() => | ||||
|       Result.tryCatch<T, AppException, AppException>( | ||||
|         _authenticationLocalDataSource.loadData, | ||||
|         (error) => error, | ||||
|       ); | ||||
| 
 | ||||
|   @override | ||||
|   Result<T, AppException> setData( | ||||
|     T data, | ||||
|   ) => | ||||
|       Result.tryCatch<T, AppException, AppException>( | ||||
|         () { | ||||
|           _authenticationLocalDataSource.storeData(data); | ||||
|           return data; | ||||
|         }, | ||||
|         (error) => error, | ||||
|       ); | ||||
| 
 | ||||
|   @override | ||||
|   FutureResult<String> getIdentityToken() => | ||||
|       Result.tryCatchAsync<String, AppException, AppException>( | ||||
|         _authenticationRemoteDataSource.getIdentityToken, | ||||
|         (error) => error, | ||||
|       ); | ||||
| 
 | ||||
|   @override | ||||
|   Stream<FutureResult<AccountWrapper<T>>> streamAccount() => | ||||
|       _authenticationRemoteDataSource.streamAccount().map((account) async { | ||||
|         if (_onAccountChanges.isNotNull) { | ||||
|           final dataResult = await _onAccountChanges!.call(account); | ||||
|           return dataResult.map((data) => AccountWrapperModel(account, data)); | ||||
|         } | ||||
|         return Ok<AccountWrapperModel<T>, AppException>( | ||||
|           AccountWrapperModel<T>(account, null), | ||||
|         ); | ||||
|       }); | ||||
| } | ||||
| @ -0,0 +1,17 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| //  | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| //  | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| //  | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| export 'authentication_repository_impl.dart'; | ||||
| @ -14,126 +14,34 @@ | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:wyatt_authentication_bloc/src/core/enum/auth_cubit_status.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/core/exceptions/exceptions.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/domain/entities/user.dart'; | ||||
| import 'package:wyatt_architecture/wyatt_architecture.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/domain/entities/account.dart'; | ||||
| import 'package:wyatt_authentication_bloc/src/domain/entities/account_wrapper.dart'; | ||||
| import 'package:wyatt_type_utils/wyatt_type_utils.dart'; | ||||
| 
 | ||||
| /// {@template authentication_repository} | ||||
| /// Repository which manages user authentication. | ||||
| /// {@endtemplate} | ||||
| abstract class AuthenticationRepository { | ||||
|   /// Stream of [AuthCubitStatus] wich will emit the current cubit status. | ||||
|   Stream<AuthCubitStatus> get cubitStatus; | ||||
| abstract class AuthenticationRepository<T> extends BaseRepository { | ||||
|   FutureResult<Account> signUp({ | ||||
|     required String email, | ||||
|     required String password, | ||||
|      | ||||
|   /// Changes cubit status.(Useful to start or stop the engine.) | ||||
|   void changeCubitStatus(AuthCubitStatus status); | ||||
|   }); | ||||
| 
 | ||||
|   /// Stream of [User] which will emit the current user when | ||||
|   /// the authentication state changes. | ||||
|   /// | ||||
|   /// Emits [User.empty] if the user is not authenticated. | ||||
|   Stream<User> get user; | ||||
| 
 | ||||
|   /// Returns the current cached account. | ||||
|   /// Defaults to [User.empty] if there is no cached user. | ||||
|   User get currentUser; | ||||
| 
 | ||||
|   /// Applies action code | ||||
|   /// | ||||
|   /// [code] - The action code sent to the user's email address. | ||||
|   /// Throw [ApplyActionCodeFailureInterface] if an exception occurs. | ||||
|   Future<void> applyActionCode(String code); | ||||
| 
 | ||||
|   /// Creates a new user with the provided [email] and [password]. | ||||
|   /// | ||||
|   /// Returns the newly created user's unique identifier. | ||||
|   /// | ||||
|   /// Throws a [SignUpWithEmailAndPasswordFailureInterface] if | ||||
|   /// an exception occurs. | ||||
|   Future<String?> signUp({required String email, required String password}); | ||||
| 
 | ||||
|   /// Fetches sign in methods for [email]. | ||||
|   /// | ||||
|   /// Throws a [FetchSignInMethodsForEmailFailureInterface] if | ||||
|   /// an exception occurs. | ||||
|   Future<List<String>> fetchSignInMethodsForEmail({required String email}); | ||||
| 
 | ||||
|   /// Sign in anonimously. | ||||
|   /// | ||||
|   /// Throws a [SignInAnonymouslyFailureInterface] if an exception occurs. | ||||
|   Future<void> signInAnonymously(); | ||||
| 
 | ||||
|   /// Starts the Sign In with Google Flow. | ||||
|   /// | ||||
|   /// Throws a [SignInWithGoogleFailureInterface] if an exception occurs. | ||||
|   Future<void> signInWithGoogle(); | ||||
| 
 | ||||
|   /// Starts the Sign In with Facebook Flow. | ||||
|   /// | ||||
|   /// Throws a [SignInWithFacebookFailureInterface] if an exception occurs. | ||||
|   Future<void> signInWithFacebook(); | ||||
| 
 | ||||
|   /// Starts the Sign In with Apple Flow. | ||||
|   /// | ||||
|   /// Throws a [SignInWithAppleFailureInterface] if an exception occurs. | ||||
|   Future<void> signInWithApple(); | ||||
| 
 | ||||
|   /// Starts the Sign In with Twitter Flow. | ||||
|   /// | ||||
|   /// Throws a [SignInWithTwitterFailureInterface] if an exception occurs. | ||||
|   Future<void> signInWithTwitter(); | ||||
| 
 | ||||
|   /// Signs in using an email address and email sign-in link. | ||||
|   /// | ||||
|   /// Throws a [SignInWithEmailLinkFailureInterface] if an exception occurs. | ||||
|   Future<void> signInWithEmailLink( | ||||
|     String email, | ||||
|     String emailLink, | ||||
|   ); | ||||
| 
 | ||||
|   /// Signs in with the provided [email] and [password]. | ||||
|   /// | ||||
|   /// Throws a [SignInWithEmailAndPasswordFailureInterface] if | ||||
|   /// an exception occurs. | ||||
|   Future<void> signInWithEmailAndPassword({ | ||||
|   FutureResult<Account> signInWithEmailAndPassword({ | ||||
|     required String email, | ||||
|     required String password, | ||||
|   }); | ||||
| 
 | ||||
|   /// Sends verification email to the provided [user]. | ||||
|   /// | ||||
|   /// Throws a [SendEmailVerificationFailureInterface] if an exception occurs. | ||||
|   Future<void> sendEmailVerification(); | ||||
|   FutureResult<void> signOut(); | ||||
| 
 | ||||
|   /// Sends a password reset email to the provided [email]. | ||||
|   /// | ||||
|   /// Throws a [SendPasswordResetEmailFailureInterface] if an exception occurs. | ||||
|   Future<void> sendPasswordResetEmail({required String email}); | ||||
|   Stream<FutureResult<AccountWrapper<T>>> streamAccount(); | ||||
| 
 | ||||
|   /// Sends link to login. | ||||
|   /// | ||||
|   /// Throws a [SendSignInLinkEmailFailureInterface] if an exception occurs. | ||||
|   Future<void> sendSignInLinkEmail({required String email}); | ||||
|   FutureResult<String> getIdentityToken(); | ||||
| 
 | ||||
|   /// Confirms the password reset with the provided [newPassword] and [code]. | ||||
|   /// | ||||
|   /// Throws a [ConfirmPasswordResetFailureInterface] if an exception occurs. | ||||
|   Future<void> confirmPasswordReset({ | ||||
|     required String code, | ||||
|     required String newPassword, | ||||
|   }); | ||||
|   Result<Account, AppException> getAccount(); | ||||
|   Result<Account, AppException> setAccount(Account account); | ||||
| 
 | ||||
|   /// Verify password reset code. | ||||
|   /// | ||||
|   /// Throws a [VerifyPasswordResetCodeFailureInterface] if an exception occurs. | ||||
|   Future<void> verifyPasswordResetCode({required String code}); | ||||
|   Result<T, AppException> getData(); | ||||
|   Result<T, AppException> setData(T data); | ||||
| 
 | ||||
|   /// Signs out the current user which will emit | ||||
|   /// [User.empty] from the [user] Stream. | ||||
|   Future<void> signOut(); | ||||
| 
 | ||||
|   /// Refreshes the current user. | ||||
|   /// | ||||
|   /// Throws a [RefreshFailureInterface] if an exception occurs. | ||||
|   Future<void> refresh(); | ||||
|   Result<void, AppException> destroyCache(); | ||||
| } | ||||
|  | ||||
| @ -0,0 +1,17 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| //  | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| //  | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| //  | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| export 'authentication_repository.dart'; | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user