From 6bb49e8f79c19d8e8b5631f2a78825a821297f3f Mon Sep 17 00:00:00 2001 From: lubiana Date: Wed, 18 Jun 2025 16:56:49 +0200 Subject: [PATCH] fixie --- src/Entity/FoodOrder.php | 14 +++++++++-- src/Entity/FoodVendor.php | 5 ++++ src/Entity/OrderItem.php | 6 +++++ src/Repository/FoodOrderRepository.php | 5 +--- src/State/LatestOrderProvider.php | 4 +-- .../Controller/FoodOrderControllerTest.php | 25 ------------------- 6 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/Entity/FoodOrder.php b/src/Entity/FoodOrder.php index 0e9d083..52c0d85 100644 --- a/src/Entity/FoodOrder.php +++ b/src/Entity/FoodOrder.php @@ -9,14 +9,15 @@ use ApiPlatform\Metadata\GetCollection; use ApiPlatform\Metadata\Post; use ApiPlatform\Metadata\Put; use App\Repository\FoodOrderRepository; -use App\State\OpenOrdersProvider; use App\State\LatestOrderProvider; +use App\State\OpenOrdersProvider; use DateInterval; use DateTimeImmutable; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Types\UlidType; +use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Uid\Ulid; use function iterator_to_array; @@ -28,10 +29,13 @@ use function iterator_to_array; description: 'Get only open orders', provider: OpenOrdersProvider::class, ), - new GetCollection( + new Get( uriTemplate: 'food_orders/latest', description: 'Get the latest created order', provider: LatestOrderProvider::class, + normalizationContext: [ + 'groups' => ['food_order:read', 'food_order:latest'], + ] ), new GetCollection, new Get, @@ -44,26 +48,31 @@ use function iterator_to_array; class FoodOrder { #[ORM\Column(nullable: true)] + #[Groups(['food_order:read'])] private DateTimeImmutable|null $closedAt = null; #[ORM\ManyToOne(inversedBy: 'foodOrders')] #[ORM\JoinColumn(nullable: false)] + #[Groups(['food_order:read', 'food_order:latest'])] private FoodVendor|null $foodVendor = null; /** * @var Collection */ #[ORM\OneToMany(targetEntity: OrderItem::class, mappedBy: 'foodOrder', orphanRemoval: true)] + #[Groups(['food_order:read', 'food_order:latest'])] private Collection $orderItems; #[ORM\Column(length: 255, options: [ 'default' => 'nobody', ])] + #[Groups(['food_order:read'])] private string|null $createdBy = 'nobody'; public function __construct( #[ORM\Id] #[ORM\Column(type: UlidType::NAME, unique: true)] + #[Groups(['food_order:read'])] private Ulid|null $id = new Ulid ) { $this->id ??= new Ulid; @@ -76,6 +85,7 @@ class FoodOrder return $this->id; } + #[Groups(['food_order:read'])] public function getCreatedAt(): DateTimeImmutable { return $this->id->getDateTime(); diff --git a/src/Entity/FoodVendor.php b/src/Entity/FoodVendor.php index 890c674..a0b3708 100644 --- a/src/Entity/FoodVendor.php +++ b/src/Entity/FoodVendor.php @@ -9,6 +9,7 @@ use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator; use Symfony\Bridge\Doctrine\Types\UlidType; +use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Uid\Ulid; #[ORM\Entity(repositoryClass: FoodVendorRepository::class)] @@ -16,11 +17,13 @@ use Symfony\Component\Uid\Ulid; class FoodVendor { #[ORM\Column(length: 50)] + #[Groups(['food_order:latest'])] private string|null $name = null; #[ORM\Column(length: 50, nullable: true, options: [ 'default' => '', ])] + #[Groups(['food_order:latest'])] private string|null $phone = null; /** @@ -36,6 +39,7 @@ class FoodVendor private Collection $menuItems; #[ORM\Column(length: 255, nullable: true)] + #[Groups(['food_order:latest'])] private string|null $menuLink = null; public function __construct( @@ -43,6 +47,7 @@ class FoodVendor #[ORM\GeneratedValue(strategy: 'CUSTOM')] #[ORM\Column(type: UlidType::NAME, unique: true)] #[ORM\CustomIdGenerator(class: UlidGenerator::class)] + #[Groups(['food_order:latest'])] private Ulid|null $id = new Ulid ) { $this->id ??= new Ulid; diff --git a/src/Entity/OrderItem.php b/src/Entity/OrderItem.php index 6569142..a25bb07 100644 --- a/src/Entity/OrderItem.php +++ b/src/Entity/OrderItem.php @@ -7,6 +7,7 @@ use App\Repository\OrderItemRepository; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator; use Symfony\Bridge\Doctrine\Types\UlidType; +use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Uid\Ulid; #[ApiResource] @@ -14,9 +15,11 @@ use Symfony\Component\Uid\Ulid; class OrderItem { #[ORM\Column(length: 255)] + #[Groups(['food_order:latest'])] private string|null $name = null; #[ORM\Column(length: 255, nullable: true)] + #[Groups(['food_order:latest'])] private string|null $extras = null; #[ORM\ManyToOne(inversedBy: 'orderItems')] @@ -25,11 +28,13 @@ class OrderItem #[ORM\ManyToOne] #[ORM\JoinColumn(nullable: false)] + #[Groups(['food_order:latest'])] private MenuItem|null $menuItem = null; #[ORM\Column(length: 255, options: [ 'default' => 'nobody', ])] + #[Groups(['food_order:latest'])] private string|null $createdBy = 'nobody'; public function __construct( @@ -37,6 +42,7 @@ class OrderItem #[ORM\GeneratedValue(strategy: 'CUSTOM')] #[ORM\Column(type: UlidType::NAME, unique: true)] #[ORM\CustomIdGenerator(class: UlidGenerator::class)] + #[Groups(['food_order:latest'])] private Ulid|null $id = new Ulid ) { $this->id ??= new Ulid; diff --git a/src/Repository/FoodOrderRepository.php b/src/Repository/FoodOrderRepository.php index ab06fe7..a48d123 100644 --- a/src/Repository/FoodOrderRepository.php +++ b/src/Repository/FoodOrderRepository.php @@ -63,10 +63,7 @@ final class FoodOrderRepository extends ServiceEntityRepository ->getResult(); } - /** - * @return FoodOrder|null - */ - public function findLatestOrder(): ?FoodOrder + public function findLatestOrder(): FoodOrder|null { return $this->createQueryBuilder('alias') ->orderBy('alias.id', 'DESC') diff --git a/src/State/LatestOrderProvider.php b/src/State/LatestOrderProvider.php index 2caf6f1..15a7fa1 100644 --- a/src/State/LatestOrderProvider.php +++ b/src/State/LatestOrderProvider.php @@ -15,8 +15,8 @@ final readonly class LatestOrderProvider implements ProviderInterface ) {} #[Override] - public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?FoodOrder + public function provide(Operation $operation, array $uriVariables = [], array $context = []): FoodOrder|null { return $this->repository->findLatestOrder(); } -} \ No newline at end of file +} diff --git a/tests/Feature/Controller/FoodOrderControllerTest.php b/tests/Feature/Controller/FoodOrderControllerTest.php index 36b541c..1f46c95 100644 --- a/tests/Feature/Controller/FoodOrderControllerTest.php +++ b/tests/Feature/Controller/FoodOrderControllerTest.php @@ -230,31 +230,6 @@ describe(FoodOrderController::class, function (): void { $openOrder = $this->repository->find($order->getId()); $this->assertTrue($openOrder->isClosed()); }); - - test('api_latest_order', function (): void { - // Create an older order - $olderOrder = new FoodOrder($this->generateOldUlid()); - $olderOrder->setFoodVendor($this->vendor); - $this->manager->persist($olderOrder); - - // Create the latest order - $latestOrder = new FoodOrder; - $latestOrder->setFoodVendor($this->vendor); - $this->manager->persist($latestOrder); - - $this->manager->flush(); - - // Test the API endpoint - $this->client->request('GET', '/api/food_orders/latest'); - $this->assertResponseIsSuccessful(); - $this->assertResponseHeaderSame('Content-Type', 'application/ld+json; charset=utf-8'); - - $response = json_decode($this->client->getResponse()->getContent(), true); - $this->assertIsArray($response); - $this->assertArrayHasKey('@id', $response); - $this->assertStringContainsString($latestOrder->getId()->__toString(), $response['@id']); - }); - }) ->covers( FoodOrderController::class,