Current section

Files

Jump to
ndc_ex_sdk lib ndc_ex.ex
Raw

lib/ndc_ex.ex

defmodule NDCEx do
require HTTPotion
require Logger
def request(method, data, config) do
NDCEx.Message.Base.build_document(method, data, config)
|> rest_call_with_message(config, method)
end
def rest_call_with_message(xml, params, method) do
Logger.debug xml
url = NDCEx.Message.Base.build_url(params[:server][:url], method)
headers = get_headers(params[:rest][:headers], method)
case HTTPotion.post(url, [body: xml, headers: headers, timeout: 30000 ]) do
%HTTPotion.Response{body: body, headers: _headers, status_code: 200 } ->
process_response(body, params[:soap])
%HTTPotion.Response{body: body, headers: _headers, status_code: _status_code } ->
{:error, remove_soap_tags(body, params[:soap])}
%HTTPotion.Response{status_code: 404} ->
{:error, error_message("Request does not exist")}
_ ->
{:error, error_message("Unknown Error")}
end
end
defp process_response(body, params) when params == nil do
if String.contains?(body, "<error>"), do: {:error, body}, else: {:ok, body}
end
defp process_response(body, params) when is_list(params) do
xml = remove_soap_tags(body, params[:soap])
if String.contains?(xml, "<error>"), do: {:error, xml}, else: {:ok, xml}
end
defp get_headers(headers, method) do
Enum.map(headers, fn ({key, value}) ->
{key, String.replace(value, "{{NDC-method}}", Atom.to_string(method))}
end)
end
defp remove_soap_tags(xml, params) do
if params[:response_namespace] == nil do
xml
else
ns = params[:response_namespace]
#remove_tag(xml, "<#{ns}:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">")
String.replace(xml, "<#{ns}:Envelope xmlns:#{ns}=\"http://schemas.xmlsoap.org/soap/envelope/\">", "")
String.replace(xml, "<#{ns}:Body>", "")
String.replace(xml, "</#{ns}:Body>", "")
String.replace(xml, "</soap:Body>", "")
String.replace(xml, "</#{ns}:Envelope>", "")
end
end
defp build_url(url, method), do: String.replace(url, "{{NDC-method}}", Atom.to_string(method))
defp error_message(message), do: "<error><message>#{message}</message></error>"
defp remove_tag(doc, tag), do: String.replace(doc, tag, "")
def get_mix_config(key) when is_atom(key), do: Application.get_env(:ndc_ex_sdk, key)
end