<?php
namespace App\Subscriber\User;
use App\Dictionary\MemberMediaFolder as FolderDictionary;
use App\Event\User\AmateurUpgradeCompleteEvent;
use App\Service\Content\ActorService;
use App\Service\Media\MemberMediaService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class AmateurUpgradeSubscriber implements EventSubscriberInterface
{
protected EntityManagerInterface $entityManager;
protected ActorService $actorService;
protected MemberMediaService $memberMediaService;
/**
* AmateurUpgradeSubscriber constructor.
*/
public function __construct(EntityManagerInterface $entityManager, MemberMediaService $mediaService, ActorService $actorService)
{
$this->entityManager = $entityManager;
$this->actorService = $actorService;
$this->memberMediaService = $mediaService;
}
public static function getSubscribedEvents(): array
{
return [
AmateurUpgradeCompleteEvent::class => [
['updateMemberAfterSuccessfulUpgrade', 0],
['updateActorAfterSuccessfulUpgrade', 1],
['updateMemberMediaAfterSuccessfulUpgrade', 2],
['removeEntityAfterSuccessfulUpgrade', 99],
],
];
}
public function getEntityManager(): EntityManagerInterface
{
return $this->entityManager;
}
/**
* @throws \Exception
*/
public function updateMemberAfterSuccessfulUpgrade(AmateurUpgradeCompleteEvent $event)
{
if ($event->isRejected()) {
return;
}
$upgrade = $event->getAmateurUpgrade();
$member = $upgrade->getAccount()->getMember();
$member->setAmateurUpgradeDate(new \DateTime());
$member->setIsAmateur(true);
// gitlab #546
if ($personFromUpgrade = $upgrade->getPerson()) {
$member->setPerson($personFromUpgrade);
}
$em = $this->getEntityManager();
$em->persist($member);
$em->flush();
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function updateMemberMediaAfterSuccessfulUpgrade(AmateurUpgradeCompleteEvent $event)
{
if ($event->isRejected()) {
return;
}
$upgrade = $event->getAmateurUpgrade();
$genuinePhoto = $upgrade->getGenuineCheckPhoto();
$idShotPhoto = $upgrade->getIdShotPhoto();
$folder = $this->memberMediaService->loadFolderByMedia($idShotPhoto, FolderDictionary::ACTORS_TEMP);
if ($folder) {
$this->memberMediaService->moveToFolder($folder, FolderDictionary::ACTORS);
}
$genuinePhoto->setIsChecked(true);
$genuinePhoto->setIsHardcore(false);
$genuinePhoto->setIsProof(true);
$this->memberMediaService->storeEntity($genuinePhoto);
$folder = $this->memberMediaService->loadFolderByMedia($genuinePhoto, FolderDictionary::ACTORS_TEMP);
if ($folder) {
$this->memberMediaService->moveToFolder($folder, FolderDictionary::PROFILE);
}
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function updateActorAfterSuccessfulUpgrade(AmateurUpgradeCompleteEvent $event)
{
if ($event->isRejected()) {
return;
}
$upgrade = $event->getAmateurUpgrade();
$member = $upgrade->getAccount()->getMember();
$person = $upgrade->getPerson();
$genuinePhoto = $upgrade->getGenuineCheckPhoto();
$idShotPhoto = $upgrade->getIdShotPhoto();
// gitlab #543 use person from upgrade to automatically create actor from that new person
if (!$upgrade->getPerson() && $member->getPerson()) {
$person = $member->getPerson();
}
if ($idShotPhoto && $genuinePhoto && $person) {
$actor = $this->actorService->createActor($member, $person->getFirstName(), $person->getLastName(), $person->getDateOfBirth());
$actor->setIdShot($idShotPhoto);
$actor->setIsDefault(true);
$this->actorService->storeEntity($actor);
}
}
public function removeEntityAfterSuccessfulUpgrade(AmateurUpgradeCompleteEvent $event)
{
if ($event->isRejected()) {
return;
}
$upgrade = $event->getAmateurUpgrade();
$this->entityManager->remove($upgrade);
$this->entityManager->flush();
}
}