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