Current section

Files

Jump to
ndc_ex_sdk lib message base.ex
Raw

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