From 300c8cafc9cd6afe36190d0e150fd643b073bd1e Mon Sep 17 00:00:00 2001 From: Jan Felix Wiebe Date: Tue, 17 Jun 2025 21:26:05 +0200 Subject: [PATCH] added a /api/food_orders/latest/ endpoint to recieve the latest food order --- src/Entity/FoodOrder.php | 6 +++++ src/Repository/FoodOrderRepository.php | 12 ++++++++++ src/State/LatestOrderProvider.php | 22 +++++++++++++++++ .../Controller/FoodOrderControllerTest.php | 24 +++++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 src/State/LatestOrderProvider.php diff --git a/src/Entity/FoodOrder.php b/src/Entity/FoodOrder.php index bbf7116..0e9d083 100644 --- a/src/Entity/FoodOrder.php +++ b/src/Entity/FoodOrder.php @@ -10,6 +10,7 @@ use ApiPlatform\Metadata\Post; use ApiPlatform\Metadata\Put; use App\Repository\FoodOrderRepository; use App\State\OpenOrdersProvider; +use App\State\LatestOrderProvider; use DateInterval; use DateTimeImmutable; use Doctrine\Common\Collections\ArrayCollection; @@ -27,6 +28,11 @@ use function iterator_to_array; description: 'Get only open orders', provider: OpenOrdersProvider::class, ), + new GetCollection( + uriTemplate: 'food_orders/latest', + description: 'Get the latest created order', + provider: LatestOrderProvider::class, + ), new GetCollection, new Get, new Post, diff --git a/src/Repository/FoodOrderRepository.php b/src/Repository/FoodOrderRepository.php index 09445f9..ab06fe7 100644 --- a/src/Repository/FoodOrderRepository.php +++ b/src/Repository/FoodOrderRepository.php @@ -62,4 +62,16 @@ final class FoodOrderRepository extends ServiceEntityRepository ->getQuery() ->getResult(); } + + /** + * @return FoodOrder|null + */ + public function findLatestOrder(): ?FoodOrder + { + return $this->createQueryBuilder('alias') + ->orderBy('alias.id', 'DESC') + ->setMaxResults(1) + ->getQuery() + ->getOneOrNullResult(); + } } diff --git a/src/State/LatestOrderProvider.php b/src/State/LatestOrderProvider.php new file mode 100644 index 0000000..2caf6f1 --- /dev/null +++ b/src/State/LatestOrderProvider.php @@ -0,0 +1,22 @@ +repository->findLatestOrder(); + } +} \ No newline at end of file diff --git a/tests/Feature/Controller/FoodOrderControllerTest.php b/tests/Feature/Controller/FoodOrderControllerTest.php index 269b1bf..36b541c 100644 --- a/tests/Feature/Controller/FoodOrderControllerTest.php +++ b/tests/Feature/Controller/FoodOrderControllerTest.php @@ -231,6 +231,30 @@ describe(FoodOrderController::class, function (): void { $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,