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"] ] @node_names [ AirShoppingRQ: [:Travelers, :CoreQuery, :Preferences, :Metadata], FlightPriceRQ: [:Travelers, :Query, :Metadata, :DataLists], SeatAvailability: [:Query, :DataLists], OrderCreateRQ: [:Query], ] def build_document(method, data, config) do [ndc_method, response_name] = get_request_data(method) xml = build_ndc_body(ndc_method, data, config) |> generate_xml(config[:soap][:namespace][method]) |> add_soap_tags(config[:soap]) {xml, Time.now} end defp generate_xml(data, ns) when ns == nil, do: doc(data) defp generate_xml(data, ns) when is_bitstring(ns), do: namespace(data, ns) defp add_soap_tags(xml, config) when config == nil, do: xml defp add_soap_tags(xml, config) do ns = config[:request_namespace] xml_header = "" attribute = String.replace(config[:attributes][:envelope], "{{namespace}}", ns) xml = String.replace(xml, xml_header, "") envelope_start = "<#{ns}:Envelope #{attribute}>" body_start = "<#{ns}:Body #{ config[:attributes][:body]}>" body_end = "" envelope_end = "" Enum.join([xml_header, envelope_start, body_start, xml, body_end, envelope_end], "\n") 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(ndc_method, data, config) do 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) ] element(String.to_atom(ndc_method), config[:ndc][:attributes], elements) end end