Current section

Files

Jump to
ndc_ex_sdk lib message base.ex
Raw

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