| defmodule Plausible.Plugins.API.Capabilities do | |
| @moduledoc """ | |
| Context module for querying API capabilities | |
| """ | |
| require Plausible.Billing.Feature | |
| alias Plausible.Billing.Feature | |
| @spec get(Plug.Conn.t()) :: {:ok, map()} | |
| def get(conn) do | |
| conn = PlausibleWeb.Plugs.AuthorizePluginsAPI.call(conn, send_error?: false) | |
| site = conn.assigns[:authorized_site] | |
| features = | |
| if site do | |
| site = Plausible.Repo.preload(site, :team) | |
| allowed_features = Plausible.Teams.Billing.allowed_features_for(site.team) | |
| Feature.list() | |
| |> Enum.map(fn mod -> | |
| feature = mod |> Module.split() |> List.last() | |
| {feature, mod in allowed_features} | |
| end) | |
| else | |
| Enum.map(Feature.list_short_names(), &{&1, false}) | |
| end | |
| {:ok, | |
| %{ | |
| authorized: not is_nil(site), | |
| data_domain: site && site.domain, | |
| features: Enum.into(features, %{}) | |
| }} | |
| end | |
| end | |