Packages
ndc_ex_sdk
0.1.0
0.2.30
0.2.29
0.2.27
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
This is an Elixir package that wrapps any NDC-compliant API. It's host-agnostic and quite flexible-through-configuration so that it can reach NDC hosts with a certain flexibility
Current section
Files
Jump to
Current section
Files
lib/message/base.ex
defmodule NDCEx.Message.Base do
import XmlBuilder
require Logger
@acceptable_ndc_methods [
AirShopping: ["AirShoppingRQ", "AirShoppingRS"],
FlightPrice: ["FlightPriceRQ", "FlightPriceRS"],
SeatAvailability: ["SeatAvailabilityRQ", "SeatAvailabilityRS"],
ServiceList: ["ServiceListRQ", "ServiceListRS"],
ServicePrice: ["ServicePriceRQ", "ServicePriceRS"],
OrderCreate: ["OrderCreateRQ", "OrderViewRS"],
OrderList: ["OrderListRQ", "OrderListRS"],
OrderRetrieve: ["OrderRetrieveRQ", "OrderViewRS"],
OrderCancel: ["OrderCancelRQ", "OrderCancelRS"]
]
@node_names [
AirShopping: :CoreQuery,
FlightPrice: [:Query, :DataLists, :Metadata],
SeatAvailability: [:Query, :DataLists]
]
def build_document(method, params) do
[request_name, response_name] = get_request_data(method)
build_body(request_name, params[:ndc])
|> generate
|> add_soap_tags(params)
end
defp add_soap_tags(xml, params) do
if params[:soap] == nil do
xml
end
first_char = String.at(xml, 0)
last_char = String.at(xml, String.length(xml)-1)
ns = params[:soap][:namespace]
envelope_start = "<#{ns}:Envelope #{ params[:soap][:attributes][:envelope]}>#{first_char}"
body_start = "<#{ns}:Body>"
body_end = "</#{ns}:Body>"
envelope_end = "</#{ns}:Envelope>"
Enum.join([envelope_start, body_start, xml, body_end, envelope_end], "\n")
end
defp get_request_data(method), do: @acceptable_ndc_methods[method]
defp document_attributes(request_name) do
%{
"xmlns" => "http://www.iata.org/IATA/EDIST",
"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
"xsi:schemaLocation" => "http://www.iata.org/IATA/EDIST ../#{request_name}.xsd",
"Version" => "15.2"
}
end
defp build_body(request_name, params) do
element(String.to_atom(request_name), document_attributes(request_name), [
element(Document: params[:Document]),
element(Party: params[:Party]),
element(Parameters: params[:Parameters]),
element(Travelers: [params[:Travelers]]),
element(CoreQuery: [params[:CoreQuery]]),
element(Preferences: params[:Preferences])
]
)
end
end