Current section
Files
Jump to
Current section
Files
lib/mango_pay.ex
defmodule MangoPay do
@moduledoc """
The elixir client for MangoPay API.
This module is the root of all the application.
## Configuring
Set your API key by configuring the :mangopay application.
```
config :mangopay, client_id: YOUR_MANGOPAY_CLIENT_ID
config :mangopay, passphrase: MANGOPAY_PLATFORM_KEY
```
"""
@base_header %{"User-Agent": "Elixir", "Content-Type": "application/json"}
@payline_header %{"Accept-Encoding": "gzip;q=1.0,deflate;q=0.6,identity;q=0.3", "Accept": "*/*", "Host": "homologation-webpayment.payline.com"}
def base_header do
@base_header
end
@doc """
Returns MANGOPAY_BASE_URL
"""
def base_url do
"https://api.sandbox.mangopay.com"
end
@doc """
Returns MANGOPAY_CLIENT
"""
def client do
Application.get_env(:mangopay, :client)
end
def mangopay_version do
"v2.01"
end
def mangopay_version_and_client_id do
"/#{mangopay_version()}/#{MangoPay.client()[:id]}"
end
@doc """
Request to mangopay web API.
## Examples
response = MangoPay.request!("get", "users")
"""
def request! {method, url, body, headers} do
request!(method, url, body, headers)
end
def request! {method, url, query} do
request!(:get, url, "", "", query)
end
def request!(method, url, body \\ "", headers \\ "", query \\ %{}) do
{method, url, body, headers, _} = full_header_request(method, url, body, headers, query)
filter_and_send(method, url, body, headers, query, true)
end
@doc """
Request to mangopay web API.
## Examples
{:ok, response} = MangoPay.request({"get", "users", nil, nil})
"""
def request {method, url, body, headers} do
request(method, url, body, headers)
end
def request {method, url, query} do
request(:get, url, "", "", query)
end
@doc """
Request to mangopay web API.
## Examples
{:ok, response} = MangoPay.request("get", "users")
"""
def request(method, url, body \\ "", headers \\ "", query \\ %{}) do
{method, url, body, headers, query} = full_header_request(method, url, body, headers, query)
filter_and_send(method, url, body, headers, query, false)
end
defp full_header_request(method, url, body, headers, query) do
{method, url, decode_map(body), headers, query}
|> authorization_params()
|> payline_params()
end
defp authorization_params {method, url, body, headers, query} do
headers = case headers do
%{"Authorization": _} -> headers
_ -> Map.merge(base_header(), %{"Authorization": "#{MangoPay.Authorization.pull_token()}"})
end
{method, url, body, headers, query}
end
defp payline_params {method, url, body, headers, query} do
if String.contains?(url, "payline") do
{method, url, body, cond_payline(headers), query}
else
{method, cond_mangopay(url), body, headers, query}
end
end
defp cond_payline headers do
headers
|> Map.update!(:"Content-Type", fn _ -> "application/x-www-form-urlencoded" end)
|> Map.merge(@payline_header)
end
defp cond_mangopay url do
base_url() <> mangopay_version_and_client_id() <> url
end
defp decode_map body do
cond do
is_map body -> Poison.encode! body
is_list body -> Poison.encode! body
is_binary body -> body
end
end
# default request send to mangopay
defp filter_and_send(method, url, body, headers, query, bang) do
cond do
bang ->
case {Mix.env, method} do
{:dev, _} -> HTTPoison.request!(method, url, body, headers, [params: query, timeout: 4600, recv_timeout: 5000])
{:test, _} -> HTTPoison.request!(method, url, body, headers, [params: query, timeout: 500000, recv_timeout: 500000])
end
true ->
case {Mix.env, method, query} do
{:dev, _, _} -> HTTPoison.request(method, url, body, headers, [params: query, timeout: 4600, recv_timeout: 5000])
{:test, _, _} -> HTTPoison.request(method, url, body, headers, [params: query, timeout: 500000, recv_timeout: 500000])
end
end
end
end