authenticate method

Future<GoogleAuthSuccess> authenticate(
  1. Session session, {
  2. required String idToken,
  3. required String? accessToken,
  4. required Transaction? transaction,
})

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,
  );
}