defmodule Bling do
@moduledoc """
Retreives config values and provides helper methods.
"""
@type customer :: any
@type conn :: Plug.Conn.t()
@type event :: Stripe.Event.t()
@callback can_manage_billing?(conn, customer) :: boolean
@callback to_stripe_params(customer) :: map
@callback tax_rate_ids(customer) :: [binary]
@callback handle_stripe_webhook_event(event) :: any
def bling do
Application.get_env(:bling, :bling)
end
def repo do
Application.get_env(:bling, :repo)
end
def customers do
Application.get_env(:bling, :customers, [])
end
def subscription do
Application.get_env(:bling, :subscription)
end
def subscription_item do
Application.get_env(:bling, :subscription_item)
end
def module_from_customer_type(type) do
Enum.find_value(customers(), fn {name, mod} ->
if to_string(name) == to_string(type), do: mod, else: nil
end)
end
def customer_type_from_struct(customer) do
Enum.find_value(customers(), fn {name, mod} ->
if customer.__struct__ == mod, do: to_string(name), else: nil
end)
end
def customer_from_stripe_id(stripe_id) do
Enum.find_value(customers(), fn {_, schema} ->
repo().get_by(schema, stripe_id: stripe_id)
end)
end
end