<?php
/*
* Author: Dominik Piekarski <code@dompie.de>
* Created at: 2021/08/27 11:30
*/
declare(strict_types=1);
namespace App\Subscriber\User;
use App\Entity\MemberMedia;
use App\Event\Media\MemberMediaChangedEvent;
use App\Event\Media\MemberMediaDeletedEvent;
use App\Repository\MemberMediaRepository;
use App\Service\Media\MemberMediaService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MainPhotoActionsSubscriber implements EventSubscriberInterface
{
protected MemberMediaRepository $mmRepository;
protected MemberMediaService $mmService;
public function __construct(MemberMediaRepository $mmRepo, MemberMediaService $mmService)
{
$this->mmRepository = $mmRepo;
$this->mmService = $mmService;
}
public static function getSubscribedEvents(): array
{
return [
MemberMediaChangedEvent::class => [
['onMemberMediaChange', 0],
],
MemberMediaDeletedEvent::class => [
['onMemberMediaDelete', 0],
],
];
}
public function onMemberMediaChange(MemberMediaChangedEvent $e): void
{
if ($e->hasPositionChanged()) {
$this->setMainPhoto($e->getMemberMedia());
}
if ($e->wasApproved()) {
$this->setMainPhoto($e->getMemberMedia());
}
}
private function setMainPhoto(MemberMedia $media): void
{
if (1 === $media->getPosition() && $media->getIsChecked()) {
$media->getMember()->setMainPhoto($media);
$this->mmRepository->storeEntity($media->getMember(), false);
}
}
public function onMemberMediaDelete(MemberMediaDeletedEvent $e): void
{
$media = $e->getMemberMedia();
if (1 !== $media->getPosition()) {
return;
}
$next = $this->mmService->findNextMainPhoto($media->getMember(), $media->getId());
$media->getMember()->setMainPhoto($next);
$this->mmRepository->storeEntity($media->getMember(), false);
}
}