authentication/feature/google_signin #105

Merged
malo merged 7 commits from authentication/feature/google_signin into master 2022-12-13 22:07:17 +00:00
5 changed files with 72 additions and 1 deletions
Showing only changes of commit c7b241de2d - Show all commits

View File

@ -14,7 +14,6 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:firebase_auth/firebase_auth.dart';
import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart'; import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart';
import 'package:wyatt_type_utils/wyatt_type_utils.dart'; import 'package:wyatt_type_utils/wyatt_type_utils.dart';
@ -182,6 +181,39 @@ class AuthenticationFirebaseDataSourceImpl
} }
} }
@override
Future<Account> signInWithGoogle() async {
try {
// 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,
);
final userCredential =
await _firebaseAuth.signInWithCredential(credential);
_latestCreds = userCredential;
final user = userCredential.user;
if (user.isNotNull) {
return _mapper(user!);
} else {
throw Exception(); // Get caught just after.
}
malo marked this conversation as resolved Outdated
Outdated
Review

Maybe parsing the data into a model should be the responsibility of the model, not the data source?

Maybe add fromFirebaseUser(..) parser method to AccountModel.

Maybe parsing the data into a model should be the responsibility of the model, not the data source? Maybe add `fromFirebaseUser(..)` parser method to `AccountModel`.
} on FirebaseAuthException catch (e) {
throw SignInWithGoogleFailureFirebase.fromCode(e.code);
} catch (_) {
throw SignInWithGoogleFailureFirebase();
}
}
@override @override
Future<bool> verifyPasswordResetCode({required String code}) async { Future<bool> verifyPasswordResetCode({required String code}) async {
try { try {

View File

@ -123,6 +123,25 @@ class AuthenticationMockDataSourceImpl extends AuthenticationRemoteDataSource {
return Future.value(mock); return Future.value(mock);
} }
@override
Future<Account> signInWithGoogle() async {
await _randomDelay();
final creation = DateTime.now();
final mock = AccountModel(
uid: 'mock-id-google',
emailVerified: true,
isAnonymous: false,
providerId: 'google',
creationTime: creation,
lastSignInTime: creation,
isNewUser: creation == creation,
);
_streamAccount.add(mock);
_connectedMock = _connectedMock?.copyWith(left: mock);
_lastSignInTime = DateTime.now();
return Future.value(mock);
}
@override @override
Future<Account> signInWithEmailAndPassword({ Future<Account> signInWithEmailAndPassword({
required String email, required String email,

View File

@ -295,6 +295,17 @@ class AuthenticationRepositoryImpl<T extends Object>
(error) => error, (error) => error,
); );
@override
FutureOrResult<Account> signInWithGoogle() =>
Result.tryCatchAsync<Account, AppException, AppException>(
() async {
final account =
await _authenticationRemoteDataSource.signInWithGoogle();
return account;
},
(error) => error,
);
@override @override
FutureOrResult<bool> verifyPasswordResetCode({required String code}) => FutureOrResult<bool> verifyPasswordResetCode({required String code}) =>
Result.tryCatchAsync<bool, AppException, AppException>( Result.tryCatchAsync<bool, AppException, AppException>(

View File

@ -49,6 +49,8 @@ abstract class AuthenticationRemoteDataSource extends BaseRemoteDataSource {
Future<Account> signInAnonymously(); Future<Account> signInAnonymously();
Future<Account> signInWithGoogle();
Future<Account> updateEmail({required String email}); Future<Account> updateEmail({required String email});
Future<Account> updatePassword({required String password}); Future<Account> updatePassword({required String password});

View File

@ -73,6 +73,13 @@ abstract class AuthenticationRepository<T> extends BaseRepository {
/// {@endtemplate} /// {@endtemplate}
FutureOrResult<Account> signInAnonymously(); FutureOrResult<Account> signInAnonymously();
/// {@template signin_google}
/// Starts the Sign In with Google Flow.
///
/// Throws a SignInWithGoogleFailureInterface if an exception occurs.
/// {@endtemplate}
FutureOrResult<Account> signInWithGoogle();
/// {@template signin_pwd} /// {@template signin_pwd}
/// Signs in with the provided [email] and [password]. /// Signs in with the provided [email] and [password].
/// ///