Current section

Files

Jump to
btrz_ex_auth_api lib plug add_premium_from_providers.ex
Raw

lib/plug/add_premium_from_providers.ex

defmodule BtrzAuth.Plug.AddPremiumFromProviders do
@moduledoc """
Looks for the `provider_ids` in the query params and fetchs its premium keys using account data under `conn.private.account`
saved by `BtrzAuth.Plug.VerifyApiKey` (the order of the plugs is very important!)
This plug will look for `providerId` or `provider_id` or a list of comma separated ids in `providerIds` or
`provider_ids`.
This plug assumes that `BtrzAuth.Plug.VerifyProviders` already verified that the providers are valid for the account.
If the passed provider/s have premium keys, these will be added to the ones of the `conn.private.account`.
### Example
```elixir
plug BtrzAuth.Plug.AddPremiumFromProviders
```
"""
import Plug.Conn
require Logger
def init(_params) do
end
def call(conn, _) do
Logger.debug("accessing AddPremiumFromProviders plug..")
conn
|> get_provider_ids_from_query()
|> add_premium_from_providers(conn)
end
defp get_provider_ids_from_query(conn) do
conn = fetch_query_params(conn)
(conn.query_params["providerIds"] || conn.query_params["provider_ids"] ||
conn.query_params["providerId"] || conn.query_params["provider_id"] ||
"")
|> String.split(",", trim: true)
|> Enum.map(&String.trim/1)
end
defp add_premium_from_providers(provider_ids, %{private: %{account: account}} = conn) do
premiums =
provider_ids
|> Enum.reduce(Map.get(account, "premium", []), fn provider_id, premium_list ->
account
|> Map.get("providers", %{})
|> Map.get(provider_id, %{})
|> Map.get("premium", [])
|> Kernel.++(premium_list)
end)
|> Enum.uniq()
put_in(conn.private.account["premium"], premiums)
end
defp add_premium_from_providers(_provider_ids, conn), do: conn
end