src/Aqarmap/Bundle/ListingBundle/EventListener/ListingFeatureListener.php line 76
<?php
namespace Aqarmap\Bundle\ListingBundle\EventListener;
use Aqarmap\Bundle\ListingBundle\Constant\ListingFeatures;
use Aqarmap\Bundle\ListingBundle\Entity\ListingFeature;
use Aqarmap\Bundle\ListingBundle\Event\ListingFeatureEvent;
use Aqarmap\Bundle\ListingBundle\Model\Contracts\BumpUpModelInterface;
use Aqarmap\Bundle\ListingBundle\Service\CallLog\Logger;
use Aqarmap\Bundle\ListingBundle\Service\Contracts\ListingFeatureServiceInterface;
use Aqarmap\Bundle\ListingBundle\Service\ListingManager;
use Aqarmap\Bundle\MainBundle\Constant\ActivityType;
use Aqarmap\Bundle\MainBundle\Service\ActivityLogger;
use Aqarmap\Bundle\MainBundle\Service\Setting;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class ListingFeatureListener implements EventSubscriberInterface
{
private $user;
public function __construct(
private readonly ListingFeatureServiceInterface $listingFeatureService,
private readonly BumpUpModelInterface $bumpUpModel,
private readonly Setting $settings,
private readonly TokenStorageInterface $tokenStorage,
private readonly ListingManager $listingManager,
private readonly ActivityLogger $activityLogger,
private readonly Logger $logger,
) {
$this->user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;
}
public function onFeaturingCreateAutoBumpUp(ListingFeatureEvent $event): void
{
$listingFeature = $event->getListingFeature();
if (\in_array($listingFeature->getType(), ListingFeatures::getBumpUpFeatures())) {
try {
if ($listingFeature->getExpiresAt()) {
$listing = $listingFeature->getListing();
$listing->setBumped(true);
$bumpUpModel = $this->createBumpUpModel($listingFeature);
$this->listingFeatureService->createBumpUp($bumpUpModel);
$this->listingManager->saveListing($listingFeature->getListing(), true);
$this->activityLogger->record(ActivityType::LISTING_BUMP_UP, $listing->getId());
$this->listingFeatureService->logBumpActivity('aqarmap.listing.bump_up_started', $listing, $this->user);
}
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
}
}
/**
* {@inheri tdoc}.
*/
public static function getSubscribedEvents(): array
{
return [
'aqarmap.listing.feature.bumpup' => 'onFeaturingCreateAutoBumpUp',
];
}
private function createBumpUpModel(ListingFeature $listingFeature): BumpUpModelInterface
{
$featuringOccurenceInterval = $this->getFeaturingOccurenceInterval($listingFeature);
$durationInDays = date_diff(new \DateTime(), $listingFeature->getExpiresAt())->format('%a');
$occurrences = $featuringOccurenceInterval > 0 ? round($durationInDays / $featuringOccurenceInterval) : 0;
return $this->bumpUpModel
->setListing($listingFeature->getListing())
->setDuration($durationInDays)
->setOccurrences($occurrences)
->setOwner($this->user)
;
}
private function getFeaturingOccurenceInterval(ListingFeature $listingFeature)
{
return match ($listingFeature->getType()) {
ListingFeatures::SPONSORED => $this->settings->getSetting('general', 'auto_bumpup_sponserd_interval'),
ListingFeatures::SPOTLIGHT => $this->settings->getSetting('general', 'auto_bumpup_spotlight_interval'),
default => $Interval,
};
}
}