authenticate method

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

Authenticates a user using a Facebook access token.

This method verifies the token with Facebook's Debug Token API and fetches the user's profile information. If the Facebook user ID is not yet known in the system, a new AuthUser is created.

Implementation

Future<FacebookAuthSuccess> authenticate(
  final Session session, {
  required final String accessToken,
  required final Transaction? transaction,
}) async {
  final accountDetails = await fetchAccountDetails(
    session,
    accessToken: accessToken,
  );

  var facebookAccount = await FacebookAccount.db.findFirstRow(
    session,
    where: (final t) => t.userIdentifier.equals(
      accountDetails.userIdentifier,
    ),
    transaction: transaction,
  );

  final createNewUser = facebookAccount == null;

  final AuthUserModel authUser = switch (createNewUser) {
    true => await _authUsers.create(
      session,
      transaction: transaction,
    ),
    false => await _authUsers.get(
      session,
      authUserId: facebookAccount!.authUserId,
      transaction: transaction,
    ),
  };

  if (createNewUser) {
    facebookAccount = await linkFacebookAuthentication(
      session,
      authUserId: authUser.id,
      accountDetails: accountDetails,
      transaction: transaction,
    );
  }

  return (
    facebookAccountId: facebookAccount.id!,
    authUserId: facebookAccount.authUserId,
    details: accountDetails,
    newAccount: createNewUser,
    scopes: authUser.scopes,
  );
}