<?php
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\Processor\ActivityCreateProcessor;
use App\Application\ApiResources\State\Processor\PostMediaProcessor;
use App\Application\Controller\Api\Activity\ActivityIncrementClickCounterController;
use App\Application\Controller\Api\Activity\ActivityIncrementDetailViewCounterController;
use App\Application\Controller\Api\Activity\ContactAction;
use App\Application\Controller\Api\Activity\DeleteAction;
use App\Application\Controller\Api\Activity\SearchAction;
use App\Application\Controller\Api\Activity\UpdateAction;
use App\Application\Controller\Api\Activity\ValidateAction;
use App\Application\Controller\Api\GoogleTranslateAction;
use App\Application\Dto\Activity\ActivityFormInput;
use App\Application\Dto\Activity\ActivityMediaInput;
use App\Application\Dto\Activity\ActivitySearchOutput;
use App\Application\Service\URLService;
use App\Domain\Entity\Behavior\Identifiable;
use App\Domain\Entity\Enumeration\ActivityType;
use App\Domain\Entity\Translation\ActivityTranslation;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Gedmo\SoftDeleteable\Traits\SoftDeleteable;
use Gedmo\Timestampable\Traits\Timestampable;
use Locastic\ApiPlatformTranslationBundle\Model\AbstractTranslatable;
/**
* Class Activity
*
* @package App\Domain\Entity
*/
#[ApiResource(
operations: [
new GetCollection(
uriTemplate: '/activities/elastic',
controller: SearchAction::class,
output: ActivitySearchOutput::class,
name: 'elastic_activities',
),
new GetCollection(filters: [
'activity.query_filter',
'activity.query_or_filter',
'activity.search_filter',
'activity.boolean_filter',
'activity.order_filter',
'soft_delete_filter',
]),
new Delete(controller: DeleteAction::class, security: "is_granted('ROLE_ADMIN')"),
new Get(name: 'get_activity'),
new Post(
uriTemplate: '/activities/{uuid}/increment_detail_view_counter',
controller: ActivityIncrementDetailViewCounterController::class
),
new Post(
uriTemplate: '/activities/{uuid}/increment_click_counter',
controller: ActivityIncrementClickCounterController::class,
),
new Post(
uriTemplate: '/activities',
inputFormats: ['multipart'],
input: ActivityFormInput::class,
processor: ActivityCreateProcessor::class
),
new Post(
uriTemplate: '/activities/translate',
controller: GoogleTranslateAction::class,
security: "is_granted('ROLE_ADMIN')",
name: 'post_activity_translate'
),
new Post(
uriTemplate: '/activities/{uuid}/contact',
controller: ContactAction::class,
name: 'post_activity_contact'
),
new Post(
uriTemplate: '/activities/{uuid}/medias',
security: "is_granted('ROLE_ADMIN')",
input: ActivityMediaInput::class,
processor: PostMediaProcessor::class,
),
new Put(
uriTemplate: '/activities/{uuid}/validate',
controller: ValidateAction::class,
security: "is_granted('ROLE_ADMIN')",
name: 'put_activity_validate'
),
new Put(controller: UpdateAction::class, security: "is_granted('ROLE_ADMIN') or object.ownerPro.id == user.id"),
],
normalizationContext: ['groups' => ['activity_read']],
denormalizationContext: ['groups' => ['activity_write']]
)]
class Activity extends AbstractTranslatable
{
use Identifiable;
use Timestampable;
use SoftDeleteable;
public const AMOUNT_PRO = 99.0;
public const VAT_AMOUNT_PRO = 118.80;
public const ACTIVITY_PREMIUM = 'activity_premium';
/** @var Collection */
public Collection $medias;
public ?string $remoteId = null;
public ?DateTime $zhistUpdate = null;
public function __construct(
public ?Address $address = null,
public ?ActivityType $type = null,
public ?Locale $authorLocale = null,
public ?Media $logo = null,
public ?Media $mainPicture = null,
public ?Person $author = null,
public ?DateTime $premiumStartDate = null,
public ?DateTime $premiumEndDate = null,
public ?Person $ownerPro = null,
public ?string $telephone = null,
public ?string $website = null,
public ?string $email = null,
public bool $certified = false,
public ?bool $free = null,
) {
parent::__construct();
$this->medias = new ArrayCollection();
$this->website = URLService::formatUrl($this->website);
}
public function setWebsite(?string $url): void
{
$this->website = URLService::formatUrl($url);
}
public function getTitle(?string $locale = null): ?string
{
return $this->getTranslationType($locale)->getTitle();
}
public function setTitle(?string $value): void
{
$this->getTranslationType()->setTitle($value);
}
public function getDescription(): ?string
{
return $this->getTranslationType()->getDescription();
}
public function setDescription(?string $value): void
{
$this->getTranslationType()->setDescription($value);
}
public function isElasticSearchPublishable(): bool
{
return $this->certified && $this->deletedAt === null;
}
public function createTranslation(): ActivityTranslation
{
return new ActivityTranslation();
}
public function getMedias(): array
{
return $this->medias->toArray();
}
public function addMedia(Media $media): void
{
if (!$this->medias->contains($media)) {
$this->medias->add($media);
}
}
public function removeMedia(Media $media): void
{
if ($this->medias->contains($media)) {
$this->medias->removeElement($media);
}
}
public function getTranslationType(?string $locale = null): ActivityTranslation
{
return $this->getTranslation($locale);
}
}