Packages
ndc_ex_sdk
0.1.1
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, data, config) do
[ndc_method, response_name] = get_request_data(method)
build_ndc_body(ndc_method, data, config)
|> generate
|> add_soap_tags(config)
end
defp add_soap_tags(xml, config) do
if config[:soap] == nil do
xml
else
IO.puts("Adding SOAP wrapping...")
first_char = String.at(xml, 0)
last_char = String.at(xml, String.length(xml)-1)
ns = config[:soap][:request_namespace]
envelope_start = "<#{ns}:Envelope #{ config[:soap][:attributes][:envelope]}>"
body_start = "<#{ns}:Body #{ config[:soap][:attributes][:body]}>"
body_end = "</#{ns}:Body>"
envelope_end = "</#{ns}:Envelope>"
Enum.join([envelope_start, body_start, xml, body_end, envelope_end], "\n")
end
end
def build_url(url, method), do: String.replace(url, "{{NDC-method}}", Atom.to_string(method))
defp get_request_data(method), do: @acceptable_ndc_methods[method]
defp message_attributes(ndc_method, config) do
config[:ndc][:attributes]
end
defp build_ndc_body(ndc_method, data, config) do
tag_list = [:Document, :Party, :Travelers, :CoreQuery, :Preferences, :Metadata]
elements = [
Enum.filter(tag_list, fn(tag) -> data[tag] != nil end)
|> Enum.map( fn(tag) ->
element(tag, data[tag])
end)
]
element(String.to_atom(ndc_method), message_attributes(ndc_method, config), elements)
end
end