| 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 |
|
|