import { getCacheClient } from "@scandic-hotels/common/dataCache" import { createCounter } from "@scandic-hotels/common/telemetry" import { env } from "../../../../env/server" import * as api from "../../../api" import { getHotelIdsSchema } from "../output" export async function getHotelIdsByCityId({ cityId, serviceToken, }: { cityId: string serviceToken: string }) { const getHotelIdsByCityIdCounter = createCounter( "hotel", "getHotelIdsByCityId" ) const metricsGetHotelIdsByCityId = getHotelIdsByCityIdCounter.init({ cityId, }) metricsGetHotelIdsByCityId.start() const cacheClient = await getCacheClient() const result = await cacheClient.cacheOrGet( `${cityId}:hotelsByCityId`, async () => { const searchParams = new URLSearchParams({ city: cityId, }) const apiResponse = await api.get( api.endpoints.v1.Hotel.hotels, { headers: { Authorization: `Bearer ${serviceToken}`, }, }, searchParams ) if (!apiResponse.ok) { await metricsGetHotelIdsByCityId.httpError(apiResponse) throw new Error("Unable to fetch hotelIds by cityId") } const apiJson = await apiResponse.json() const validatedHotelIds = getHotelIdsSchema.safeParse(apiJson) if (!validatedHotelIds.success) { metricsGetHotelIdsByCityId.validationError(validatedHotelIds.error) throw new Error("Unable to parse data for hotelIds by cityId") } return validatedHotelIds.data }, env.CACHE_TIME_HOTELS ) metricsGetHotelIdsByCityId.success() return result }