defmodule ExCheckout.Transaction do defstruct id: nil, data: [] alias ExCheckout.Transaction, as: Transaction @doc """ Return the module id """ def id() do {:ok, 0} end @doc """ Return the module id """ def module_id() do __MODULE__ end @doc """ Run the module process. """ def process(data) do {:ok, data} end @doc """ Fetches a Transaction module by its atom/string representation. iex> Transaction.module(:ups) Transaction.UPS iex> Transaction.module("UPS") Transaction.UPS iex> Transaction.module("ups") Transaction.UPS """ @spec module(atom | String.t(), List.t()) :: module() def module(transaction, module_list \\ []) def module(transaction, module_list) when is_atom(transaction) do default_modules = ExCheckout.get_transaction_modules() transactions = Application.get_env(:ex_checkout, :payment_providers, module_list) |> Enum.map(fn {k, c} -> module = Keyword.get(c, :module) case module do nil -> Enum.filter(default_modules, fn {_module, module_transaction} -> module_transaction == k end) module -> {k, module} end end) |> IO.inspect() |> Enum.reject(fn x -> x == nil end) module = case Enum.filter(transactions, fn {k, _} -> k == transaction end) do [{_, transaction_module}] -> transaction_module {_, transaction_module} -> transaction_module c -> raise "#{c} is not a supported transaction type at this time." end available_providers = ExCheckout.payment_providers() if transaction in available_providers do module else raise ExCheckout.InvalidConfigError, "#{inspect(transaction)} not found in providers: #{inspect(available_providers)}" end end def module(string, _module_list) when is_binary(string) do string |> String.downcase() |> String.to_atom() |> module end @doc """ Checks if Module Exists. iex> Transaction.module_exists(:ups) true iex> Transaction.module_exists("UPS") true iex> Transaction.module_exists("ups") true """ def module_exists(atom, module_list \\ []) when is_atom(atom) do default_modules = ExCheckout.get_transaction_modules() transactions = Application.get_env(:ex_checkout, :payment_providers, module_list) |> Enum.map(fn {k, c} -> module = Keyword.get(c, :module) case module do nil -> Enum.filter(default_modules, fn {_module, module_transaction} -> module_transaction == k end) module -> {k, module} end end) |> IO.inspect() |> Enum.reject(fn x -> x == nil end) module = case Enum.filter(transactions, fn {k, _} -> k == atom end) do [{_, transaction_module}] -> transaction_module {_, transaction_module} -> transaction_module _ -> %Transaction{} end available_providers = ExCheckout.available_payment_processors() if module in available_providers do true else false end end end