. */ declare(strict_types=1); namespace App\ApiPlatform; use ApiPlatform\Metadata\DeleteOperationInterface; use ApiPlatform\Metadata\Operation; use ApiPlatform\State\ProcessorInterface; use App\Entity\Attachments\Attachment; use App\Services\Attachments\AttachmentSubmitHandler; use Symfony\Component\DependencyInjection\Attribute\Autowire; /** * This state processor handles the upload property set on the deserialized attachment entity and * calls the upload handler service to handle the upload. */ final class HandleAttachmentsUploadsProcessor implements ProcessorInterface { public function __construct( #[Autowire(service: 'api_platform.doctrine.orm.state.persist_processor')] private readonly ProcessorInterface $persistProcessor, #[Autowire(service: 'api_platform.doctrine.orm.state.remove_processor')] private readonly ProcessorInterface $removeProcessor, private readonly AttachmentSubmitHandler $attachmentSubmitHandler ) { } public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): mixed { if ($operation instanceof DeleteOperationInterface) { return $this->removeProcessor->process($data, $operation, $uriVariables, $context); } //Check if the attachment has any upload data we need to handle //This have to happen before the persist processor is called, because the changes on the entity must be saved! if ($data instanceof Attachment && $data->getUpload()) { $upload = $data->getUpload(); //Reset the upload data $data->setUpload(null); $this->attachmentSubmitHandler->handleUpload($data, $upload); } return $this->persistProcessor->process($data, $operation, $uriVariables, $context); } }