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, params) do [request_name, response_name] = get_request_data(method) build_body(request_name, params[:ndc]) |> generate |> add_soap_tags(params) end defp add_soap_tags(xml, params) do if params[:soap] == nil do xml end first_char = String.at(xml, 0) last_char = String.at(xml, String.length(xml)-1) ns = params[:soap][:namespace] envelope_start = "<#{ns}:Envelope #{ params[:soap][:attributes][:envelope]}>#{first_char}" body_start = "<#{ns}:Body>" body_end = "" envelope_end = "" Enum.join([envelope_start, body_start, xml, body_end, envelope_end], "\n") end defp get_request_data(method), do: @acceptable_ndc_methods[method] defp document_attributes(request_name) do %{ "xmlns" => "http://www.iata.org/IATA/EDIST", "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation" => "http://www.iata.org/IATA/EDIST ../#{request_name}.xsd", "Version" => "15.2" } end defp build_body(request_name, params) do element(String.to_atom(request_name), document_attributes(request_name), [ element(Document: params[:Document]), element(Party: params[:Party]), element(Parameters: params[:Parameters]), element(Travelers: [params[:Travelers]]), element(CoreQuery: [params[:CoreQuery]]), element(Preferences: params[:Preferences]) ] ) end end