99 lines
3.0 KiB
Elixir
99 lines
3.0 KiB
Elixir
defmodule PlausibleWeb.Plugins.API.Controllers.CustomProps do
|
|
@moduledoc """
|
|
Controller for the CustomProp resource under Plugins API
|
|
"""
|
|
use PlausibleWeb, :plugins_api_controller
|
|
|
|
operation(:enable,
|
|
operation_id: "CustomProp.GetOrEnable",
|
|
summary: "Get or enable CustomProp(s)",
|
|
request_body:
|
|
{"CustomProp enable params", "application/json", Schemas.CustomProp.EnableRequest},
|
|
responses: %{
|
|
created: {"CustomProp", "application/json", Schemas.CustomProp.ListResponse},
|
|
unauthorized: {"Unauthorized", "application/json", Schemas.Unauthorized},
|
|
payment_required: {"Payment required", "application/json", Schemas.PaymentRequired},
|
|
unprocessable_entity:
|
|
{"Unprocessable entity", "application/json", Schemas.UnprocessableEntity}
|
|
}
|
|
)
|
|
|
|
@spec enable(Plug.Conn.t(), map()) :: Plug.Conn.t()
|
|
def enable(
|
|
%{private: %{open_api_spex: %{body_params: body_params}}} = conn,
|
|
_params
|
|
) do
|
|
site = conn.assigns.authorized_site
|
|
|
|
prop_or_props =
|
|
case body_params do
|
|
%{custom_props: props} ->
|
|
Enum.map(props, & &1.custom_prop.key)
|
|
|
|
%{custom_prop: %{key: prop}} ->
|
|
prop
|
|
end
|
|
|
|
case API.CustomProps.enable(site, prop_or_props) do
|
|
{:ok, enabled_props} ->
|
|
conn
|
|
|> put_view(Views.CustomProp)
|
|
|> put_status(:created)
|
|
|> render("index.json", props: enabled_props, authorized_site: site)
|
|
|
|
{:error, :upgrade_required} ->
|
|
payment_required(conn)
|
|
|
|
{:error, changeset} ->
|
|
Errors.error(conn, 422, changeset)
|
|
end
|
|
end
|
|
|
|
operation(:disable,
|
|
operation_id: "CustomProp.DisableBulk",
|
|
summary: "Disable CustomProp(s)",
|
|
request_body:
|
|
{"CustomProp disable params", "application/json", Schemas.CustomProp.DisableRequest},
|
|
responses: %{
|
|
no_content: {"NoContent", nil, nil},
|
|
unauthorized: {"Unauthorized", "application/json", Schemas.Unauthorized},
|
|
payment_required: {"Payment required", "application/json", Schemas.PaymentRequired},
|
|
unprocessable_entity:
|
|
{"Unprocessable entity", "application/json", Schemas.UnprocessableEntity}
|
|
}
|
|
)
|
|
|
|
@spec disable(Plug.Conn.t(), map()) :: Plug.Conn.t()
|
|
def disable(
|
|
%{private: %{open_api_spex: %{body_params: body_params}}} = conn,
|
|
_params
|
|
) do
|
|
site = conn.assigns.authorized_site
|
|
|
|
prop_or_props =
|
|
case body_params do
|
|
%{custom_props: props} ->
|
|
Enum.map(props, & &1.custom_prop.key)
|
|
|
|
%{custom_prop: %{key: prop}} ->
|
|
prop
|
|
end
|
|
|
|
case API.CustomProps.disable(site, prop_or_props) do
|
|
:ok ->
|
|
send_resp(conn, :no_content, "")
|
|
|
|
{:error, changeset} ->
|
|
Errors.error(conn, 422, changeset)
|
|
end
|
|
end
|
|
|
|
defp payment_required(conn) do
|
|
Errors.error(
|
|
conn,
|
|
402,
|
|
"#{Plausible.Billing.Feature.Props.display_name()} is part of the Plausible Business plan. To get access to this feature, please upgrade your account."
|
|
)
|
|
end
|
|
end
|