<?php
declare(strict_types=1);
namespace Harmonizely\EventListener;
use Harmonizely\Background\Data\EventMailManagerData;
use Harmonizely\EmailManager\EventEmailManagerInterface;
use Harmonizely\Mailer\AllowedSendingEmailNotificationToInviteePolicy;
use Harmonizely\Model\EventInterface;
use Harmonizely\Model\EventTypeInterface;
use Harmonizely\Service\Core\Contract\ICompanySelector;
use Symfony\Component\EventDispatcher\GenericEvent;
use Webmozart\Assert\Assert;
final class NewEventScheduledListener
{
private AllowedSendingEmailNotificationToInviteePolicy $allowedSendingEmailNotificationToInviteePolicy;
private ICompanySelector $companySelector;
private EventEmailManagerInterface $eventEmailManager;
public function __construct(
AllowedSendingEmailNotificationToInviteePolicy $allowedSendingEmailNotificationToInviteePolicy,
ICompanySelector $companySelector,
EventEmailManagerInterface $eventEmailManager
) {
$this->allowedSendingEmailNotificationToInviteePolicy = $allowedSendingEmailNotificationToInviteePolicy;
$this->companySelector = $companySelector;
$this->eventEmailManager = $eventEmailManager;
}
public function sendEmail(GenericEvent $event): void
{
/** @var EventInterface $event */
$event = $event->getSubject();
Assert::isInstanceOf($event, EventInterface::class);
if (false === ($this->allowedSendingEmailNotificationToInviteePolicy)($event)) {
return;
}
if ($event->isRecurring() && $event->getRelatedEvents()->isEmpty()) {
return;
}
if (EventTypeInterface::TYPE_COLLECTIVE === $event->getEventType()->getType()) {
$users = $event->getEventType()->getUsers();
} else {
$users = [$event->getUser()];
}
foreach ($users as $eventUser) {
if ($eventUser->getEmail() === $event->getInvitee()->getEmail()) {
return;
}
}
$this->eventEmailManager->sendBackgroundNotification(new EventMailManagerData(
$event->getId(),
EventMailManagerData::NEW_EVENT_INVITEE_CONFIRMATION_ACTION,
$this->companySelector->getCompany(),
[
'showScheduledAtList' => true
]
));
}
public function sendNewEventEmailConfirmation(GenericEvent $event): void
{
/** @var EventInterface $event */
$event = $event->getSubject();
Assert::isInstanceOf($event, EventInterface::class);
if ($event->isRecurring() && $event->getRelatedEvents()->isEmpty()) {
return;
}
$this->eventEmailManager->sendBackgroundNotification(new EventMailManagerData(
$event->getId(),
EventMailManagerData::NEW_EVENT_EMAIL_CONFIRMATION,
$this->companySelector->getCompany()
));
}
}