File size: 3,671 Bytes
936b397 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | 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
|