import {z} from 'zod' export type GetApiV2UsersUserIdTravelPreferencesOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const airlinePref = z.object({airlines: z.array(z.string()).optional(), flightType: z.enum(["UNKNOWN_FLIGHT_TYPE", "DOMESTIC", "INTERNATIONAL", "ALL"]).optional()}); export const alliance = z.enum(["UNKNOWN_ALLIANCE", "STAR_ALLIANCE", "ONEWORLD", "SKYTEAM", "VANILLA_ALLIANCE", "U_FLY_ALLIANCE", "VALUE_ALLIANCE"]); export const alliancePref = z.object({alliances: z.array(alliance)}); export const farePref = z.object({fareTypes: z.array(z.enum(["UNKNOWN_TYPE", "CHANGEABLE", "REFUNDABLE"]))}); export const mealType = z.enum(["UNKNOWN_MEAL", "AVML", "BBML", "BLML", "CHML", "DBML", "FPML", "GFML", "HFML", "HNML", "KSML", "LCML", "LFML", "LPML", "LSML", "MOML", "NLML", "NSML", "ORML", "PFML", "RVML", "SFML", "SPML", "VGML", "VJML", "VLML", "VOML"]); export const mealPref = z.object({exclMealPrefs: z.array(mealType).optional(), inclMealPrefs: z.array(mealType).optional(), specialMealDescription: z.string().optional()}); export const numStopsPref = z.object({numOfStops: z.number().int()}); export const seatAmenityPref = z.object({seatAmenityTypes: z.array(z.enum(["UNKNOWN_AIR_SEAT_AMENITY_TYPE", "FLAT_BED", "WIFI", "IN_SEAT_POWER"]))}); export const seatLocationPref = z.object({cabins: z.array(z.enum(["UNKNOWN_CABIN", "ECONOMY", "PREMIUM_ECONOMY", "BUSINESS", "FIRST"])).optional(), isBulkHeadPref: z.boolean().optional(), maxFlightDurationInHours: z.number().int().optional(), position: z.enum(["UNKNOWN_POSITION", "AISLE", "WINDOW", "AISLE_OR_WINDOW"]).optional()}); export const preferredLocationLabel = z.enum(["HOME", "WORK", "OTHER"]); export const preferredAirport = z.object({airportName: z.string().optional(), airportCode: z.string(), label: preferredLocationLabel}); export const airPref = z.object({airlinePrefs: z.array(airlinePref).optional(), alliancePref: alliancePref.optional(), farePref: farePref.optional(), homeAirport: z.string().optional(), mealPref: mealPref.optional(), numStopPref: numStopsPref.optional(), seatAmenityPref: seatAmenityPref.optional(), seatLocationPrefs: z.array(seatLocationPref).optional(), preferredAirports: z.array(preferredAirport).optional()}); export const dateModel = z.object({iso8601: z.string()}); export const railCard = z.object({cardNumber: z.string().optional(), expiryDate: dateModel.optional(), name: z.string(), spotnanaCode: z.string(), vendor: z.string()}); export const preferredRailStation = z.object({stationName: z.string().optional(), stationCode: z.string(), cityName: z.string().optional(), countryCode: z.string().optional(), label: preferredLocationLabel}); export const seatPrefType = z.enum(["SLEEPER_BED", "NORMAL", "TABLE_SEAT"]); export const seatPrefLocation = z.enum(["AISLE", "WINDOW", "SOLO"]); export const deckLevel = z.enum(["UPPER_DECK", "LOWER_DECK"]); export const seatPrefDirection = z.enum(["FORWARD", "BACKWARD"]); export const seatPref = z.object({hasAccessibility: z.boolean().optional(), seatTypes: z.array(seatPrefType).optional(), seatLocations: z.array(seatPrefLocation).optional(), deckLevels: z.array(deckLevel).optional(), seatDirections: z.array(seatPrefDirection).optional()}); export const railTravelClass = z.enum(["FIRST", "STANDARD", "BUSINESS", "SLEEPER", "STANDARD_PREMIUM", "BUSINESS_PREMIUM", "COACH", "ROOM", "EXECUTIVE"]); export const coachPref = z.enum(["SMOKING", "NON_SMOKING", "PETS_ALLOWED", "RESTAURANT", "QUIET"]); export const conditionalRate = z.enum(["MILITARY", "AAA", "GOVERNMENT"]); export const railPref = z.object({preferredRailStations: z.array(preferredRailStation).optional(), seatPreference: seatPref.optional(), travelClasses: z.array(railTravelClass).optional(), coachPreferences: z.array(coachPref).optional(), conditionalRates: z.array(conditionalRate).optional()}); export const carVendor = z.object({code: z.string(), name: z.string(), isPresentInPreferredVendors: z.boolean().optional()}); export const carType = z.enum(["OTHER", "MINI", "ECONOMY", "COMPACT", "MID_SIZE", "STANDARD", "FULL_SIZE", "PREMIUM", "LUXURY", "CONVERTIBLE", "MINIVAN", "SUV", "VAN", "PICKUP", "SPORTS", "SPECIAL", "RECREATIONAL_VEHICLE", "WAGON"]); export const engineType = z.enum(["UNKNOWN_ENGINE", "PETROL", "DIESEL", "ELECTRIC", "CNG", "HYBRID", "HYDROGEN", "MULTI_FUEL", "ETHANOL"]); export const transmissionSearchFilter = z.enum(["MANUAL", "AUTOMATIC"]); export const carPref = z.object({vendors: z.array(carVendor).optional(), carTypes: z.array(carType).optional(), engineTypes: z.array(engineType).optional(), transmissionTypes: z.array(transmissionSearchFilter).optional(), conditionalRates: z.array(conditionalRate).optional()}); export const hotelChain = z.object({chainCode: z.string().optional(), chainName: z.string().optional()}); export const hotelBrand = z.object({brandCode: z.string().optional(), brandName: z.string().optional()}); export const hotelPrefAmenity = z.enum(["PARKING", "FREE_PARKING", "FREE_BREAKFAST", "POOL", "WIFI", "FITNESS_CENTER", "FAMILY_FRIENDLY", "RECEPTION", "SPA", "RESTAURANT", "BAR", "TRANSPORTATION", "PET_FRIENDLY", "BUSINESS_CENTER", "AIR_CONDITIONING", "BEACH_ACCESS", "LAUNDRY_SERVICES", "ROOM_SERVICE", "ACCESSIBLE"]); export const roomPreference = z.object({isMobilityAccessible: z.boolean().optional(), bedCount: z.enum(["ONE_BED", "TWO_BEDS"]).optional(), roomType: z.enum(["SMOKING", "NON_SMOKING"]).optional(), mostImportantFact: z.enum(["ROOM_TYPE", "BED_COUNT", "ROOM_LOCATION"]).optional(), roomLocation: z.enum(["HIGH_FLOOR", "LOW_FLOOR", "NEAR_ELEVATOR"]).optional(), pillowType: z.enum(["FOAM", "EXTRA_FOAM", "EXTRA_FEATHER"]).optional(), roomAmenityPrefs: z.array(z.enum(["FEATHER_FREE_ROOM", "EXTRA_TOWELS", "REFRIGERATOR"])).optional()}); export const hotelPref = z.object({hotelParentChains: z.array(hotelChain).optional(), hotelBrands: z.array(hotelBrand).optional(), hotelAmenityTypes: z.array(hotelPrefAmenity).optional(), roomPreference: roomPreference.optional(), conditionalRates: z.array(conditionalRate).optional()}); export const travelPref = z.object({airPref: airPref.optional(), preferredCurrency: z.string().optional(), railCards: z.array(railCard).optional(), railPref: railPref.optional(), carPref: carPref.optional(), hotelPref: hotelPref.optional()}); export const travelPreferences = z.object({preferences: travelPref.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 user travel preferences * * GET /v2/users/{userId}/travel-preferences */ export const getApiV2UsersUserIdTravelPreferences = async (options?: GetApiV2UsersUserIdTravelPreferencesOptions) => { const {baseUrl = "https://api-ext-sboxmeta.partners.spotnana.com", fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (Bearer !== undefined) headers.set('authorization', `Bearer ${Bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/v2/users/${encodeURIComponent(String(args.userId))}/travel-preferences${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(travelPreferences, await res.json()) };