src/Domain/Entity/WebAd.php line 62

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Domain\Entity;
  4. use ApiPlatform\Metadata\ApiResource;
  5. use ApiPlatform\Metadata\Delete;
  6. use ApiPlatform\Metadata\Get;
  7. use ApiPlatform\Metadata\GetCollection;
  8. use ApiPlatform\Metadata\Post;
  9. use ApiPlatform\Metadata\Put;
  10. use App\Application\ApiResources\State\Provider\WebAdProvider;
  11. use App\Application\Controller\Api\DuplicateAction;
  12. use App\Application\Controller\Api\WebAd\WebAdClickAction;
  13. use App\Domain\Entity\Behavior\Identifiable;
  14. use App\Domain\Entity\Translation\WebAdTranslation;
  15. use DateTime;
  16. use Doctrine\Common\Collections\ArrayCollection;
  17. use Gedmo\SoftDeleteable\Traits\SoftDeleteable;
  18. use Gedmo\Timestampable\Traits\Timestampable;
  19. use Locastic\ApiPlatformTranslationBundle\Model\AbstractTranslatable;
  20. use Locastic\ApiPlatformTranslationBundle\Model\TranslationInterface;
  21. #[ApiResource(
  22.     shortName'web',
  23.     operations: [
  24.         new Delete(security"is_granted('ROLE_ADMIN')"),
  25.         new GetCollection(
  26.             order: ['createdAt' => 'DESC'],
  27.             security"is_granted('ROLE_ADMIN')",
  28.             filters: ['soft_delete_filter'],
  29.         ),
  30.         new Get(
  31.             uriTemplate'/webs/current',
  32.             providerWebAdProvider::class,
  33.         ),
  34.         new Get(
  35.             uriTemplate'/webs/{uuid}/click',
  36.             requirements: [
  37.                 '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}$',
  38.             ],
  39.             controllerWebAdClickAction::class,
  40.         ),
  41.         new Get(
  42.             requirements: [
  43.                 '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}$',
  44.             ],
  45.             security"is_granted('ROLE_ADMIN')",
  46.         ),
  47.         new Post(security"is_granted('ROLE_ADMIN')"),
  48.         new Post(
  49.             uriTemplate'/webs/{uuid}/duplicate',
  50.             controllerDuplicateAction::class,
  51.             security"is_granted('ROLE_ADMIN')",
  52.         ),
  53.         new Put(security"is_granted('ROLE_ADMIN')"),
  54.     ],
  55.     normalizationContext: ['groups' => ['web_ad_read']],
  56.     denormalizationContext: ['groups' => ['web_ad_write']],
  57. )]
  58. class WebAd extends AbstractTranslatable
  59. {
  60.     use Identifiable;
  61.     use SoftDeleteable;
  62.     use Timestampable;
  63.     public static string $TARGET_TYPE_EVERYONE 'target_everyone';
  64.     public static string $TARGET_TYPE_USER     'target_user';
  65.     public static string $TYPE_BANNER 'web_banner';
  66.     public static string $TYPE_MAP    'web_map';
  67.     public static string $TYPE_POPUP  'web_popup';
  68.     public function __construct(
  69.         public string $name,
  70.         public DateTime $startDate,
  71.         public DateTime $endDate,
  72.         public string $status,
  73.         public string $url,
  74.         public string $type,
  75.         public ?string $popupTarget,
  76.         public int $views 0,
  77.         public int $clicks 0,
  78.     ) {
  79.         parent::__construct();
  80.     }
  81.     public function __clone()
  82.     {
  83.         $this->id null;
  84.         $this->uuid null;
  85.         $this->createdAt null;
  86.         $this->updatedAt null;
  87.         $this->views 0;
  88.         $this->clicks 0;
  89.         $translations $this->translations->toArray();
  90.         $this->translations = new ArrayCollection();
  91.         foreach ($translations as $translation) {
  92.             $this->addTranslation(clone $translation);
  93.         }
  94.         return $this;
  95.     }
  96.     public function getImageSize(?string $type): array|null
  97.     {
  98.         return match ($type ?: $this->type) {
  99.             self::$TYPE_BANNER => [1400200],
  100.             self::$TYPE_MAP => [12801143],
  101.             self::$TYPE_POPUP => [796460],
  102.             default => null,
  103.         };
  104.     }
  105.     public function getPhoto(): ?Media
  106.     {
  107.         return $this->getTranslationType()->getPhoto();
  108.     }
  109.     public function setPhoto(?Media $media)
  110.     {
  111.         $this->getTranslationType()->setPhoto($media);
  112.     }
  113.     public function getTranslationType(): WebAdTranslation
  114.     {
  115.         return $this->getTranslation();
  116.     }
  117.     public function createTranslation(): TranslationInterface
  118.     {
  119.         return new WebAdTranslation();
  120.     }
  121. }