Skip to content

Commit 6f7c202

Browse files
committed
Add endpoints for managing custom props in Sites API
1 parent 897d3c5 commit 6f7c202

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

extra/lib/plausible_web/controllers/api/external_sites_controller.ex

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule PlausibleWeb.Api.ExternalSitesController do
88
alias Plausible.Sites
99
alias Plausible.Goal
1010
alias Plausible.Goals
11+
alias Plausible.Props
1112
alias Plausible.Teams
1213
alias PlausibleWeb.Api.Helpers, as: H
1314

@@ -445,6 +446,68 @@ defmodule PlausibleWeb.Api.ExternalSitesController do
445446
end
446447
end
447448

449+
def custom_props_index(conn, params) do
450+
user = conn.assigns.current_user
451+
team = conn.assigns.current_team
452+
453+
with {:ok, site_id} <- expect_param_key(params, "site_id"),
454+
{:ok, site} <- find_site(user, team, site_id, [:owner, :admin, :editor]) do
455+
properties =
456+
(site.allowed_event_props || [])
457+
|> Enum.map(fn prop -> %{property: prop} end)
458+
459+
json(conn, %{custom_properties: properties})
460+
else
461+
{:error, :site_not_found} ->
462+
H.not_found(conn, "Site could not be found")
463+
464+
{:missing, "site_id"} ->
465+
H.bad_request(conn, "Parameter `site_id` is required to list custom properties")
466+
end
467+
end
468+
469+
def add_custom_prop(conn, params) do
470+
user = conn.assigns.current_user
471+
team = conn.assigns.current_team
472+
473+
with {:ok, site_id} <- expect_param_key(params, "site_id"),
474+
{:ok, property} <- expect_param_key(params, "property"),
475+
{:ok, site} <- find_site(user, team, site_id, [:owner, :admin, :editor]),
476+
{:ok, _} <- Props.allow(site, property) do
477+
json(conn, %{"created" => true})
478+
else
479+
{:error, :site_not_found} ->
480+
H.not_found(conn, "Site could not be found")
481+
482+
{:missing, param} ->
483+
H.bad_request(conn, "Parameter `#{param}` is required to create a custom property")
484+
485+
e ->
486+
H.bad_request(conn, "Something went wrong: #{inspect(e)}")
487+
end
488+
end
489+
490+
def delete_custom_prop(conn, params) do
491+
user = conn.assigns.current_user
492+
team = conn.assigns.current_team
493+
494+
with {:ok, site_id} <- expect_param_key(params, "site_id"),
495+
{:ok, property} <- expect_param_key(params, "property"),
496+
{:ok, site} <- find_site(user, team, site_id, [:owner, :admin, :editor]),
497+
{:ok, _} <- Props.disallow(site, property) do
498+
json(conn, %{"deleted" => true})
499+
else
500+
{:error, :site_not_found} ->
501+
H.not_found(conn, "Site could not be found")
502+
503+
{:missing, param} ->
504+
H.bad_request(conn, "Parameter `#{param}` is required to delete a custom property")
505+
506+
e ->
507+
H.bad_request(conn, "Something went wrong: #{inspect(e)}")
508+
end
509+
end
510+
448511
defp pagination_meta(meta) do
449512
%{
450513
after: meta.after,

lib/plausible_web/router.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ defmodule PlausibleWeb.Router do
337337

338338
scope assigns: %{api_context: :site} do
339339
get "/goals", ExternalSitesController, :goals_index
340+
get "/custom-props", ExternalSitesController, :custom_props_index
340341
get "/guests", ExternalSitesController, :guests_index
341342
get "/:site_id", ExternalSitesController, :get_site
342343
end
@@ -353,6 +354,9 @@ defmodule PlausibleWeb.Router do
353354
put "/goals", ExternalSitesController, :find_or_create_goal
354355
delete "/goals/:goal_id", ExternalSitesController, :delete_goal
355356

357+
put "/custom-props", ExternalSitesController, :add_custom_prop
358+
delete "/custom-props/*property", ExternalSitesController, :delete_custom_prop
359+
356360
put "/guests", ExternalSitesController, :find_or_create_guest
357361
delete "/guests/:email", ExternalSitesController, :delete_guest
358362

0 commit comments

Comments
 (0)