UNPKG

sabre-client

Version:
370 lines (361 loc) 13.2 kB
// src/air/search.ts var Search = class { /** * Bargain Finder Max v5 * * Bargain Finder Max (BFM), * nuestro producto de búsqueda de tarifas bajas líder en su clase, * se utiliza para buscar los itinerarios con los precios más bajos disponibles según una fecha específica. * * Revalidate Itinerary v5 * * La API Revalidate Itinerary permite volver a consultar la disponibilidad * y el precio de una opción de itinerario específica sin tener que reservarla. * La solución revalida si la opción de itinerario es válida para la compra. * Revalidate Itinerary no admite contenido NDC. * * @param sabre Sabre Client Reference */ constructor(sabre) { this.sabre = sabre; } /** * Crear solicitud de Buscador de ofertas Max. * * payload - El mensaje de solicitud de búsqueda de tarifa baja solicita opciones * de itinerario para vuelos entre pares de ciudades específicos, en fechas específicas, * para un número y tipo de pasajeros específicos. * La información opcional de la solicitud puede incluir: * hora/ventana horaria, ciudades de conexión * y preferencias del cliente (aerolíneas, cabina, tipo de vuelo, etc.). * La solicitud de búsqueda de tarifa baja contiene información similar a * la de una búsqueda de tarifa baja en el CRS o GDS de una aerolínea. * @param payload BargainFinderMaxOptions * @returns {Promise<BargainFinderMaxResponseSuccess>} */ async shop(payload) { const path = "/v5/offers/shop"; return this.sabre.post(path, payload); } /** * Crear solicitud de revalidación de itinerario. * * payload - El mensaje de solicitud de búsqueda de tarifa baja solicita opciones * de itinerario para vuelos entre pares de ciudades específicos, en fechas específicas, * para un número y tipo de pasajeros específicos. * La información opcional de la solicitud puede incluir: * hora/ventana horaria, ciudades de conexión * y preferencias del cliente (aerolíneas, cabina, tipo de vuelo, etc.). * La solicitud de búsqueda de tarifa baja contiene información similar a * la de una búsqueda de tarifa baja en el CRS o GDS de una aerolínea. * @param payload RevalidateItineraryOptions * @returns {Promise<RevalidateItineraryResponseSuccess>} */ async revalidate(payload) { const path = "/v5/shop/flights/revalidate"; return this.sabre.post(path, payload); } }; // src/air/ticketing.ts var Ticketing = class { /** * Enhanced Air Ticket v1.3.0 * * La API de boletos aéreos mejorados se utiliza para emitir uno o varios boletos aéreos * y/o EMD (documentos electrónicos varios) dentro de una sola llamada API. * * @param sabre Sabre Client Reference */ constructor(sabre) { this.sabre = sabre; } /** * La API de boletos aéreos mejorados (AirTicketRQ) * se utiliza para emitir boletos aéreos y documentos electrónicos varios (EMD) en una sola solicitud. * * payload - Solicitud de API de boletos aéreos orquestada. * @param payload EnhancedAirTicketOptions * @returns {Promise<EnhancedAirTicketResponseSuccess>} */ async issue(payload) { const path = "/v1.3.0/air/ticket"; return this.sabre.post(path, payload); } }; // src/authentication/authentication.ts var grantType = new URLSearchParams({ "grant_type": "client_credentials" }).toString(); var Authentication = class { constructor(sabre) { this.sabre = sabre; } /** * OAuth Token Create REST API v2 * See https://developer.sabre.com/docs/rest_apis/session_management/token_create_api/v2 * @param payload El tipo de concesión utilizado para obtener el token. Sólo se admiten 'client_credentials'. * @returns TokenResponse */ async OAuthTokenV2(payload = grantType) { const data = await this.sabre.auth( "/v2/auth/token", payload ); this.sabre.setAuthorization(data.access_token); return data; } }; // src/booking-management/booking.ts var Booking = class { /** * Booking * * La API de reservas está diseñada para proporcionar una vista normalizada de una reserva de Sabre combinando el PNR de Sabre y el pedido de Sabre. * * @param sabre Sabre Client Reference */ constructor(sabre) { this.sabre = sabre; } /** * Crea una solicitud que contiene un "Id. de confirmación" y un "apellido" del viajero para obtener información de la reserva. * * payload - Contiene elementos tanto obligatorios como opcionales para realizar una solicitud de reserva. * @param payload GetBookingOptions * @returns {Promise<GetBookingResponseSuccess>} */ get(payload) { const path = "/v1/trip/orders/getBooking"; return this.sabre.post(path, payload); } /** * Crea una reserva aérea (NDC/ATPCO/LCC). * * payload - Contiene elementos obligatorios y opcionales para realizar una solicitud de reserva. * @param payload CreateBookingOptions * @returns {Promise<CreateBookingResponseSuccess>} */ async create(payload) { const path = "/v1/trip/orders/createBooking"; return this.sabre.post(path, payload); } /** * Crea una lista de elementos de reserva que deben cancelarse. * * payload - Contiene elementos obligatorios y opcionales para cancelar la totalidad o partes de una reserva. * @param payload CancelBookingOptions * @returns {Promise<CancelBookingResponseSuccess>} */ async cancel(payload) { const path = "/v1/trip/orders/cancelBooking"; return this.sabre.post(path, payload); } /** * Crea una lista de elementos de reserva que deben modificarse. * * payload - Contiene elementos obligatorios y opcionales para modificar datos no relacionados con el itinerario en la reserva existente. * @param payload ModifyBookingOptions * @returns {Promise<ModifyBookingResponseSuccess>} */ async modify(payload) { const path = "/v1/trip/orders/modifyBooking"; return this.sabre.post(path, payload); } }; // src/booking-management/flight-tickets.ts var FlightTickets = class { /** * Flight Tickets * * Los endpoint de Flight Tickets son un conjunto de métodos diseñados para obtener detalles de los billetes y * realizar operaciones específicas (anulación/reembolso) sobre ellos. * * @param sabre Sabre Client Reference */ constructor(sabre) { this.sabre = sabre; } /** * Procesa tickets proporcionando una solicitud que contiene una lista de números de ticket que se anularán. * * payload - Contiene elementos obligatorios y opcionales para anular los billetes. * @param payload VoidTicketsOptions * @returns {Promise<VoidTicketsResponseSuccess>} */ async void(payload) { const path = "/v1/trip/orders/voidFlightTickets"; return this.sabre.post(path, payload); } /** * Procesa los boletos proporcionando una solicitud que contiene una lista de números de boletos que deben reembolsarse. * Actualmente, los EMD no son compatibles. * * payload - Contiene elementos obligatorios y opcionales para el reembolso de los billetes. * @param payload RefundTicketsOptions * @returns {Promise<RefundTicketsResponseSuccess>} */ async refund(payload) { const path = "/v1/trip/orders/refundFlightTickets"; return this.sabre.post(path, payload); } /** * Procesa tickets proporcionando una solicitud que contiene una lista de números de ticket que se verificarán. * Actualmente, los EMD no son compatibles. * * payload - Contiene elementos obligatorios y opcionales para consultar los tickets. * @param payload CheckTicketsOptions * @returns {Promise<CheckTicketsResponseSuccess>} CheckTicketsResponse */ async check(payload) { const path = "/v1/trip/orders/checkFlightTickets"; return this.sabre.post(path, payload); } /** * Procesa la emisión de billetes y documentos varios electrónicos (EMD). * Actualmente, los EMD no son compatibles. * * payload - Contiene elementos obligatorios y opcionales para la emisión de billetes. * @param payload FulfillTicketsOptions * @returns {Promise<FulfillTicketsResponseSuccess>} */ async fulfill(payload) { const path = "/v1/trip/orders/fulfillFlightTickets"; return this.sabre.post(path, payload); } }; // package.json var version = "0.2.4"; // src/config.ts var defaultBaseUrl = "https://api.platform.sabre.com"; var defaultUserAgent = `sabre-client-node:${version}`; var defaultConversationId = `sabre.client.node:${version}`; var defaultDomain = "AA"; var baseUrl = typeof process !== "undefined" && process.env ? process.env.SABRE_REST_URL || defaultBaseUrl : defaultBaseUrl; var userAgent = typeof process !== "undefined" && process.env ? process.env.SABRE_USER_AGENT || defaultUserAgent : defaultUserAgent; var domain = typeof process !== "undefined" && process.env ? process.env.SABRE_DOMAIN || defaultDomain : defaultDomain; var conversationId = typeof process !== "undefined" && process.env ? process.env.SABRE_CONVERSATION_ID || defaultConversationId : defaultConversationId; // src/errors.ts var SabreError = class extends Error { details; statusCode; constructor(message, statusCode, details) { super(message); this.name = "SabreError"; this.statusCode = statusCode; this.details = details; } }; // src/trip-management/reservation.ts var Reservation = class { /** * Reservation * * La API para crear un registro de nombre de pasajero es una API * orquestada que integra varias funciones y operaciones en una sola llamada. * * Esta API permite crear un registro de nombre de pasajero (PNR), * incluyendo segmentos aéreos, en una sola llamada. * * @param sabre Sabre Client Reference */ constructor(sabre) { this.sabre = sabre; } /** * Cree una reserva completa de contenido aéreo, hotel y automóvil de alquiler, todo dentro de una sola solicitud. * * payload - Contiene elementos obligatorios y opcionales para realizar una solicitud de reserva. * @param payload CreatePassengerNameRecordOptions * @returns {Promise<CreatePassengerNameRecordResponseSuccess>} */ create(payload) { const path = "/v2.5.0/passenger/records?mode=create"; return this.sabre.post(path, payload); } }; // src/sabre.ts var Sabre = class { constructor(options = {}) { this.options = options; const processEnv = typeof process !== "undefined" && process.env; if (!this.options.username && processEnv) this.options.username = processEnv.SABRE_USERNAME; if (!this.options.password && processEnv) this.options.password = processEnv.SABRE_PASSWORD; if (!this.options.organization && processEnv) this.options.organization = processEnv.SABRE_ORGANIZATION; if (!this.options.username || !this.options.password || !this.options.organization) { throw new Error(`Missing Sabre authorization. Pass it to the constructor new Sabre({ username: '773400', password: 'PASSWORD_GOES_HERE', organization: '7TZA', // pcc });})`); } this.headers = new Headers({ "User-Agent": userAgent, "Conversation-ID": conversationId }); this.secret = this.getSecret(); } headers; secret; authentication = new Authentication(this); booking = new Booking(this); flightTickets = new FlightTickets(this); search = new Search(this); ticketing = new Ticketing(this); reservation = new Reservation(this); setAuthorization(token) { this.headers.set("Authorization", `Bearer ${token}`); this.headers.set("Content-Type", "application/json"); } async fetchRequest(path, options = {}) { const response = await fetch(`${baseUrl}${path}`, options); if (!response.ok) { let errorDetails = `Request failed with status ${response.status}`; try { const jsonError = await response.json(); errorDetails = JSON.stringify(jsonError); } catch (e) { console.error(e); errorDetails = response.statusText; } throw new SabreError( `Request failed with status ${response.status}`, response.status, errorDetails ); } const data = await response.json(); return data; } async post(path, entity, options = {}) { const requestOptions = { method: "POST", headers: this.headers, body: JSON.stringify(entity), ...options }; return this.fetchRequest(path, requestOptions); } async auth(path, entity, options = {}) { this.headers.set("Authorization", `Basic ${this.secret}`); this.headers.set("Content-Type", "application/x-www-form-urlencoded"); const requestOptions = { method: "POST", headers: this.headers, body: entity, ...options }; return this.fetchRequest(path, requestOptions); } getSecret() { if (!this.options.password) throw new Error("Missing Sabre password"); return btoa(`${this.userID()}:${btoa(this.options.password)}`); } userID() { return btoa(`V1:${this.options.username}:${this.options.organization}:${domain}`); } }; export { Sabre }; //# sourceMappingURL=index.js.map