diff --git a/apps/scandic-web/lib/graphql/Query/Locations/Locations.graphql b/apps/scandic-web/lib/graphql/Query/Locations/Locations.graphql deleted file mode 100644 index a3335c8b9..000000000 --- a/apps/scandic-web/lib/graphql/Query/Locations/Locations.graphql +++ /dev/null @@ -1,21 +0,0 @@ -query GetLocationsUrls($locale: String!) { - hotels: all_hotel_page(locale: $locale) { - items { - url - id: hotel_page_id - } - } - cities: all_destination_city_page { - items { - url - id: destination_settings { - sv: city_sweden - pl: city_poland - no: city_norway - de: city_germany - fi: city_finland - da: city_denmark - } - } - } -} diff --git a/apps/scandic-web/lib/trpc/memoizedRequests/index.ts b/apps/scandic-web/lib/trpc/memoizedRequests/index.ts index 657a91b35..b80bbf780 100644 --- a/apps/scandic-web/lib/trpc/memoizedRequests/index.ts +++ b/apps/scandic-web/lib/trpc/memoizedRequests/index.ts @@ -301,13 +301,13 @@ export const getJumpToData = cache(async function getMemoizedJumpToData() { if (isCity) { url = urls.cities.find( (c) => - c.id && + c.city && location.cityIdentifier && - c.id === location.cityIdentifier + c.city === location.cityIdentifier )?.url } else if (isHotel) { url = urls.hotels.find( - (h) => h.id && location.id && h.id === location.id + (h) => h.hotelId && location.id && h.hotelId === location.id )?.url } diff --git a/apps/scandic-web/server/routers/contentstack/destinationCityPage/output.ts b/apps/scandic-web/server/routers/contentstack/destinationCityPage/output.ts index 32d84fdfb..0d8b8d301 100644 --- a/apps/scandic-web/server/routers/contentstack/destinationCityPage/output.ts +++ b/apps/scandic-web/server/routers/contentstack/destinationCityPage/output.ts @@ -1,6 +1,7 @@ import { z } from "zod" import { discriminatedUnionArray } from "@/lib/discriminatedUnion" +import { isDefined } from "@/server/utils" import { removeMultipleSlashes } from "@/utils/url" @@ -41,16 +42,16 @@ const destinationCityPageDestinationSettingsSchema = z city_sweden, location, }) => { - const cities = [ - city_denmark, - city_finland, - city_germany, - city_poland, - city_norway, - city_sweden, - ].filter((city): city is string => Boolean(city)) - - return { city: cities[0], location } + return { + city: + city_denmark || + city_finland || + city_germany || + city_poland || + city_norway || + city_sweden, + location, + } } ) @@ -182,20 +183,31 @@ export const cityPageCountSchema = z export const cityPageUrlsSchema = z .object({ all_destination_city_page: z.object({ - items: z.array( - z - .object({ - url: z.string(), - destination_settings: destinationCityPageDestinationSettingsSchema, - system: systemSchema, - }) - .transform((data) => { - return { - city: data.destination_settings.city, - url: removeMultipleSlashes(`/${data.system.locale}/${data.url}`), - } - }) - ), + items: z + .array( + z + .object({ + url: z.string().nullish(), + destination_settings: + destinationCityPageDestinationSettingsSchema, + system: systemSchema, + }) + .transform((data) => { + if (!data.destination_settings.city || !data.url) { + return null + } + + return { + city: data.destination_settings.city, + url: removeMultipleSlashes( + `/${data.system.locale}/${data.url}` + ), + } + }) + ) + .transform((data) => { + return data.filter(isDefined) + }), }), }) .transform(({ all_destination_city_page }) => all_destination_city_page.items) diff --git a/apps/scandic-web/server/routers/contentstack/destinationCityPage/query.ts b/apps/scandic-web/server/routers/contentstack/destinationCityPage/query.ts index 1ffc8197f..4d293a0e3 100644 --- a/apps/scandic-web/server/routers/contentstack/destinationCityPage/query.ts +++ b/apps/scandic-web/server/routers/contentstack/destinationCityPage/query.ts @@ -149,6 +149,10 @@ export const destinationCityPageQueryRouter = router({ } const destinationCityPage = validatedResponse.data.destination_city_page const cityIdentifier = destinationCityPage.destination_settings.city + if (!cityIdentifier) { + return null + } + const city = await getCityByCityIdentifier({ cityIdentifier, lang, diff --git a/apps/scandic-web/server/routers/hotels/query.ts b/apps/scandic-web/server/routers/hotels/query.ts index fcba93175..bd4d3d3b6 100644 --- a/apps/scandic-web/server/routers/hotels/query.ts +++ b/apps/scandic-web/server/routers/hotels/query.ts @@ -3,9 +3,8 @@ import { Lang } from "@/constants/languages" import { env } from "@/env/server" import * as api from "@/lib/api" import { dt } from "@/lib/dt" -import { GetLocationsUrls } from "@/lib/graphql/Query/Locations/Locations.graphql" -import { request } from "@/lib/graphql/request" import { badRequestError, unauthorizedError } from "@/server/errors/trpc" +import { getCityPageUrls } from "@/server/routers/contentstack/destinationCityPage/utils" import { contentStackBaseWithServiceProcedure, publicProcedure, @@ -18,15 +17,10 @@ import { toApiLang } from "@/server/utils" import { generateChildrenString } from "@/components/HotelReservation/utils" import { getCacheClient } from "@/services/dataCache" import { cache } from "@/utils/cache" -import { removeMultipleSlashes } from "@/utils/url" import { getHotelPageUrls } from "../contentstack/hotelPage/utils" import { getVerifiedUser } from "../user/query" import { additionalDataSchema } from "./schemas/hotel/include/additionalData" -import { - type GetLocationsUrlsData, - locationsUrlsSchema, -} from "./schemas/location/urls" import { meetingRoomsSchema } from "./schemas/meetingRoom" import { ancillaryPackageInputSchema, @@ -1532,43 +1526,32 @@ export const hotelQueryRouter = router({ JSON.stringify({ query: { lang } }) ) - const response = await request( - GetLocationsUrls, - { locale: lang }, - { - key: `${lang}:${procedureName}`, - ttl: "max", - } - ) - if (!response.data) { + const [hotelPageUrlsResult, cityPageUrlsResult] = + await Promise.allSettled([ + getHotelPageUrls(lang), + getCityPageUrls(lang), + ]) + + if ( + hotelPageUrlsResult.status === "rejected" || + cityPageUrlsResult.status === "rejected" + ) { locationsUrlsFailCounter.add(1, { lang, - error_type: "no data", - response: JSON.stringify(response), + error_type: "no_data", + response: JSON.stringify({ + hotelPageUrlsResult, + cityPageUrlsResult, + }), }) console.error(`${procedureName}: no data`, { variables: { lang }, - error_type: "no data", - response, - }) - - return null - } - - const locationsUrls = locationsUrlsSchema.safeParse(response.data) - - if (!locationsUrls.success) { - locationsUrlsFailCounter.add(1, { - lang, - error_type: "validation_error", - error: JSON.stringify(locationsUrls.error), - }) - - console.error(`${procedureName}: validation error`, { - variables: { lang }, - error_type: "validation_error", - error: locationsUrls.error, + error_type: "no_data", + response: { + hotelPageUrlsResult, + cityPageUrlsResult, + }, }) return null @@ -1580,16 +1563,10 @@ export const hotelQueryRouter = router({ variables: { lang }, }) - const { data } = locationsUrls - data.hotels = data.hotels.map((hotel) => { - hotel.url = removeMultipleSlashes(`/${lang}/${hotel.url}`) - return hotel - }) - data.cities = data.cities.map((city) => { - city.url = removeMultipleSlashes(`/${lang}/${city.url}`) - return city - }) - return locationsUrls.data + return { + hotels: hotelPageUrlsResult.value, + cities: cityPageUrlsResult.value, + } }), }), map: router({ diff --git a/apps/scandic-web/stores/destination-data/helper.ts b/apps/scandic-web/stores/destination-data/helper.ts index d15e42e6b..a44bcbc5e 100644 --- a/apps/scandic-web/stores/destination-data/helper.ts +++ b/apps/scandic-web/stores/destination-data/helper.ts @@ -69,8 +69,10 @@ export function getFilteredCities( (hotel) => hotel.hotel.cityIdentifier ) - return cities.filter((city) => - filteredCityIdentifiers.includes(city.destination_settings.city) + return cities.filter( + (city) => + city.destination_settings.city && + filteredCityIdentifiers.includes(city.destination_settings.city) ) }