SW-3572 API route for listing hotels per city or country * wip hotel data endpoint * Correct route params type * wip * skip static paths call * timeout when getting destinations take too long * call noStore when we get a timeout * add cache-control headers * . * . * . * wip * wip * wip * wip * add route for getting hotels per country * include city when listing by country * fix distance SI unit * fix sorting * Merge branch 'master' of bitbucket.org:scandic-swap/web into feature/SW-3572-hotel-data-endpoint * packages/tracking passWithNoTests * revalidate must be static value * remove oxc reference * cleanup * cleanup hotel api route * feat(SW-3572): cleanup error handling Approved-by: Anton Gunnarsson
53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import { z } from "zod"
|
|
|
|
import { Lang } from "@scandic-hotels/common/constants/language"
|
|
import { getCacheClient } from "@scandic-hotels/common/dataCache"
|
|
|
|
import { serviceProcedure } from "../../../procedures"
|
|
import { getCitiesByCountry } from "../services/getCitiesByCountry"
|
|
import { getCountries } from "../services/getCountries"
|
|
import { getLocationsByCountries } from "../services/getLocationsByCountries"
|
|
|
|
const getLocationsInput = z.object({
|
|
lang: z.nativeEnum(Lang),
|
|
})
|
|
|
|
export const get = serviceProcedure
|
|
.input(getLocationsInput)
|
|
.query(async function ({ ctx, input }) {
|
|
const lang = input.lang ?? ctx.lang
|
|
const cacheClient = await getCacheClient()
|
|
return await cacheClient.cacheOrGet(
|
|
`${lang}:getLocations`,
|
|
async () => {
|
|
const countries = await getCountries({
|
|
lang: lang,
|
|
serviceToken: ctx.serviceToken,
|
|
})
|
|
|
|
if (!countries) {
|
|
throw new Error("Unable to fetch countries")
|
|
}
|
|
const countryNames = countries.data.map((country) => country.name)
|
|
const citiesByCountry = await getCitiesByCountry({
|
|
countries: countryNames,
|
|
serviceToken: ctx.serviceToken,
|
|
lang,
|
|
})
|
|
|
|
const locations = await getLocationsByCountries({
|
|
lang,
|
|
serviceToken: ctx.serviceToken,
|
|
citiesByCountry,
|
|
})
|
|
|
|
if (!locations) {
|
|
throw new Error("Unable to fetch locations")
|
|
}
|
|
|
|
return locations
|
|
},
|
|
"max"
|
|
)
|
|
})
|