63 lines
1.9 KiB
Elixir
63 lines
1.9 KiB
Elixir
defmodule PlausibleWeb.Api.InternalController do
|
|
use PlausibleWeb, :controller
|
|
use Plausible.Repo
|
|
alias Plausible.{Sites, Auth}
|
|
alias Plausible.Auth.User
|
|
|
|
def sites(conn, _params) do
|
|
current_user = conn.assigns[:current_user]
|
|
current_team = conn.assigns[:current_team]
|
|
|
|
if current_user do
|
|
sites = sites_for(current_user, current_team)
|
|
|
|
json(conn, %{data: sites})
|
|
else
|
|
PlausibleWeb.Api.Helpers.unauthorized(
|
|
conn,
|
|
"You need to be logged in to request a list of sites"
|
|
)
|
|
end
|
|
end
|
|
|
|
@features %{
|
|
"funnels" => Plausible.Billing.Feature.Funnels,
|
|
"props" => Plausible.Billing.Feature.Props,
|
|
"conversions" => Plausible.Billing.Feature.Goals
|
|
}
|
|
def disable_feature(conn, %{"domain" => domain, "feature" => feature}) do
|
|
with %User{id: user_id} = user <- conn.assigns[:current_user],
|
|
site <- Sites.get_by_domain(domain),
|
|
true <-
|
|
Plausible.Teams.Memberships.has_editor_access?(site, user) ||
|
|
Auth.is_super_admin?(user_id),
|
|
{:ok, mod} <- Map.fetch(@features, feature),
|
|
{:ok, _site} <- mod.toggle(site, user, override: false) do
|
|
json(conn, "ok")
|
|
else
|
|
{:error, :upgrade_required} ->
|
|
PlausibleWeb.Api.Helpers.payment_required(
|
|
conn,
|
|
"This feature is part of the Plausible Business plan. To get access to this feature, please upgrade your account"
|
|
)
|
|
|
|
:error ->
|
|
PlausibleWeb.Api.Helpers.bad_request(
|
|
conn,
|
|
"The feature you tried to disable is not valid. Valid features are: #{@features |> Map.keys() |> Enum.join(", ")}"
|
|
)
|
|
|
|
_ ->
|
|
PlausibleWeb.Api.Helpers.unauthorized(
|
|
conn,
|
|
"You need to be logged in as the owner or admin account of this site"
|
|
)
|
|
end
|
|
end
|
|
|
|
defp sites_for(user, team) do
|
|
pagination = Sites.list(user, %{page_size: 9}, team: team)
|
|
Enum.map(pagination.entries, &%{domain: &1.domain})
|
|
end
|
|
end
|