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"] ] @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] ] 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, [credential: "xmlaig001", wrapper: config[:message][:wrapper]]) |> doc(config[:soap][:namespace_list][method]) {:ok, xml} end defp generate_xml(data, ns) when ns == nil do doc(data) end defp generate_xml(data, ns) do doc_with_namespace(data, ns) 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 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) ] if config[:ndc][:attributes][method] do element(String.to_atom(ndc_method), config[:ndc][:attributes][method], elements) else element(String.to_atom(ndc_method), elements) end end end