merge method

Future<void> merge(
  1. Session session, {
  2. required UuidValue userToKeepId,
  3. required UuidValue userToRemoveId,
  4. Transaction? transaction,
})

Merges the accounts of two AuthUsers.

This method invokes the callbacks defined in the AccountMergeConfig.mergeHooks.

Throws an AuthUserNotFoundException if either user is not found. Throws an ArgumentError if userToKeepId and userToRemoveId are equal.

Implementation

Future<void> merge(
  Session session, {
  required UuidValue userToKeepId,
  required UuidValue userToRemoveId,
  Transaction? transaction,
}) async {
  if (userToKeepId == userToRemoveId) {
    throw ArgumentError.value(
      userToRemoveId,
      'userToRemoveId',
      'The user to remove must be different from the user to keep.',
    );
  }

  return DatabaseUtil.runInTransactionOrSavepoint(session.db, transaction, (
    transaction,
  ) async {
    final users = await Future.wait([
      AuthUser.db.findById(
        session,
        userToKeepId,
        transaction: transaction,
      ),
      AuthUser.db.findById(
        session,
        userToRemoveId,
        transaction: transaction,
      ),
    ]);
    final userToKeepEntity = users[0];
    final userToRemoveEntity = users[1];

    if (userToKeepEntity == null || userToRemoveEntity == null) {
      throw AuthUserNotFoundException();
    }

    for (final AccountMergeHandler hook in _config.mergeHooks) {
      await hook(
        session,
        userToKeepId: userToKeepId,
        userToRemoveId: userToRemoveId,
        transaction: transaction,
      );
    }
  });
}