Skip to content

Commit

Permalink
fix(symfony): no read shouldn't throw InvalidIdentifiers (#6357)
Browse files Browse the repository at this point in the history
fixes 6355
  • Loading branch information
soyuka committed May 7, 2024
1 parent 6fa4bb7 commit 9d159f4
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 1 deletion.
11 changes: 11 additions & 0 deletions features/main/patch.feature
Expand Up @@ -80,3 +80,14 @@ Feature: Sending PATCH requets
"alpha": "/alphas/2"
}
"""

Scenario: Patch a non-readable resource
When I add "Content-Type" header equal to "application/merge-patch+json"
And I send a "PATCH" request to "/order_products/1/count" with body:
"""
{
"id": 1,
"count": 10
}
"""
Then print last JSON response
4 changes: 3 additions & 1 deletion src/Symfony/EventListener/ReadListener.php
Expand Up @@ -84,7 +84,9 @@ public function onKernelRequest(RequestEvent $event): void
try {
$uriVariables = $this->getOperationUriVariables($operation, $request->attributes->all(), $operation->getClass());
} catch (InvalidIdentifierException|InvalidUriVariableException $e) {
throw new NotFoundHttpException('Invalid identifier value or configuration.', $e);
if ($operation->canRead()) {
throw new NotFoundHttpException('Invalid identifier value or configuration.', $e);
}
}
}

Expand Down
26 changes: 26 additions & 0 deletions tests/Fixtures/TestBundle/ApiResource/Issue6355/OrderDto.php
@@ -0,0 +1,26 @@
<?php

/*
* This file is part of the API Platform project.
*
* (c) Kévin Dunglas <dunglas@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue6355;

use ApiPlatform\Metadata\ApiProperty;
use Symfony\Component\Uid\Uuid;

class OrderDto
{
#[ApiProperty(identifier: false)]
public ?int $id = null;

#[ApiProperty(identifier: true)]
public ?Uuid $uuid = null;
}
@@ -0,0 +1,44 @@
<?php

/*
* This file is part of the API Platform project.
*
* (c) Kévin Dunglas <dunglas@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue6355;

use ApiPlatform\Metadata\ApiProperty;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\NotExposed;
use ApiPlatform\Metadata\Patch;
use ApiPlatform\Tests\Fixtures\TestBundle\Controller\Issue6355\UpdateOrderProductCountController;

#[ApiResource(
shortName: 'OrderProduct',
operations: [
new NotExposed(),
new Patch(
uriTemplate: '/order_products/{id}/count',
controller: UpdateOrderProductCountController::class,
class: OrderDto::class,
input: OrderProductCount::class,
output: OrderDto::class,
read: false,
write: false,
name: 'order_product_update_count',
),
],
order: ['position' => 'ASC'],
)]
class OrderProductCount
{
#[ApiProperty(writable: false, identifier: true)]
public ?int $id = null;
public ?int $count = null;
}
@@ -0,0 +1,32 @@
<?php

/*
* This file is part of the API Platform project.
*
* (c) Kévin Dunglas <dunglas@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace ApiPlatform\Tests\Fixtures\TestBundle\Controller\Issue6355;

use ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue6355\OrderDto;
use ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue6355\OrderProductCount;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Attribute\AsController;

#[AsController]
class UpdateOrderProductCountController extends AbstractController
{
public function __invoke(OrderProductCount $data, Request $request): OrderDto
{
$dto = new OrderDto();
$dto->id = 1;

return $dto;
}
}

0 comments on commit 9d159f4

Please sign in to comment.