contacts_events-8.x-1.x-dev/modules/teams/src/EventSubscriber/TeamEmailSubscriber.php
modules/teams/src/EventSubscriber/TeamEmailSubscriber.php
<?php namespace Drupal\contacts_events_teams\EventSubscriber; use Drupal\contacts_events_teams\TeamEmailService; use Drupal\contacts_events_teams\TeamQueries; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Logger\LoggerChannelFactoryInterface; use Drupal\Core\Session\AccountProxyInterface; use Drupal\state_machine\Event\WorkflowTransitionEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * Event subscriber for sending Team emails. * * @package Drupal\contacts_events_teams\EventSubscriber */ class TeamEmailSubscriber implements EventSubscriberInterface { /** * The teams email config. * * @var \Drupal\Core\Config\ImmutableConfig */ protected $config; /** * Team email service. * * @var \Drupal\contacts_events_teams\TeamEmailService */ protected $teamEmails; /** * Current user. * * @var \Drupal\user\UserInterface */ protected $currentUser; /** * Team queries. * * @var \Drupal\contacts_events_teams\TeamQueries */ protected $queries; /** * The logger service. * * @var \Drupal\Core\Logger\LoggerChannelInterface */ protected $logger; /** * TeamEmailSubscriber constructor. * * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * Config factory. * @param \Drupal\contacts_events_teams\TeamEmailService $team_emails * Team email sender. * @param \Drupal\Core\Session\AccountProxyInterface $current_user * The current user. * @param \Drupal\contacts_events_teams\TeamQueries $queries * Queries. * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger_factory * The logger factory. */ public function __construct(ConfigFactoryInterface $config_factory, TeamEmailService $team_emails, AccountProxyInterface $current_user, TeamQueries $queries, LoggerChannelFactoryInterface $logger_factory) { $this->config = $config_factory->get('contacts_events_teams.emails'); $this->teamEmails = $team_emails; $this->currentUser = $current_user; $this->queries = $queries; $this->logger = $logger_factory->get('contacts_events_teams'); } /** * {@inheritdoc} */ public static function getSubscribedEvents() { $events['contacts_events_order_items.team_app_in_progress.post_transition'][] = ['sendApplicationRequest']; $events['contacts_events_teams_applications.approve.post_transition'][] = ['sendAcceptance']; $events['contacts_events_teams_applications.submit.post_transition'][] = ['sendSubmitted']; return $events; } /** * Send an request to apply for team. * * @param \Drupal\state_machine\Event\WorkflowTransitionEvent $event * The workflow transition event. */ public function sendApplicationRequest(WorkflowTransitionEvent $event) { /** @var \Drupal\commerce_order\Entity\OrderItemInterface $order_item */ $order_item = $event->getEntity(); /** @var \Drupal\contacts_events\Entity\TicketInterface $ticket */ $ticket = $order_item->getPurchasedEntity(); /** @var \Drupal\contacts_events_teams\Entity\TeamInterface|null */ $team = $ticket->get('team')->entity; if ($this->queries->getTeamApplicationForTicket($ticket)) { // Don't send out the application request if there's already // a team application attached to this ticket. // This can happen in the scenario when a staff member changes which team // a ticketholder is applying for. In that scenario, we explicitly don't // want to send them a new email. return; } $this->teamEmails->sendToApplicant('application_request', $ticket, $team); } /** * Sends acceptance. * * @param \Drupal\state_machine\Event\WorkflowTransitionEvent $event * The workflow transition event. */ public function sendAcceptance(WorkflowTransitionEvent $event) { /** @var \Drupal\contacts_events_teams\Entity\TeamApplication $app */ $app = $event->getEntity(); $team = $app->getTeam(); $ticket = $app->getTicket(); if (!$team) { $this->logger->error('Failed to send acceptance email to application (ID: @application) as it does not have a team.', ['@application' => [$app->id()]]); } else { $this->teamEmails->sendToApplicant('application_accepted', $ticket, $team); } } /** * Sends the submitted email. * * @param \Drupal\state_machine\Event\WorkflowTransitionEvent $event * The workflow transition event. */ public function sendSubmitted(WorkflowTransitionEvent $event) { // Only send the submitted email when the current user is the applicant. /** @var \Drupal\contacts_events_teams\Entity\TeamApplication $app */ $app = $event->getEntity(); $team = $app->getTeam(); $ticket = $app->getTicket(); if ($this->currentUser->id() == $ticket->get('contact')->target_id) { if (!$team) { $this->logger->error('Failed to send application submitted email for application (ID: @application) as it does not have a team.', ['@application' => [$app->id()]]); } else { $this->teamEmails->sendToApplicant('application_submitted', $ticket, $team); } } } }