Merged in feat/skeletons-and-cache (pull request #1273)

feat: skeleton key bullet proof. 10 min cache on city search response

* feat: skeleton key bullet proof. 10 min cache on city search response

* Refactor server.ts


Approved-by: Michael Zetterberg
This commit is contained in:
Linus Flood
2025-02-07 07:02:53 +00:00
parent 1d822dad5a
commit c0f5c0278b
5 changed files with 24 additions and 26 deletions

View File

@@ -16,16 +16,11 @@ export default async function SelectHotelMapPage({
}: PageArgs<LangParams, SelectHotelSearchParams>) { }: PageArgs<LangParams, SelectHotelSearchParams>) {
setLang(params.lang) setLang(params.lang)
const roomKey = Object.keys(searchParams)
.filter((key) => key.startsWith("room["))
.map((key) => searchParams[key])
.join("-")
return ( return (
<div className={styles.main}> <div className={styles.main}>
<MapContainer> <MapContainer>
<Suspense <Suspense
key={`${searchParams.city}-${searchParams.fromDate}-${searchParams.toDate}-${roomKey}`} key={JSON.stringify(searchParams)}
fallback={<SelectHotelMapContainerSkeleton />} fallback={<SelectHotelMapContainerSkeleton />}
> >
<SelectHotelMapContainer searchParams={searchParams} /> <SelectHotelMapContainer searchParams={searchParams} />

View File

@@ -13,14 +13,9 @@ export default async function SelectHotelPage({
}: PageArgs<LangParams, SelectHotelSearchParams>) { }: PageArgs<LangParams, SelectHotelSearchParams>) {
setLang(params.lang) setLang(params.lang)
const roomKey = Object.keys(searchParams)
.filter((key) => key.startsWith("room["))
.map((key) => searchParams[key])
.join("-")
return ( return (
<Suspense <Suspense
key={`${searchParams.city}-${searchParams.fromDate}-${searchParams.toDate}-${roomKey}`} key={JSON.stringify(searchParams)}
fallback={<SelectHotelSkeleton />} fallback={<SelectHotelSkeleton />}
> >
<SelectHotel params={params} searchParams={searchParams} /> <SelectHotel params={params} searchParams={searchParams} />

View File

@@ -79,11 +79,6 @@ export default async function SelectRatePage({
const hotelId = +hotel.id const hotelId = +hotel.id
const roomKey = Object.keys(searchParams)
.filter((key) => key.startsWith("room["))
.map((key) => searchParams[key])
.join("-")
return ( return (
<> <>
<HotelInfoCard <HotelInfoCard
@@ -96,7 +91,7 @@ export default async function SelectRatePage({
/> />
<Suspense <Suspense
key={`${searchParams.city}-${searchParams.fromDate}-${searchParams.toDate}-${roomKey}-${hotelId}`} key={JSON.stringify(searchParams)}
fallback={<RoomsContainerSkeleton />} fallback={<RoomsContainerSkeleton />}
> >
<RoomsContainer <RoomsContainer

21
env/server.ts vendored
View File

@@ -171,16 +171,20 @@ export const env = createEnv({
CACHE_TIME_HOTELDATA: z CACHE_TIME_HOTELDATA: z
.number() .number()
.transform(() => .default(30 * 60)
process.env.CMS_ENVIRONMENT === "test" ? 5 * 60 : 30 * 60 .transform((val) =>
) process.env.CMS_ENVIRONMENT === "test" ? 5 * 60 : val
.default(30 * 60), ),
CACHE_TIME_HOTELS: z CACHE_TIME_HOTELS: z
.number() .number()
.transform(() => .default(TWENTYFOUR_HOURS)
process.env.CMS_ENVIRONMENT === "test" ? 5 * 60 : TWENTYFOUR_HOURS .transform((val) =>
) process.env.CMS_ENVIRONMENT === "test" ? 5 * 60 : val
.default(TWENTYFOUR_HOURS), ),
CACHE_TIME_CITY_SEARCH: z
.number()
.default(10 * 60)
.transform((val) => (process.env.CMS_ENVIRONMENT === "test" ? 60 : val)),
}, },
emptyStringAsUndefined: true, emptyStringAsUndefined: true,
runtimeEnv: { runtimeEnv: {
@@ -268,6 +272,7 @@ export const env = createEnv({
CACHE_TIME_HOTELDATA: process.env.CACHE_TIME_HOTELDATA, CACHE_TIME_HOTELDATA: process.env.CACHE_TIME_HOTELDATA,
CACHE_TIME_HOTELS: process.env.CACHE_TIME_HOTELS, CACHE_TIME_HOTELS: process.env.CACHE_TIME_HOTELS,
CACHE_TIME_CITY_SEARCH: process.env.CACHE_TIME_CITY_SEARCH,
}, },
}) })

View File

@@ -238,9 +238,13 @@ export const hotelQueryRouter = router({
const apiResponse = await api.get( const apiResponse = await api.get(
api.endpoints.v1.Availability.city(cityId), api.endpoints.v1.Availability.city(cityId),
{ {
cache: undefined,
headers: { headers: {
Authorization: `Bearer ${ctx.serviceToken}`, Authorization: `Bearer ${ctx.serviceToken}`,
}, },
next: {
revalidate: env.CACHE_TIME_CITY_SEARCH,
},
}, },
params params
) )
@@ -354,9 +358,13 @@ export const hotelQueryRouter = router({
const apiResponse = await api.get( const apiResponse = await api.get(
api.endpoints.v1.Availability.hotels(), api.endpoints.v1.Availability.hotels(),
{ {
cache: undefined,
headers: { headers: {
Authorization: `Bearer ${ctx.serviceToken}`, Authorization: `Bearer ${ctx.serviceToken}`,
}, },
next: {
revalidate: env.CACHE_TIME_CITY_SEARCH,
},
}, },
params params
) )