import stringify from "json-stable-stringify-without-jsonify" import { getCacheClient } from "@scandic-hotels/common/dataCache" import { createCounter } from "@scandic-hotels/common/telemetry" import * as api from "../../../api" import { generateChildrenString } from "../helpers" import { roomFeaturesSchema } from "../output" import type { RoomFeaturesInput } from "../input" export async function getRoomFeaturesInventory( input: RoomFeaturesInput, token: string ) { const { adults, childrenInRoom, endDate, hotelId, roomFeatureCodes, startDate, } = input const params = { adults, hotelId, roomFeatureCode: roomFeatureCodes, roomStayEndDate: endDate, roomStayStartDate: startDate, ...(childrenInRoom?.length && { children: generateChildrenString(childrenInRoom), }), } const getRoomFeaturesInventoryCounter = createCounter( "hotel.getRoomFeaturesInventory" ) const metricsGetRoomFeaturesInventory = getRoomFeaturesInventoryCounter.init(params) metricsGetRoomFeaturesInventory.start() const cacheClient = await getCacheClient() const result = cacheClient.cacheOrGet( stringify(input), async function () { const apiResponse = await api.get( api.endpoints.v1.Availability.roomFeatures(hotelId), { headers: { Authorization: `Bearer ${token}`, }, }, params ) if (!apiResponse.ok) { await metricsGetRoomFeaturesInventory.httpError(apiResponse) return null } const data = await apiResponse.json() const validatedRoomFeaturesData = roomFeaturesSchema.safeParse(data) if (!validatedRoomFeaturesData.success) { metricsGetRoomFeaturesInventory.validationError( validatedRoomFeaturesData.error ) return null } return validatedRoomFeaturesData.data }, "5m" ) metricsGetRoomFeaturesInventory.success() return result }