Commit 1df12d38 authored by Neil Drumm's avatar Neil Drumm 👋
Browse files

Issue #3300812: Remove multiple email syncing

parent 23e85139
Loading
Loading
Loading
Loading
+0 −81
Original line number Diff line number Diff line
@@ -234,82 +234,6 @@ function _versioncontrol_gitlab_user_info(stdClass $account) {
  return $info;
}

/**
 * Implementation of hook_multiple_email_register().
 */
function versioncontrol_gitlab_multiple_email_register(stdClass $email) {
  $account = user_load($email->uid);
  if (versioncontrol_gitlab_get_user_id($account)) {
    drupal_register_shutdown_function([DrupalQueue::get('gitlab_user'), 'createItem'], [
      'task' => 'emails',
      'data' => $account,
    ]);
  }
}

/**
 * Implementation of hook_multiple_email_confirm().
 */
function versioncontrol_gitlab_multiple_email_confirm(stdClass $email) {
  versioncontrol_gitlab_multiple_email_register($email);
}

/**
 * Implementation of hook_multiple_email_delete().
 */
function versioncontrol_gitlab_multiple_email_delete(stdClass $email) {
  versioncontrol_gitlab_multiple_email_register($email);
}

/**
 * Sync GitLab emails to match Drupal.
 */
function versioncontrol_gitlab_sync_emails(stdClass $account) {
  try {
    $client = versioncontrol_gitlab_get_client();
    $pager = new \Gitlab\ResultPager($client);
    $gitlab_user = versioncontrol_gitlab_get_user($account);
    $gitlab_emails = array_column($pager->fetchall($client->api('users'), 'userEmails', [$gitlab_user['id']]), 'id', 'email');
    unset($gitlab_emails[_versioncontrol_gitlab_user_info($account)['email']]);
    $emails = multiple_email_load_addresses($account->uid);
    // First item is an array of both confirmed & unconfirmed emails, discard it.
    array_shift($emails);

    $drupalorg_commit_mail = new stdClass();
    $drupalorg_commit_mail->confirmed = TRUE;
    $drupalorg_commit_mail->email = $account->git_username . '@' . $account->uid . '.no-reply.drupal.org';
    $emails[] = $drupalorg_commit_mail;

    $drupal_emails = [];
    foreach ($emails as $email) {
      if ($email->confirmed && empty($email->primary_address)) {
        $drupal_emails[drupal_strtolower($email->email)] = TRUE;
        if (!isset($gitlab_emails[drupal_strtolower($email->email)])) {
          try {
            // Needs to be added to GitLab.
            $client->api('users')->createEmailForUser($gitlab_user['id'], $email->email, TRUE);
          }
          catch (Exception $e) {
            watchdog('versioncontrol_gitlab', 'Failed to add email %email for user %user error: %msg', ['%email' => $email->email, '%user' => $account->uid . ' - ' . $account->git_username, '%msg' => $e->getMessage()], WATCHDOG_ERROR);
          }
        }
      }
    }
    // Remove emails that no longer exist in Drupal.
    foreach (array_diff_key($gitlab_emails, $drupal_emails) as $email => $id) {
      try {
        $client->api('users')->removeUserEmail($gitlab_user['id'], $id);
      }
      catch (Exception $e) {
        watchdog('versioncontrol_gitlab', 'Failed to remove email %email for user %user error: %msg', ['%email' => $email, '%user' => $account->uid . ' - ' . $account->git_username, '%msg' => $e->getMessage()], WATCHDOG_ERROR);
      }
    }
  }
  catch (Exception $e) {
    watchdog('versioncontrol_gitlab', 'Failed to update emails for user %user error: %msg', ['%user' => $account->uid . ' - ' . $account->git_username, '%msg' => $e->getMessage()], WATCHDOG_ERROR);
  }
}

/**
 * Implements hook_menu().
 *
@@ -561,7 +485,6 @@ function versioncontrol_gitlab_user_process($data) {
              ->execute();
          }
        }
        versioncontrol_gitlab_sync_emails($data['account']);
        // Allow other modules to perform any additional sync operations.
        module_invoke_all('versioncontrol_gitlab_user_process_sync', $gitlab_user['id']);
      } catch (Exception $e) {
@@ -572,10 +495,6 @@ function versioncontrol_gitlab_user_process($data) {
    case 'delete':
      _versioncontrol_gitlab_user_delete($data['data']);
      break;

    case 'emails':
      versioncontrol_gitlab_sync_emails($data['data']);
      break;
  }
}