<?php
namespace App\EventSubscriber;
use App\Event\Achievement\AchievementDiplomaEvent;
use App\Event\Achievement\AchievementExamEvent;
use App\Event\Achievement\AchievementHomeworkEvent;
use App\Event\Achievement\AchievementInternshipEvent;
use App\Event\Achievement\AchievementRatingScoreEvent;
use App\Message\AchievementMessage;
use App\Service\AchievementService;
use App\Service\InternshipService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\MessageBusInterface;
class AchievementSubscriber implements EventSubscriberInterface
{
private MessageBusInterface $messageBus;
private AchievementService $achievementService;
private InternshipService $internshipService;
public function __construct(
MessageBusInterface $messageBus,
AchievementService $achievementService,
InternshipService $internshipService
) {
$this->messageBus = $messageBus;
$this->achievementService = $achievementService;
$this->internshipService = $internshipService;
}
public static function getSubscribedEvents()
{
return [
AchievementHomeworkEvent::class => 'onHomeworkDone',
AchievementDiplomaEvent::class => 'onDiploma',
AchievementExamEvent::class => 'onExam',
AchievementRatingScoreEvent::class => 'onRatingScore',
AchievementInternshipEvent::class => 'onInternshipDone',
];
}
public function onHomeworkDone(AchievementHomeworkEvent $event)
{
$this->messageBus->dispatch(new AchievementMessage($event->getStudent()->getId(), $event->getType()));
}
public function onDiploma(AchievementDiplomaEvent $event)
{
$this->messageBus->dispatch(new AchievementMessage($event->getStudent()->getId(), $event->getType()));
}
public function onExam(AchievementExamEvent $event)
{
$this->messageBus->dispatch(new AchievementMessage($event->getStudent()->getId(), $event->getType()));
}
public function onInternshipDone(AchievementInternshipEvent $event)
{
$internshipDoneCount = $this->internshipService->countUsedByUser($event->getStudent());
$this->achievementService->checkAndGrantInternshipAchievements($event->getStudent(), $internshipDoneCount);
}
public function onRatingScore(AchievementRatingScoreEvent $event)
{
$this->achievementService->checkAndGrantScoreAchievements($event->getStudent(), $event->getScore());
}
}