<?php
declare(strict_types=1);
namespace App\Component\ExternalIntegration\EventSubscriber;
use App\Component\ExternalIntegration\AbstractExternalIntegration;
use App\Component\ExternalIntegration\DependencyInjection\ExternalIntegrationCollection;
use App\Component\ExternalIntegration\Message\Command\SendApplication;
use App\Enum\DataTypeEnum;
use App\Event\ApplicantEvent;
use App\Util\TypeUtil;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\MessageBusInterface;
class SendApplicationSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly ExternalIntegrationCollection $externalIntegrationCollection,
private readonly MessageBusInterface $messageBus,
) {
}
public static function getSubscribedEvents(): array
{
return [
ApplicantEvent::EVENT_POST_PERSIST => 'onApplicantPostPersist',
];
}
public function onApplicantPostPersist(ApplicantEvent $applicantEvent): void
{
$applicant = $applicantEvent->getApplicant();
$externalReference = $applicant->getExternalVacancyReference() ?? '';
if (TypeUtil::checkTypeAndTruthy($externalReference, DataTypeEnum::STRING)
&& $this->externalIntegrationCollection->hasActiveExternalIntegrations()
) {
$activeExternalIntegrations = $this->externalIntegrationCollection->getActiveExternalIntegrations();
/** @var AbstractExternalIntegration $firstActiveIntegration */
$firstActiveIntegration = reset($activeExternalIntegrations);
$externalReference = $firstActiveIntegration::getReference();
}
// only accept vacancies with valid external reference
if (!TypeUtil::checkTypeAndTruthy($externalReference, DataTypeEnum::STRING)
|| !\is_int($applicant->getId())
) {
return;
}
$this->messageBus->dispatch(new SendApplication($applicant->getId(), $externalReference));
}
}