<?php
namespace App\EventSubscriber;
use App\Entity\Sales\SidebarPlacementType;
use App\Event\Saloon\SaloonCommentWasAdded;
use App\Event\Saloon\SaloonWasPlacedOnAdBoard;
use App\Event\Saloon\SaloonWasProlongedOnAdBoard;
use App\Event\Saloon\SaloonWasRemovedFromAdBoard;
use App\Service\IpAddressService;
use App\Service\PlacementHider;
use App\Service\Sidebar;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class SaloonSubscriber implements EventSubscriberInterface
{
public function __construct(
private Sidebar $sidebar,
private PlacementHider $placementHider,
private IpAddressService $ipAddressService
) {}
public static function getSubscribedEvents(): array
{
return [
SaloonWasPlacedOnAdBoard::NAME => [
['addSidebarPlacement', 0],
['removePlacementHiding', 10],
],
SaloonWasRemovedFromAdBoard::NAME => 'deleteSidebarPlacement',
SaloonWasProlongedOnAdBoard::NAME => 'prolongSidebarPlacement',
SaloonCommentWasAdded::NAME => 'checkIpAddressCommentBanNeeded',
];
}
public function addSidebarPlacement(SaloonWasPlacedOnAdBoard $saloonWasPlacedOnAdBoard): void
{
$placement = $saloonWasPlacedOnAdBoard->getPlacement();
$placementType = $placement->getType();
if($placementType->isVip() || $placementType->isUltraVip()) {
$this->sidebar->doPlaceSaloonOnSidebar(
$saloonWasPlacedOnAdBoard->getSaloon(),
new SidebarPlacementType($placementType->getValue()),
$placement->getPlacementPrice(),
$placement->getPlacedAt(),
$placement->getPlacedUntil()
);
}
}
public function deleteSidebarPlacement(SaloonWasRemovedFromAdBoard $saloonWasRemovedFromAdBoard): void
{
$this->sidebar->deleteSaloonFromSidebar($saloonWasRemovedFromAdBoard->getSaloon());
}
public function prolongSidebarPlacement(SaloonWasProlongedOnAdBoard $saloonWasProlongedOnAdBoard): void
{
$this->sidebar->prolongSaloonPlacement($saloonWasProlongedOnAdBoard->getSaloon(), $saloonWasProlongedOnAdBoard->getUntil());
}
public function removePlacementHiding(SaloonWasPlacedOnAdBoard $saloonWasPlacedOnAdBoard): void
{
$this->placementHider->deleteSaloonHiding($saloonWasPlacedOnAdBoard->getSaloon());
}
public function checkIpAddressCommentBanNeeded(SaloonCommentWasAdded $saloonCommentWasAddedEvent): void
{
$this->ipAddressService->checkDailyCommentBanNeeded();
}
}