Packages
ndc_ex_sdk
0.1.7
0.2.30
0.2.29
0.2.27
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
This is an Elixir package that wrapps any NDC-compliant API. It's host-agnostic and quite flexible-through-configuration so that it can reach NDC hosts with a certain flexibility
Current section
Files
Jump to
Current section
Files
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, config, method) do
Logger.debug xml
url = NDCEx.Message.Base.build_url(config[:server][:url], method)
headers = get_headers(config[:rest][:headers], method)
case HTTPotion.post(url, [body: xml, headers: headers, timeout: 30000 ]) do
%HTTPotion.Response{body: body, headers: _headers, status_code: 200 } ->
FileLogger.log(xml, body, config)
process_response(body, config[:soap])
%HTTPotion.Response{body: body, headers: _headers, status_code: _status_code } ->
FileLogger.log(xml, body, config)
{:error, remove_soap_tags(body, config[:soap])}
%HTTPotion.Response{status_code: 404} ->
{:error, error_message("Request does not exist")}
_ ->
{:error, error_message("Unknown Error")}
end
end
defp process_response(body, config) when config == nil do
if String.contains?(body, "<error>"), do: {:error, body}, else: {:ok, body}
end
defp process_response(body, config) when is_list(config) do
xml = remove_soap_tags(body, config[: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, config) do
if config[:response_namespace] == nil do
xml
else
IO.inspect xml
ns = config[:response_namespace]
attribute = String.replace(config[:soap][:attributes][:envelope], "{{namespace}}", ns)
String.replace(xml, "<#{ns}:Envelope #{attribute}", "")
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