import {z} from 'zod' export type InfoHotelInfoRequest = {hid?: number | undefined, id?: string | undefined, language?: string | undefined}; export type CreateApiApiB2bV3HotelInfoArgs = {body: InfoHotelInfoRequest}; export type CreateApiApiB2bV3HotelInfoOptions = {baseUrl: string, BasicAuth?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const hotelContentByIdsAmenityGroup = z.object({amenities: z.array(z.string()).optional(), group_name: z.string().optional(), non_free_amenities: z.array(z.string()).optional()}); export const hotelContentByIdsHotelDescription = z.object({paragraphs: z.array(z.string()).optional(), title: z.string().optional()}); export const hotelContentByIdsElectricity = z.object({frequency: z.array(z.number().int()).optional(), sockets: z.array(z.string()).optional(), voltage: z.array(z.number().int()).optional()}); export const hotelContentByIdsRegisterRoom = z.object({category_type: z.string().optional(), rooms_count: z.number().int().optional()}); export const hotelContentByIdsRegister = z.object({address: z.string().optional(), email: z.string().optional(), kind: z.string().optional(), link: z.string().optional(), name: z.string().optional(), phone: z.string().optional(), record: z.string().optional(), rooms: z.array(hotelContentByIdsRegisterRoom).optional(), state_registration_number: z.string().optional(), status: z.string().optional(), status_end_date: z.string().optional(), taxpayer_number: z.string().optional(), work_time: z.string().optional()}); export const hotelContentByIdsFacts = z.object({electricity: hotelContentByIdsElectricity.optional(), floors_number: z.number().int().optional(), register: hotelContentByIdsRegister.optional(), rooms_number: z.number().int().optional(), year_built: z.number().int().optional(), year_renovated: z.number().int().optional()}); export const hotelContentByIdsImageExt = z.object({category_slug: z.string().optional(), url: z.string().optional()}); export const hotelContentByIdsKeysPickup = z.object({apartment_extra_information: z.string().optional(), apartment_office_address: z.string().optional(), email: z.string().optional(), is_contactless: z.boolean().optional(), phone: z.string().optional(), type: z.string().optional()}); export const hotelContentByIdsAddFee = z.object({currency: z.string().optional(), fee_type: z.string().optional(), price: z.string().optional(), price_unit: z.string().optional()}); export const hotelContentByIdsCheckInCheckOut = z.object({check_in_check_out_type: z.string().optional(), currency: z.string().optional(), inclusion: z.string().optional(), price: z.string().optional()}); export const hotelContentByIdsChildren = z.object({age_end: z.number().int().optional(), age_start: z.number().int().optional(), currency: z.string().optional(), extra_bed: z.string().optional(), price: z.string().optional()}); export const hotelContentByIdsChildrenMeal = z.object({age_end: z.number().int().optional(), age_start: z.number().int().optional(), currency: z.string().optional(), inclusion: z.string().optional(), meal_type: z.string().optional(), price: z.string().optional()}); export const hotelContentByIdsCradle = z.object({amount: z.number().int().optional(), currency: z.string().optional(), inclusion: z.string().optional(), price: z.string().optional(), price_unit: z.string().optional()}); export const hotelContentByIdsDeposit = z.object({availability: z.string().optional(), currency: z.string().optional(), deposit_type: z.string().optional(), payment_type: z.string().optional(), price: z.string().optional(), price_unit: z.string().optional(), pricing_method: z.string().optional()}); export const hotelContentByIdsExtraBed = z.object({amount: z.number().int().optional(), currency: z.string().optional(), inclusion: z.string().optional(), price: z.string().optional(), price_unit: z.string().optional()}); export const hotelContentByIdsInternet = z.object({currency: z.string().optional(), inclusion: z.string().optional(), internet_type: z.string().optional(), price: z.string().optional(), price_unit: z.string().optional(), work_area: z.string().optional()}); export const hotelContentByIdsMeal = z.object({currency: z.string().optional(), inclusion: z.string().optional(), meal_type: z.string().optional(), price: z.string().optional()}); export const hotelContentByIdsNoShow = z.object({availability: z.string().optional(), day_period: z.string().optional(), time: z.string().optional()}); export const hotelContentByIdsParking = z.object({currency: z.string().optional(), inclusion: z.string().optional(), price: z.string().optional(), price_unit: z.string().optional(), territory_type: z.string().optional()}); export const hotelContentByIdsPets = z.object({currency: z.string().optional(), inclusion: z.string().optional(), pets_type: z.string().optional(), price: z.string().optional(), price_unit: z.string().optional()}); export const hotelContentByIdsShuttle = z.object({currency: z.string().optional(), destination_type: z.string().optional(), inclusion: z.string().optional(), price: z.string().optional(), shuttle_type: z.string().optional()}); export const hotelContentByIdsVisa = z.object({visa_support: z.string().optional()}); export const hotelContentByIdsMetapolicyStruct = z.object({add_fee: z.array(hotelContentByIdsAddFee).optional(), check_in_check_out: z.array(hotelContentByIdsCheckInCheckOut).optional(), children: z.array(hotelContentByIdsChildren).optional(), children_meal: z.array(hotelContentByIdsChildrenMeal).optional(), cot: z.array(hotelContentByIdsCradle).optional(), deposit: z.array(hotelContentByIdsDeposit).optional(), extra_bed: z.array(hotelContentByIdsExtraBed).optional(), internet: z.array(hotelContentByIdsInternet).optional(), meal: z.array(hotelContentByIdsMeal).optional(), no_show: hotelContentByIdsNoShow.optional(), parking: z.array(hotelContentByIdsParking).optional(), pets: z.array(hotelContentByIdsPets).optional(), shuttle: z.array(hotelContentByIdsShuttle).optional(), visa: hotelContentByIdsVisa.optional()}); export const hotelContentByIdsRegionContent = z.object({country_code: z.string().optional(), iata: z.string().optional(), id: z.number().int().optional(), name: z.string().optional(), type: z.string().optional()}); export const hotelContentByIdsRoomGroupName = z.object({bathroom: z.string().optional(), bedding_type: z.string().optional(), main_name: z.string().optional()}); export const hotelContentByIdsRgExt = z.object({balcony: z.number().int().optional(), bathroom: z.number().int().optional(), bedding: z.number().int().optional(), bedrooms: z.number().int().optional(), capacity: z.number().int().optional(), class: z.number().int().optional(), club: z.number().int().optional(), family: z.number().int().optional(), floor: z.number().int().optional(), quality: z.number().int().optional(), sex: z.number().int().optional(), view: z.number().int().optional()}); export const hotelContentByIdsRoomGroup = z.object({images: z.array(z.string()).optional(), images_ext: z.array(hotelContentByIdsImageExt).optional(), name: z.string().optional(), name_struct: hotelContentByIdsRoomGroupName.optional(), rg_ext: hotelContentByIdsRgExt.optional(), room_amenities: z.array(z.string()).optional(), room_group_id: z.number().int().optional(), size: z.number().optional()}); export const hotelContentByIdsStarCertificate = z.object({certificate_id: z.string().optional(), valid_to: z.string().optional()}); export const hotelContentByIdsHotelContentWithImages = z.object({address: z.string().optional(), amenity_groups: z.array(hotelContentByIdsAmenityGroup).optional(), check_in_time: z.string().optional(), check_in_time_end: z.string().optional(), check_out_time: z.string().optional(), deleted: z.boolean().optional(), description_struct: z.array(hotelContentByIdsHotelDescription).optional(), distance_center: z.number().optional(), email: z.string().optional(), facts: hotelContentByIdsFacts.optional(), front_desk_time_end: z.string().optional(), front_desk_time_start: z.string().optional(), hid: z.number().int().optional(), hotel_chain: z.string().optional(), id: z.string().optional(), images: z.array(z.string()).optional(), images_ext: z.array(hotelContentByIdsImageExt).optional(), is_closed: z.boolean().optional(), is_gender_specification_required: z.boolean().optional(), keys_pickup: hotelContentByIdsKeysPickup.optional(), kind: z.string().optional(), latitude: z.number().optional(), longitude: z.number().optional(), metapolicy_extra_info: z.string().optional(), metapolicy_struct: hotelContentByIdsMetapolicyStruct.optional(), name: z.string().optional(), payment_methods: z.array(z.string()).optional(), phone: z.string().optional(), policy_struct: z.array(hotelContentByIdsHotelDescription).optional(), postal_code: z.string().optional(), region: hotelContentByIdsRegionContent.optional(), room_groups: z.array(hotelContentByIdsRoomGroup).optional(), serp_filters: z.array(z.string()).optional(), star_certificate: hotelContentByIdsStarCertificate.optional(), star_rating: z.number().int().optional()}); export const v3DebugEndpoint = z.object({endpoint: z.string().optional(), is_active: z.boolean().optional(), is_limited: z.boolean().optional(), remaining: z.number().int().optional(), requests_number: z.number().int().optional(), reset: z.string().optional(), seconds_number: z.number().int().optional()}); export const v3Debug = z.object({api_endpoint: v3DebugEndpoint.optional(), api_key_id: z.number().int().optional(), key_id: z.number().int().optional(), method: z.string().optional(), real_ip: z.string().optional(), request: z.array(z.number().int()).optional(), request_id: z.string().optional(), utcnow: z.string().optional(), validation_error: z.string().optional()}); export const createApiApiB2bV3HotelInfoResponse = z.object({data: hotelContentByIdsHotelContentWithImages.optional(), debug: v3Debug.optional(), error: z.string().optional(), status: z.string().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get hotel info by hid or id * * POST /api/b2b/v3/hotel/info */ export const createApiApiB2bV3HotelInfo = async (args: CreateApiApiB2bV3HotelInfoArgs, options: CreateApiApiB2bV3HotelInfoOptions) => { const {baseUrl, fetch: fetchFn = fetch, BasicAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (BasicAuth !== undefined) headers.set('authorization', `Basic ${btoa(`${BasicAuth.username}:${BasicAuth.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/b2b/v3/hotel/info${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(createApiApiB2bV3HotelInfoResponse, await res.json()) };