<?php
namespace App\Domain\Entity\PointOfInterest;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Delete;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Link;
use ApiPlatform\Metadata\Post;
use ApiPlatform\Metadata\Put;
use App\Application\ApiResources\State\Processor\SetMultiplePicturesProcessor;
use App\Application\ApiResources\State\Provider\CertifiedPictureProvider;
use App\Application\ApiResources\State\Provider\PictureProvider;
use App\Application\Controller\Api\Picture\DeleteAction;
use App\Application\Controller\Api\Picture\GetMyPicturesAction;
use App\Application\Controller\Api\Picture\PostMultiplePicturesAction;
use App\Application\Controller\Api\Picture\RotatePictureAction;
use App\Application\Controller\Api\Picture\UpdatePicturesPositionAction;
use App\Application\Dto\Picture\PictureActionInput;
use App\Application\Dto\Picture\PictureOutput;
use App\Application\Dto\Picture\PostMultiplePicturesInput;
use App\Application\Dto\Picture\PostUpdatePositionInput;
use App\Application\Dto\Picture\PutPicturesPositionCollectionInput;
use App\Application\Dto\Picture\PutPicturesPositionInput;
use App\Domain\Entity\Behavior\Identifiable;
use App\Domain\Entity\Media;
use App\Domain\Entity\Person;
use App\Domain\Entity\PointOfInterest;
use DateTime;
use Gedmo\Timestampable\Traits\Timestampable;
/**
* Class RevisionPicture
*
* @package App\Domain\Entity\PointOfInterest
*/
#[ApiResource(
operations: [
new Delete(
controller: DeleteAction::class,
security: "is_granted('ROLE_ADMIN') or object.author.id == user.id",
),
new GetCollection(
filters: ['picture.search_filter']
),
new GetCollection(
uriTemplate: '/pictures/uncertified_list',
security: "is_granted('ROLE_USER')",
filters: ['picture.search_filter'],
output: PictureOutput::class,
provider: PictureProvider::class
),
new GetCollection(
uriTemplate: '/pictures/certified_list',
paginationEnabled: false,
filters: ['picture.search_filter', 'picture.order_filter'],
output: PictureOutput::class,
provider: CertifiedPictureProvider::class,
),
new GetCollection(
uriTemplate: '/pictures/mine',
controller: GetMyPicturesAction::class,
name: 'get_my_pictures'
),
new Get(),
new Post(
uriTemplate: '/pictures/actions',
denormalizationContext: ['groups' => ['picture_action_input_write']],
security: "is_granted('ROLE_ADMIN')",
input: PictureActionInput::class,
name: 'set_multiple_actions',
processor: SetMultiplePicturesProcessor::class
),
new Post(
uriTemplate: '/pictures/multi',
controller: PostMultiplePicturesAction::class,
denormalizationContext: ['groups' => ['post_multiple_picture_input_write']],
input: PostMultiplePicturesInput::class,
),
new Post(),
new Put(
uriTemplate: '/pictures/{uuid}/rotate',
controller: RotatePictureAction::class,
security: "is_granted('ROLE_ADMIN')",
),
new Put(
uriTemplate: '/pictures/update_position',
controller: UpdatePicturesPositionAction::class,
denormalizationContext: ['groups' => ['put_picture_position_input_write']],
security: "is_granted('ROLE_ADMIN')",
input: PutPicturesPositionCollectionInput::class,
)
],
normalizationContext: ['groups' => ['picture_read']],
denormalizationContext: ['groups' => ['picture_write']]
)]
#[ApiResource(
uriTemplate: '/point_of_interests/{uuid}/pictures',
operations: [
new GetCollection(),
],
uriVariables: [
'uuid' => new Link(fromProperty: 'pictures', fromClass: PointOfInterest::class),
]
)]
class Picture
{
use Identifiable;
use Timestampable;
public const ACTION_DELETE = 'delete';
public const PICTURE_AREA = 'area';
public const PICTURE_PROXIMITY = 'proximity';
public const PICTURE_UNCERTIFIED = 'uncertified';
public function __construct(
public Media $media,
public PointOfInterest $pointOfInterest,
public string $type = self::PICTURE_UNCERTIFIED,
public ?DateTime $validatedAt = null,
public ?Person $author = null,
public ?int $position = 0,
) {}
/**
* @return string|null
*/
public function getFormattedValidatedAt(): string | null
{
return $this->validatedAt !== null ? $this->validatedAt->format('d/m/Y') : $this->validatedAt;
}
/**
* @return int|null
*/
public function getPosition(): int | null
{
return $this->position;
}
/**
* @param int|null $position
*/
public function setPosition(int | null $position): void
{
$this->position = $position;
}
}