121 lines
3.6 KiB
Elixir
121 lines
3.6 KiB
Elixir
defmodule PlausibleWeb.Plugins.API.Controllers.Funnels do
|
|
@moduledoc """
|
|
Controller for the Funnel resource under Plugins API
|
|
"""
|
|
use PlausibleWeb, :plugins_api_controller
|
|
|
|
operation(:create,
|
|
operation_id: "Funnel.GetOrCreate",
|
|
summary: "Get or create Funnel",
|
|
request_body: {"Funnel params", "application/json", Schemas.Funnel.CreateRequest},
|
|
responses: %{
|
|
created: {"Funnel", "application/json", Schemas.Funnel},
|
|
unauthorized: {"Unauthorized", "application/json", Schemas.Unauthorized},
|
|
payment_required: {"Payment required", "application/json", Schemas.PaymentRequired},
|
|
unprocessable_entity:
|
|
{"Unprocessable entity", "application/json", Schemas.UnprocessableEntity}
|
|
}
|
|
)
|
|
|
|
def create(
|
|
%{private: %{open_api_spex: %{body_params: body_params}}} = conn,
|
|
_params
|
|
) do
|
|
site = conn.assigns.authorized_site
|
|
|
|
case Plausible.Plugins.API.Funnels.create(site, body_params) do
|
|
{:ok, funnel} ->
|
|
headers = [{"location", plugins_api_funnels_url(conn, :get, funnel.id)}]
|
|
|
|
conn
|
|
|> prepend_resp_headers(headers)
|
|
|> put_view(Views.Funnel)
|
|
|> put_status(:created)
|
|
|> render("funnel.json", funnel: funnel, authorized_site: site)
|
|
|
|
{:error, :upgrade_required} ->
|
|
payment_required(conn)
|
|
|
|
{:error, changeset} ->
|
|
Errors.error(conn, 422, changeset)
|
|
end
|
|
end
|
|
|
|
operation(:index,
|
|
summary: "Retrieve Funnels",
|
|
parameters: [
|
|
limit: [in: :query, type: :integer, description: "Maximum entries per page", example: 10],
|
|
after: [
|
|
in: :query,
|
|
type: :string,
|
|
description: "Cursor value to seek after - generated internally"
|
|
],
|
|
before: [
|
|
in: :query,
|
|
type: :string,
|
|
description: "Cursor value to seek before - generated internally"
|
|
]
|
|
],
|
|
responses: %{
|
|
ok: {"Funnels response", "application/json", Schemas.Funnel.ListResponse},
|
|
unauthorized: {"Unauthorized", "application/json", Schemas.Unauthorized}
|
|
}
|
|
)
|
|
|
|
@spec index(Plug.Conn.t(), %{}) :: Plug.Conn.t()
|
|
def index(conn, _params) do
|
|
{:ok, pagination} = API.Funnels.get_funnels(conn.assigns.authorized_site, conn.query_params)
|
|
|
|
conn
|
|
|> put_view(Views.Funnel)
|
|
|> render("index.json", %{pagination: pagination})
|
|
end
|
|
|
|
operation(:get,
|
|
summary: "Retrieve Funnel by ID",
|
|
parameters: [
|
|
id: [
|
|
in: :path,
|
|
type: :integer,
|
|
description: "Funnel ID",
|
|
example: 123,
|
|
required: true
|
|
]
|
|
],
|
|
responses: %{
|
|
ok: {"Goal", "application/json", Schemas.Funnel},
|
|
not_found: {"NotFound", "application/json", Schemas.NotFound},
|
|
unauthorized: {"Unauthorized", "application/json", Schemas.Unauthorized},
|
|
unprocessable_entity:
|
|
{"Unprocessable entity", "application/json", Schemas.UnprocessableEntity}
|
|
}
|
|
)
|
|
|
|
@spec get(Plug.Conn.t(), map()) :: Plug.Conn.t()
|
|
def get(%{private: %{open_api_spex: %{params: %{id: id}}}} = conn, _params) do
|
|
site = conn.assigns.authorized_site
|
|
|
|
case API.Funnels.get(site, id) do
|
|
nil ->
|
|
conn
|
|
|> put_view(Views.Error)
|
|
|> put_status(:not_found)
|
|
|> render("404.json")
|
|
|
|
funnel ->
|
|
conn
|
|
|> put_view(Views.Funnel)
|
|
|> put_status(:ok)
|
|
|> render("funnel.json", funnel: funnel, authorized_site: site)
|
|
end
|
|
end
|
|
|
|
defp payment_required(conn) do
|
|
Errors.error(
|
|
conn,
|
|
402,
|
|
"#{Plausible.Billing.Feature.Funnels.display_name()} is part of the Plausible Business plan. To get access to this feature, please upgrade your account."
|
|
)
|
|
end
|
|
end
|