sabre-client
Version:
Sabre Node.js SDK
370 lines (361 loc) • 13.2 kB
JavaScript
// 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