From 1e5401ea255e8312ddfa985f3ff3251b00e24a69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Wed, 14 May 2025 21:51:44 +0200 Subject: [PATCH] feat: parse travel guide per date --- api.http | 5 +++++ src/BusProNet/Model/Guide.php | 5 +++++ src/BusProNet/Model/Travel.php | 3 +++ src/BusProNet/XmlLoader/TravelLoader.php | 24 +++++++++++++++--------- src/Controller/Api/TravelController.php | 4 +++- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/api.http b/api.http index cc851b5..b8c74af 100644 --- a/api.http +++ b/api.http @@ -48,3 +48,8 @@ GET {{base_url}}/api/travels Accept: application/json Authorization: Bearer {{$auth.token("oauth2_api")}} +### API travel +GET {{base_url}}/api/travels/DWWMP301125 +Accept: application/json +Authorization: Bearer {{$auth.token("oauth2_api")}} + diff --git a/src/BusProNet/Model/Guide.php b/src/BusProNet/Model/Guide.php index 8a61c3a..a9e0a31 100644 --- a/src/BusProNet/Model/Guide.php +++ b/src/BusProNet/Model/Guide.php @@ -2,8 +2,13 @@ namespace App\BusProNet\Model; +use Symfony\Component\Serializer\Attribute\Groups; + class Guide { + #[Groups(['api:single'])] public ?string $name = null; + + #[Groups(['api:single'])] public ?string $phone = null; } diff --git a/src/BusProNet/Model/Travel.php b/src/BusProNet/Model/Travel.php index cdc80ba..df1db6e 100644 --- a/src/BusProNet/Model/Travel.php +++ b/src/BusProNet/Model/Travel.php @@ -73,6 +73,9 @@ class Travel #[Groups(['api:single'])] public bool $participantCountMutable = true; + #[Groups(['api:single'])] + public ?Guide $guide = null; + public function getAdditionalServicesByGroup(mixed $group, bool $availableOnly = true): array { $group = (array) $group; diff --git a/src/BusProNet/XmlLoader/TravelLoader.php b/src/BusProNet/XmlLoader/TravelLoader.php index 3f9e6cd..927e132 100644 --- a/src/BusProNet/XmlLoader/TravelLoader.php +++ b/src/BusProNet/XmlLoader/TravelLoader.php @@ -132,7 +132,7 @@ class TravelLoader extends AbstractLoader $travel = new Travel(); $travel->id = (int) $node->attr('idbuspro'); - $travel->hotelId = $hotelId; + $travel->hotelId = (int) $hotelNode->attr('idbuspro'); $travel->label = $this->getStringOrNullValue($node->filterXPath('//text')); $travel->dateFrom = $this->stringToDate($node->attr('termin')); $travel->dateTo = $this->stringToDate($node->attr('bis')); @@ -147,6 +147,7 @@ class TravelLoader extends AbstractLoader $travel->rooms = $this->getRooms($hotelNode); $travel->pickupsTo = $this->getPickups($node->filterXPath('//zustiege/zustieg')); $travel->pickupsFro = $this->getPickups($node->filterXPath('//zustiege_rueck/zustieg_rueck')); + $travel->guide = $this->getGuide($node); return $travel; } @@ -205,17 +206,22 @@ class TravelLoader extends AbstractLoader return $additionalServices; } - public function getGuideForTransportationService(\SimpleXMLElement $xmlTransportationService): ?Guide + public function getGuide(Crawler $travelNode): ?Guide { - if (null === $xmlTransportationService->reiseleiter) { - return null; + $guideNodes = $travelNode + ->filterXPath('//lei_befoerderung/leistung[@unterart="BUS"]/zustiegsplanung/reiseleiter'); + + if (0 < $guideNodes->count()) { + $guideNode = $guideNodes->first(); + + $guide = new Guide(); + $guide->name = $this->getStringOrNullValue($guideNode->filterXPath('//name')); + $guide->phone = $this->getStringOrNullValue($guideNode->filterXPath('//telefon')); + + return $guide; } - $guide = new Guide(); - $guide->name = $xmlTransportationService->reiseleiter->name; - $guide->phone = $xmlTransportationService->reiseleiter->telefon; - - return $guide; + return null; } public function getTransportationServices(Crawler $node): array diff --git a/src/Controller/Api/TravelController.php b/src/Controller/Api/TravelController.php index ba58ce2..7a3ac31 100644 --- a/src/Controller/Api/TravelController.php +++ b/src/Controller/Api/TravelController.php @@ -38,7 +38,8 @@ class TravelController extends AbstractController #[Route( path: '/travels/{travelId}/{hotelId}', name: 'api_travel_single_id', - requirements: ['travelId' => '\d+', 'hotelId' => '\d+'] + requirements: ['travelId' => '\d+', 'hotelId' => '\d+'], + defaults: ['hotelId' => null], )] public function singleById(int $travelId, ?int $hotelId = null): JsonResponse { @@ -50,6 +51,7 @@ class TravelController extends AbstractController #[Route( path: '/travels/{travelCode}/{hotelCode}', name: 'api_travel_single_code', + defaults: ['hotelCode' => null], )] public function singleByCode(string $travelCode, ?string $hotelCode = null): JsonResponse {