From 15fdfdc42e23b34c4db6b3797fb228561b2e85fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Mon, 8 Dec 2025 17:39:29 +0100 Subject: [PATCH] feat: load cms data early to display image on login page --- .../Booking/Create/IndexController.php | 10 +++++- src/Controller/SecurityController.php | 19 +++++++++-- src/Service/BookingSummaryDataService.php | 33 +++++++++++++------ .../booking/create/authenticate.html.twig | 8 ++++- 4 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/Controller/Booking/Create/IndexController.php b/src/Controller/Booking/Create/IndexController.php index fef1626..21c2f57 100644 --- a/src/Controller/Booking/Create/IndexController.php +++ b/src/Controller/Booking/Create/IndexController.php @@ -11,6 +11,7 @@ use App\Exception\NoRoomsAvailableException; use App\Exception\TravelNotFoundException; use App\Htmx\HxTrait; use App\Service\BookingService; +use App\Service\BookingSummaryDataService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -30,6 +31,7 @@ class IndexController extends AbstractController public function __construct( private readonly BookingService $bookingService, private readonly AgencyLoader $agencyLoader, + private readonly BookingSummaryDataService $summaryDataService, ) { } @@ -63,7 +65,13 @@ class IndexController extends AbstractController $this->bookingService->storeReturnUrl($request, $request->query->get('r')); // Create fresh booking session with the provided parameters - $this->bookingService->startFreshBooking($request, $dateId, $hotelId, $agencyId); + $bookingDto = $this->bookingService->startFreshBooking($request, $dateId, $hotelId, $agencyId); + + // Warm the CMS cache early so data is available on the login page + $this->summaryDataService->getCmsDataForProduct( + $bookingDto->travel->productCode, + $bookingDto->travel->hotel?->code + ); // Redirect to login page (optional authentication before Step 1) return $this->redirectToRoute('app_login'); diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php index ca91152..cf96230 100644 --- a/src/Controller/SecurityController.php +++ b/src/Controller/SecurityController.php @@ -3,6 +3,7 @@ namespace App\Controller; use App\Service\BookingService; +use App\Service\BookingSummaryDataService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -14,8 +15,12 @@ class SecurityController extends AbstractController { #[Route('/', name: 'app_login')] #[IsGranted('PUBLIC_ACCESS')] - public function login(AuthenticationUtils $authenticationUtils, Request $request, BookingService $bookingService): Response - { + public function login( + AuthenticationUtils $authenticationUtils, + Request $request, + BookingService $bookingService, + BookingSummaryDataService $summaryDataService, + ): Response { // Check if this is a booking flow (BookingDto exists in session) $bookingDto = $bookingService->getBookingDto($request, BookingService::BOOKING_CREATE_KEY); $isBookingFlow = null !== $bookingDto; @@ -50,12 +55,22 @@ class SecurityController extends AbstractController // Render booking login template if in booking flow, otherwise standard login $template = true === $isBookingFlow ? 'booking/create/authenticate.html.twig' : 'security/login.html.twig'; + // Fetch CMS data for booking flow (uses cache warmed in IndexController) + $cmsData = null; + if (true === $isBookingFlow) { + $cmsData = $summaryDataService->getCmsDataForProduct( + $bookingDto->travel->productCode, + $bookingDto->travel->hotel?->code + ); + } + return $this->render($template, [ 'last_username' => $lastUsername, 'error' => $error, 'travel_title' => $bookingDto?->travel->label, 'travel_date_from' => $bookingDto?->travel->dateFrom, 'travel_date_to' => $bookingDto?->travel->dateTo, + 'cmsData' => $cmsData, ]); } diff --git a/src/Service/BookingSummaryDataService.php b/src/Service/BookingSummaryDataService.php index 1e2aaa7..635c3c3 100644 --- a/src/Service/BookingSummaryDataService.php +++ b/src/Service/BookingSummaryDataService.php @@ -128,21 +128,15 @@ class BookingSummaryDataService } /** - * Fetches CMS data for the product and hotel in the booking. + * Fetches CMS data for a product and hotel combination. * * Data is cached for 1 hour as it rarely changes. Returns null - * if the API call fails or if product/hotel codes are not available. + * if the API call fails or if product code is not available. + * This method can be called early in the booking flow to warm the cache. */ - private function getCmsData(BookingDto $bookingDto): ?array + public function getCmsDataForProduct(?string $productCode, ?string $hotelCode): ?array { - $productCode = $bookingDto->travel->productCode; - $hotelCode = $bookingDto->travel->hotel?->code; - if (null === $productCode) { - $this->logger->debug('Cannot fetch CMS data: product code is not available', [ - 'travel_id' => $bookingDto->travel->id, - ]); - return null; } @@ -177,4 +171,23 @@ class BookingSummaryDataService return null; } } + + /** + * Fetches CMS data for the product and hotel in the booking. + */ + private function getCmsData(BookingDto $bookingDto): ?array + { + $productCode = $bookingDto->travel->productCode; + $hotelCode = $bookingDto->travel->hotel?->code; + + if (null === $productCode) { + $this->logger->debug('Cannot fetch CMS data: product code is not available', [ + 'travel_id' => $bookingDto->travel->id, + ]); + + return null; + } + + return $this->getCmsDataForProduct($productCode, $hotelCode); + } } diff --git a/templates/booking/create/authenticate.html.twig b/templates/booking/create/authenticate.html.twig index 11e683f..5bb0eb1 100644 --- a/templates/booking/create/authenticate.html.twig +++ b/templates/booking/create/authenticate.html.twig @@ -9,10 +9,16 @@ Neue
Buchung -
+
{{ travel_title }}
{{ travel_date_from | date('d.m.Y') }} - {{ travel_date_to | date('d.m.Y') }} +
+ {% if cmsData.hotel.images is defined %} + {{ cmsData.hotel.images.resized.l[0].alt }} + {% endif %}