@qite/tide-client
Version:
Frontend client for Tide
319 lines (276 loc) • 9.86 kB
text/typescript
import { TideClientConfig } from "..";
import {
AvailableCountriesRequest,
AvailableCountry,
AvailableFlight,
AvailableFlightsRequest,
BasePrice,
BookableDates,
BookableDatesRequest,
BookingPackage,
BookingPackageAvailability,
BookingPackageBookRequest,
BookingPackageDetailsRequest,
BookingPackageDossier,
BookingPackageFlightPool,
BookingPackageFlightPoolRequest,
BookingPackageHotelPool,
BookingPackageItem,
BookingPackageRequest,
BookingPackageSearchRequest,
BookingPackageUpdateRequest,
BookingPackageVoucherRequest,
BookingPriceDetails,
BookingTravelAgent,
BookingVoucherResult,
EntryStatus,
PricesRequest,
TideResponse,
TourCodesRequest,
TourCodesResponse,
TransportDatesRequest,
TransportDatesResponse,
} from "../types";
import { get, patch, post } from "./common-client";
const ENDPOINT = "/api/web/booking/v2";
const ENDPOINT_AVAILABLE_FLIGHTS = `${ENDPOINT}/available-flights`;
const ENDPOINT_TRANSPORT_DATES = `${ENDPOINT}/transport-dates`;
const ENDPOINT_PRICES = `${ENDPOINT}/prices`;
const ENDPOINT_AVAILABLE_COUNTRIES = `${ENDPOINT}/available-countries`;
const ENDPOINT_SEARCH = `${ENDPOINT}/search`;
const ENDPOINT_SEARCH_WITH_ERROR_MAPPING = `${ENDPOINT}/search-with-error-mapping`;
// const ENDPOINT_ELASTIC = `${ENDPOINT}/elastic`; // TODO
const ENDPOINT_DETAILS = `${ENDPOINT}/details`;
const ENDPOINT_VALIDATE_VOUCHER = `${ENDPOINT}/validate-voucher`;
const ENDPOINT_ALTERNATE_HOTELS = (transactionId: string, optionId: string) =>
`${ENDPOINT}/details/${transactionId}/alternate-hotels/${optionId}`;
const ENDPOINT_ALTERNATE_FLIGHTS = (transactionId: string) =>
`${ENDPOINT}/details/${transactionId}/alternate-flights`;
const ENDPOINT_BOOKABLE_DATES = `${ENDPOINT}/bookable-dates`;
const ENDPOINT_PRICE_DETAILS = `${ENDPOINT}/price-details`;
const ENDPOINT_BOOK = `${ENDPOINT}/book`;
const ENDPOINT_UPDATE = `${ENDPOINT}/update`;
const ENDPOINT_AGENTS = `${ENDPOINT}/agents`;
const ENDPOINT_AVAILABLE_ALLOTMENTS = (eventId: string, productCode: string) =>
`${ENDPOINT}/get-allotment-availability/${eventId}/${productCode}`;
const ENDPOINT_FLIGHT_POOL = `${ENDPOINT}/flight-pool`;
const ENDPOINT_TOUR_CODES = `${ENDPOINT}/tourcodes`;
const ENDPOINT_CUSTOM_ENTRY_STATUS = (
dossierNumber: string,
customEntryStatusId: number
) => `${ENDPOINT}/custom-entry-status/${dossierNumber}/${customEntryStatusId}`;
const ENDPOINT_ENTRY_STATUS = (dossierNumber: string, entryStatus: number) =>
`${ENDPOINT}/custom-entry-status/${dossierNumber}/${entryStatus}`;
export const availableFlights = (
config: TideClientConfig,
request: AvailableFlightsRequest,
signal?: AbortSignal
): Promise<AvailableFlight[]> => {
const url = `${config.host}${ENDPOINT_AVAILABLE_FLIGHTS}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
export const transportDates = (
config: TideClientConfig,
request: TransportDatesRequest,
signal?: AbortSignal
): Promise<TransportDatesResponse> => {
const url = `${config.host}${ENDPOINT_TRANSPORT_DATES}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
export const prices = (
config: TideClientConfig,
request: PricesRequest,
signal?: AbortSignal
): Promise<BasePrice[]> => {
const url = `${config.host}${ENDPOINT_PRICES}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
export const availableCountries = (
config: TideClientConfig,
request: AvailableCountriesRequest,
signal?: AbortSignal
): Promise<AvailableCountry[]> => {
const url = `${config.host}${ENDPOINT_AVAILABLE_COUNTRIES}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
// PACKAGE SEARCH
export const search = (
config: TideClientConfig,
request: BookingPackageRequest<BookingPackageSearchRequest>,
signal?: AbortSignal
): Promise<BookingPackageItem[]> => {
const url = `${config.host}${ENDPOINT_SEARCH}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
export const searchWithErrorMapping = (
config: TideClientConfig,
request: BookingPackageRequest<BookingPackageSearchRequest>,
signal?: AbortSignal
): Promise<TideResponse<BookingPackageItem[]>> => {
const url = `${config.host}${ENDPOINT_SEARCH_WITH_ERROR_MAPPING}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
export const details = (
config: TideClientConfig,
request: BookingPackageRequest<BookingPackageDetailsRequest>,
signal?: AbortSignal,
languageCode?: string
): Promise<TideResponse<BookingPackage>> => {
const url = `${config.host}${ENDPOINT_DETAILS}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true, languageCode);
};
export const validateVoucher = (
config: TideClientConfig,
request: BookingPackageRequest<BookingPackageVoucherRequest>,
signal?: AbortSignal
): Promise<BookingVoucherResult> => {
const url = `${config.host}${ENDPOINT_VALIDATE_VOUCHER}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
export const alternateHotels = (
config: TideClientConfig,
transactionId: string,
optionId: string,
signal?: AbortSignal
): Promise<BookingPackageHotelPool> => {
const url = `${config.host}${ENDPOINT_ALTERNATE_HOTELS(
transactionId,
optionId
)}`;
const apiKey = config.apiKey;
return get(url, apiKey, config.token, signal, true);
};
export const alternateFlights = (
config: TideClientConfig,
transactionId: string,
signal?: AbortSignal
): Promise<BookingPackageFlightPool> => {
const url = `${config.host}${ENDPOINT_ALTERNATE_FLIGHTS(transactionId)}`;
const apiKey = config.apiKey;
return get(url, apiKey, config.token, signal, true);
};
export const bookableDates = (
config: TideClientConfig,
request: BookableDatesRequest,
signal?: AbortSignal
): Promise<BookableDates> => {
const url = `${config.host}${ENDPOINT_BOOKABLE_DATES}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
export const priceDetails = (
config: TideClientConfig,
request: BookingPackageRequest<BookingPackageBookRequest>,
signal?: AbortSignal,
languageCode?: string
): Promise<BookingPriceDetails> => {
const url = `${config.host}${ENDPOINT_PRICE_DETAILS}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true, languageCode);
};
export const book = (
config: TideClientConfig,
request: BookingPackageRequest<BookingPackageBookRequest>,
signal?: AbortSignal,
languageCode?: string
): Promise<BookingPackageDossier> => {
const url = `${config.host}${ENDPOINT_BOOK}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true, languageCode);
};
export const update = (
config: TideClientConfig,
request: BookingPackageRequest<BookingPackageUpdateRequest>,
signal?: AbortSignal
): Promise<BookingPackageDossier> => {
const url = `${config.host}${ENDPOINT_UPDATE}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
export const agents = (
config: TideClientConfig,
signal?: AbortSignal
): Promise<BookingTravelAgent[]> => {
const url = `${config.host}${ENDPOINT_AGENTS}`;
const apiKey = config.apiKey;
return get(url, apiKey, config.token, signal, true);
};
export const getAllotmentAvailability = (
config: TideClientConfig,
eventId: string,
productCode: string,
signal?: AbortSignal
): Promise<BookingPackageAvailability[]> => {
const url = `${config.host}${ENDPOINT_AVAILABLE_ALLOTMENTS(
eventId,
productCode
)}`;
const apiKey = config.apiKey;
return get(url, apiKey, config.token, signal, true);
};
export const searchFlightPool = (
config: TideClientConfig,
request: BookingPackageRequest<BookingPackageFlightPoolRequest>,
signal?: AbortSignal
): Promise<BookingPackageFlightPool> => {
const url = `${config.host}${ENDPOINT_FLIGHT_POOL}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
export const tourCodes = (
config: TideClientConfig,
request: TourCodesRequest,
signal?: AbortSignal
): Promise<TourCodesResponse> => {
const url = `${config.host}${ENDPOINT_TOUR_CODES}`;
const apiKey = config.apiKey;
const body = JSON.stringify(request);
return post(url, apiKey, body, config.token, signal, true);
};
export const setCustomEntryStatus = (
config: TideClientConfig,
dossierNumber: string,
customEntryStatusId: number,
signal?: AbortSignal
): Promise<BookingPackageAvailability[]> => {
const url = `${config.host}${ENDPOINT_CUSTOM_ENTRY_STATUS(
dossierNumber,
customEntryStatusId
)}`;
const apiKey = config.apiKey;
return get(url, apiKey, config.token, signal, true);
};
export const setEntryStatus = (
config: TideClientConfig,
dossierNumber: string,
entryStatus: EntryStatus,
signal?: AbortSignal
): Promise<BookingPackageAvailability[]> => {
const url = `${config.host}${ENDPOINT_ENTRY_STATUS(
dossierNumber,
entryStatus
)}`;
const apiKey = config.apiKey;
return patch(url, apiKey, null, config.token, signal, true);
};