Packages
ndc_ex_sdk
0.2.27
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 XmlBuilderPlus
#require Logger
#use Timex
@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"],
ItinReshop: ["ItinReshopRQ", "ItinReshopRS"],
BaggageCharges: ["BaggageChargesRQ", "BaggageChargesRS"],
OrderChange: ["OrderChangeRQ", "OrderChangeRS"],
OrderCancel: ["OrderCancelRQ", "OrderCancelRS"],
OrderRetrieve: ["OrderRetrieveRQ", "OrderRetrieveRS"]
]
@node_names [
AirShoppingRQ: ["Parameters", "Travelers", "CoreQuery", "Preferences", "Metadata"],
FlightPriceRQ: ["Travelers", "Query", "Metadata", "DataLists"],
SeatAvailabilityRQ: ["Travelers", "Query", "DataList", "Metadata"],
OrderCreateRQ: ["Query"],
ItinReshopRQ: ["Query"],
BaggageChargesRQ: ["Travelers", "Query"],
OrderChangeRQ: ["Travelers", "Query"],
OrderCancelRQ: ["Query"],
OrderRetrieveRQ: ["Query"]
]
def build_document(method, data, config) do
xml = build_ndc_body(method, data, config)
|> ExtraData.set_wrapper(config["message"])
|> SoapHelper.add_soap(config["soap"], method, [wrapper: config["message"]["wrapper"]])
|> doc(config["soap"]["namespace_list"][method])
{:ok, xml}
end
def build_document(method, data, config, credentials) do
data = NDCMerge.getData(data, credentials[config["label"]]["Body"])
xml = build_ndc_body(method, data, config)
|> ExtraData.set_wrapper(config["message"])
|> SoapHelper.add_soap(config["soap"], method, [{"wrapper", config["message"]["wrapper"]}])
|> doc(config["soap"]["namespace_list"][method])
{:ok, xml}
end
defp generate_xml(data, nil), do: data |> doc
defp generate_xml(data, ns), do: doc_with_namespace(data, ns)
def build_url(url, method), do: String.replace(url, "{{NDC-method}}", method)
defp get_request_data(method), do: @acceptable_ndc_methods[method]
defp build_ndc_body(method, data, config) do
[ndc_method, response_name] = get_request_data(method)
ndc = String.to_atom(ndc_method)
tag_list = ["Document", "Party" ] ++ @node_names[ndc]
elements = [
Enum.filter(tag_list, fn(tag) -> data[tag] != nil end)
|> Enum.map( fn(tag) ->
element(tag, data[tag])
end)
]
merge_attributes(config["ndc"]["attributes"][method], ndc, elements)
end
defp merge_attributes(nil, method, elements), do: element(method, elements)
defp merge_attributes(attrs, method, elements), do: element(method, attrs, elements)
end