authenticate method
Authenticates a user using an access token.
If the external user ID is not yet known in the system, a new AuthUser
is created for it.
Implementation
Future<GoogleAuthSuccess> authenticate(
final Session session, {
required final String idToken,
required final String? accessToken,
required final Transaction? transaction,
}) async {
final accountDetails = await fetchAccountDetails(
session,
idToken: idToken,
accessToken: accessToken,
);
var googleAccount = await GoogleAccount.db.findFirstRow(
session,
where: (final t) => t.userIdentifier.equals(
accountDetails.userIdentifier,
),
transaction: transaction,
);
final createNewUser = googleAccount == null;
final AuthUserModel authUser = switch (createNewUser) {
true => await _authUsers.create(
session,
transaction: transaction,
),
false => await _authUsers.get(
session,
authUserId: googleAccount!.authUserId,
transaction: transaction,
),
};
if (createNewUser) {
googleAccount = await linkGoogleAuthentication(
session,
authUserId: authUser.id,
accountDetails: accountDetails,
transaction: transaction,
);
}
return (
googleAccountId: googleAccount.id!,
authUserId: googleAccount.authUserId,
details: accountDetails,
newAccount: createNewUser,
scopes: authUser.scopes,
);
}