<?php
declare(strict_types=1);
namespace App\Domain\Entity;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Delete;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Post;
use ApiPlatform\Metadata\Put;
use App\Application\ApiResources\State\Provider\WebAdProvider;
use App\Application\Controller\Api\DuplicateAction;
use App\Application\Controller\Api\WebAd\WebAdClickAction;
use App\Domain\Entity\Behavior\Identifiable;
use App\Domain\Entity\Translation\WebAdTranslation;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Gedmo\SoftDeleteable\Traits\SoftDeleteable;
use Gedmo\Timestampable\Traits\Timestampable;
use Locastic\ApiPlatformTranslationBundle\Model\AbstractTranslatable;
use Locastic\ApiPlatformTranslationBundle\Model\TranslationInterface;
#[ApiResource(
shortName: 'web',
operations: [
new Delete(security: "is_granted('ROLE_ADMIN')"),
new GetCollection(
order: ['createdAt' => 'DESC'],
security: "is_granted('ROLE_ADMIN')",
filters: ['soft_delete_filter'],
),
new Get(
uriTemplate: '/webs/current',
provider: WebAdProvider::class,
),
new Get(
uriTemplate: '/webs/{uuid}/click',
requirements: [
'uuid' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$',
],
controller: WebAdClickAction::class,
),
new Get(
requirements: [
'uuid' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$',
],
security: "is_granted('ROLE_ADMIN')",
),
new Post(security: "is_granted('ROLE_ADMIN')"),
new Post(
uriTemplate: '/webs/{uuid}/duplicate',
controller: DuplicateAction::class,
security: "is_granted('ROLE_ADMIN')",
),
new Put(security: "is_granted('ROLE_ADMIN')"),
],
normalizationContext: ['groups' => ['web_ad_read']],
denormalizationContext: ['groups' => ['web_ad_write']],
)]
class WebAd extends AbstractTranslatable
{
use Identifiable;
use SoftDeleteable;
use Timestampable;
public static string $TARGET_TYPE_EVERYONE = 'target_everyone';
public static string $TARGET_TYPE_USER = 'target_user';
public static string $TYPE_BANNER = 'web_banner';
public static string $TYPE_MAP = 'web_map';
public static string $TYPE_POPUP = 'web_popup';
public function __construct(
public string $name,
public DateTime $startDate,
public DateTime $endDate,
public string $status,
public string $url,
public string $type,
public ?string $popupTarget,
public int $views = 0,
public int $clicks = 0,
) {
parent::__construct();
}
public function __clone()
{
$this->id = null;
$this->uuid = null;
$this->createdAt = null;
$this->updatedAt = null;
$this->views = 0;
$this->clicks = 0;
$translations = $this->translations->toArray();
$this->translations = new ArrayCollection();
foreach ($translations as $translation) {
$this->addTranslation(clone $translation);
}
return $this;
}
public function getImageSize(?string $type): array|null
{
return match ($type ?: $this->type) {
self::$TYPE_BANNER => [1400, 200],
self::$TYPE_MAP => [1280, 1143],
self::$TYPE_POPUP => [796, 460],
default => null,
};
}
public function getPhoto(): ?Media
{
return $this->getTranslationType()->getPhoto();
}
public function setPhoto(?Media $media)
{
$this->getTranslationType()->setPhoto($media);
}
public function getTranslationType(): WebAdTranslation
{
return $this->getTranslation();
}
public function createTranslation(): TranslationInterface
{
return new WebAdTranslation();
}
}