feat: load availability data once per booking session

This commit is contained in:
Björn Fromme
2025-12-16 13:30:45 +01:00
parent cce59b8ed6
commit 14fe9bd44f
5 changed files with 11 additions and 12 deletions
@@ -138,9 +138,8 @@ class Step2Controller extends AbstractController
throw $this->createNotFoundException(sprintf('Participant at index %d does not exist', $index)); throw $this->createNotFoundException(sprintf('Participant at index %d does not exist', $index));
} }
// Fetch fresh availabilities when entering participant form // Use cached availability data (populated during booking init)
// This ensures up-to-date data and populates cache for subsequent HTMX refreshes $this->travelDataService->enrichWithFreshAvailabilities($bookingDto->travel);
$this->travelDataService->enrichWithFreshAvailabilities($bookingDto->travel, cached: false);
// Create form with booking_context option // Create form with booking_context option
$form = $this->createParticipantForm($bookingDto, $index); $form = $this->createParticipantForm($bookingDto, $index);
@@ -168,9 +168,8 @@ class IndexController extends AbstractController
return $this->redirectToRoute('app_booking_edit', ['id' => $id]); return $this->redirectToRoute('app_booking_edit', ['id' => $id]);
} }
// Fetch fresh availabilities when entering participant form // Use cached availability data (populated during booking init)
// This ensures up-to-date data and populates cache for subsequent HTMX refreshes $this->travelDataService->enrichWithFreshAvailabilities($bookingDto->travel);
$this->travelDataService->enrichWithFreshAvailabilities($bookingDto->travel, cached: false);
// Create wrapper DTO for email uniqueness validation // Create wrapper DTO for email uniqueness validation
$wrapper = new ParticipantEditDto( $wrapper = new ParticipantEditDto(
+2 -1
View File
@@ -75,7 +75,8 @@ class BookingEditDataLoaderService
} }
$mutableData = $this->travelDataService->getMutabilityData($bookingData->dateId); $mutableData = $this->travelDataService->getMutabilityData($bookingData->dateId);
$availabilities = $this->travelDataService->getAvailabilityData($bookingData->dateId); // Using cached: true populates the cache for subsequent participant form loads
$availabilities = $this->travelDataService->getAvailabilityData($bookingData->dateId, cached: true);
if (null === $mutableData || null === $availabilities) { if (null === $mutableData || null === $availabilities) {
return null; return null;
+2 -1
View File
@@ -236,7 +236,8 @@ class BookingService
} }
// Fetch and patch availability data (includes allowedBookingStatus from API) // Fetch and patch availability data (includes allowedBookingStatus from API)
$availabilities = $this->travelDataService->getAvailabilityData($dateId); // Using cached: true populates the cache for subsequent participant form loads
$availabilities = $this->travelDataService->getAvailabilityData($dateId, cached: true);
if (null !== $availabilities) { if (null !== $availabilities) {
$this->travelDataService->patchAvailabilities($travelData, $availabilities); $this->travelDataService->patchAvailabilities($travelData, $availabilities);
} }
+3 -4
View File
@@ -523,19 +523,18 @@ class TravelDataService
* Gets availability data for a travel date. * Gets availability data for a travel date.
* *
* @param int $dateId The travel date ID for API call * @param int $dateId The travel date ID for API call
* @param bool $cached Whether to use cached data (default: false, TTL when cached: 300 seconds) * @param bool $cached Whether to use cached data (default: false, TTL when cached: 600 seconds)
* @param int $ttl Cache TTL in seconds when $cached is true (default: 300 seconds) * @param int $ttl Cache TTL in seconds when $cached is true (default: 600 seconds)
* *
* @return ServiceAvailabilityResponse|null The availability data or null if not available or error occurred * @return ServiceAvailabilityResponse|null The availability data or null if not available or error occurred
*/ */
public function getAvailabilityData(int $dateId, bool $cached = false, int $ttl = 300): ?ServiceAvailabilityResponse public function getAvailabilityData(int $dateId, bool $cached = false, int $ttl = 600): ?ServiceAvailabilityResponse
{ {
if ($cached) { if ($cached) {
$cacheKey = sprintf('availability_%d', $dateId); $cacheKey = sprintf('availability_%d', $dateId);
try { try {
return $this->cache->get($cacheKey, function (ItemInterface $item) use ($dateId, $ttl) { return $this->cache->get($cacheKey, function (ItemInterface $item) use ($dateId, $ttl) {
// Short TTL - availability is volatile and changes with bookings
$item->expiresAfter($ttl); $item->expiresAfter($ttl);
return $this->fetchAvailabilityData($dateId); return $this->fetchAvailabilityData($dateId);