import { getCacheClient } from "@scandic-hotels/common/dataCache" import { createLogger } from "@scandic-hotels/common/logger/createLogger" import * as api from "../../../api" import { toApiLang } from "../../../utils" import { countriesSchema } from "../output" import type { Lang } from "@scandic-hotels/common/constants/language" const logger = createLogger("getCountries") const locationsAffix = "locations" export async function getCountries({ lang, serviceToken, warmup = false, }: { lang: Lang serviceToken: string warmup?: boolean }) { const cacheClient = await getCacheClient() return await cacheClient.cacheOrGet( `${lang}:${locationsAffix}:countries`, async () => { const params = new URLSearchParams({ language: toApiLang(lang), }) const countryResponse = await api.get( api.endpoints.v1.Hotel.countries, { headers: { Authorization: `Bearer ${serviceToken}`, }, }, params ) if (!countryResponse.ok) { logger.error("Unable to fetch countries", { status: countryResponse.status, statusText: countryResponse.statusText, }) throw new Error("Unable to fetch countries", { cause: { status: countryResponse.status, statusText: countryResponse.statusText, }, }) } const countriesJson = await countryResponse.json() const countries = countriesSchema.safeParse(countriesJson) if (!countries.success) { logger.error(`Validation for countries failed`, countries.error) throw new Error("Unable to parse country data", { cause: countries.error, }) } return countries.data }, "1d", { cacheStrategy: warmup ? "fetch-then-cache" : "cache-first", } ) }