You are here

public function ActivitySendEmailWorker::processItem in Open Social 10.3.x

Same name and namespace in other branches
  1. 8.9 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  2. 8 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  3. 8.2 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  4. 8.3 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  5. 8.4 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  6. 8.5 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  7. 8.6 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  8. 8.7 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  9. 8.8 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  10. 10.0.x modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  11. 10.1.x modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
  12. 10.2.x modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()

Works on a single queue item.

Parameters

mixed $data: The data that was passed to \Drupal\Core\Queue\QueueInterface::createItem() when the item was queued.

Throws

\Drupal\Core\Queue\RequeueException Processing is not yet finished. This will allow another process to claim the item immediately.

\Exception A QueueWorker plugin may throw an exception to indicate there was a problem. The cron process will log the exception, and leave the item in the queue to be processed again later.

\Drupal\Core\Queue\SuspendQueueException More specifically, a SuspendQueueException should be thrown when a QueueWorker plugin is aware that the problem will affect all subsequent workers of its queue. For example, a callback that makes HTTP requests may find that the remote server is not responding. The cron process will behave as with a normal Exception, and in addition will not attempt to process further items from the current item's queue during the current cron run.

Overrides QueueWorkerInterface::processItem

See also

\Drupal\Core\Cron::processQueues()

File

modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php, line 127

Class

ActivitySendEmailWorker
An activity send email worker.

Namespace

Drupal\activity_send_email\Plugin\QueueWorker

Code

public function processItem($data) {

  // First make sure it's an actual Activity entity.
  $activity_storage = $this->entityTypeManager
    ->getStorage('activity');
  if (!empty($data['entity_id']) && ($activity = $activity_storage
    ->load($data['entity_id']))) {

    // Check if activity related entity exist.

    /** @var \Drupal\activity_creator\Entity\Activity $activity */
    if (!$activity
      ->getRelatedEntity() instanceof EntityInterface) {
      $activity
        ->delete();
      $this->activityNotifications
        ->deleteNotificationsbyIds([
        $activity
          ->id(),
      ]);
      return;
    }

    // Is the website multilingual.
    $is_multilingual = $this->languageManager
      ->isMultilingual();
    if (empty($data['recipients'])) {
      $recipients = array_column($activity->field_activity_recipient_user
        ->getValue(), 'target_id');
      if (count($recipients) > 50) {
        if ($is_multilingual) {

          // We also want to send emails to users per language in a given
          // frequency.
          foreach ($languages = $this->languageManager
            ->getLanguages() as $language) {
            $langcode = $language
              ->getId();

            // Load all user by given language.
            $user_ids_per_language = $this->database
              ->select('users_field_data', 'ufd')
              ->fields('ufd', [
              'uid',
            ])
              ->condition('uid', $recipients, 'IN')
              ->condition('preferred_langcode', $langcode)
              ->execute()
              ->fetchAllKeyed(0, 0);

            // Prepare the batch per language.
            $this
              ->prepareBatch($data, $user_ids_per_language, $langcode);
          }
        }
        else {
          $this
            ->prepareBatch($data, $recipients);
        }

        // We split up in batches. We can stop processing this specific queue
        // item.
        return;
      }
    }
    else {
      $recipients = $data['recipients'];
    }
    if (!empty($recipients)) {

      // Get Message Template id.
      $message_storage = $this->entityTypeManager
        ->getStorage('message');

      /** @var \Drupal\message\Entity\Message $message */
      $message = $message_storage
        ->load($activity->field_activity_message->target_id);
      $message_template_id = $message
        ->getTemplate()
        ->id();

      // Prepare an array of all details required to process the item.
      $parameters = [
        'activity' => $activity,
        'message' => $message,
        'message_template_id' => $message_template_id,
      ];

      // We want to give preference to users who have set notification
      // settings as 'immediately'.
      $email_frequencies = [
        'immediately',
        'daily',
        'weekly',
        'none',
      ];

      // Let's store the users IDs which will be processed by the loop.
      $processed_users = [];
      foreach ($email_frequencies as $email_frequency) {

        // Get the 'target recipients' of who have their 'email notification
        // preference' matching to current $email_frequency.
        if ($target_recipients = EmailActivityDestination::getSendEmailUsersIdsByFrequency($recipients, $message_template_id, $email_frequency)) {

          // Update process users.
          $processed_users = array_merge($processed_users, $target_recipients);

          // We load all the target accounts.
          $parameters['target_recipients'] = $target_recipients;

          // We set the frequency of email.
          $parameters['frequency'] = $email_frequency;

          // If the batch has langcode.
          if (!empty($data['langcode'])) {
            $parameters['langcode'] = $data['langcode'];
          }

          // Send for further processing.
          $this
            ->sendToFrequencyManager($parameters);
        }
      }

      // There is possibility where the users have not saved their
      // 'email notification preferences'. So, we check the difference
      // between the processed user IDs and original recipients users IDs
      // and send emails according to default 'frequency' set by site
      // manager. If SM has also not set, take 'immediately' as frequency.
      if ($remaining_users = array_diff($recipients, $processed_users)) {

        // Grab the platform default "Email notification frequencies".
        $template_frequencies = $this->swiftmailSettings
          ->get('template_frequencies') ?: [];

        // Determine email frequency to use, defaults to immediately.
        $parameters['frequency'] = $template_frequencies[$message_template_id] ?? FREQUENCY_IMMEDIATELY;
        $parameters['target_recipients'] = $remaining_users;
        $this
          ->sendToFrequencyManager($parameters);
      }
    }
  }
}