defmodule HiiveRisk.Model do @moduledoc "Model transport contract. Results are validated before they can change a review." @callback decision(map()) :: {:ok, map()} | {:error, term()} @callback sft(map()) :: {:ok, map()} | {:error, term()} end defmodule HiiveRisk.Model.HTTP do @behaviour HiiveRisk.Model @impl true def decision(snapshot), do: request(:decision_url, snapshot) @impl true def sft(snapshot), do: request(:sft_url, snapshot) defp request(endpoint, snapshot) do config = Application.get_env(:hiive_risk, __MODULE__, []) case Keyword.get(config, endpoint) do nil -> {:error, :model_endpoint_not_configured} url -> headers = case Keyword.get(config, :token) do nil -> [] token -> [{"authorization", "Bearer " <> token}] end case Req.post(url, json: snapshot, headers: headers, retry: false, redirect: false, receive_timeout: Keyword.get(config, :receive_timeout, 30_000) ) do {:ok, %{status: status, body: body}} when status in 200..299 -> {:ok, body} {:ok, %{status: status}} -> {:error, {:model_http_status, status}} {:error, _reason} -> {:error, :model_request_failed} end end end end