Skip to content

Commit

Permalink
Accept custom props in expected format
Browse files Browse the repository at this point in the history
  • Loading branch information
ukutaht committed Nov 10, 2021
1 parent 0fb38f1 commit 7a02aae
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 9 deletions.
17 changes: 15 additions & 2 deletions lib/plausible_web/controllers/api/external_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,7 @@ defmodule PlausibleWeb.Api.ExternalController do
defp parse_meta(params) do
raw_meta = params["m"] || params["meta"] || params["p"] || params["props"]

with raw_json when not is_nil(raw_meta) <- raw_meta,
{:ok, parsed_json} when is_map(parsed_json) <- Jason.decode(raw_json),
with {:ok, parsed_json} <- decode_raw_props(raw_meta),
:ok <- validate_custom_props(parsed_json) do
parsed_json
else
Expand All @@ -175,6 +174,20 @@ defmodule PlausibleWeb.Api.ExternalController do
if is_valid, do: :ok, else: :invalid_props
end

defp decode_raw_props(props) when is_map(props), do: {:ok, props}

defp decode_raw_props(raw_json) when is_binary(raw_json) do
case Jason.decode(raw_json) do
{:ok, parsed_props} when is_map(parsed_props) ->
{:ok, parsed_props}

_ ->
:not_a_map
end
end

defp decode_raw_props(_), do: :bad_format

defp get_domains(params, uri) do
if params["domain"] do
String.split(params["domain"], ",")
Expand Down
30 changes: 23 additions & 7 deletions test/plausible_web/controllers/api/external_controller_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -428,11 +428,10 @@ defmodule PlausibleWeb.Api.ExternalControllerTest do
name: "Signup",
url: "http://gigride.live/",
domain: "custom-prop-test.com",
props:
Jason.encode!(%{
bool_test: true,
number_test: 12
})
props: %{
bool_test: true,
number_test: 12
}
}

conn
Expand Down Expand Up @@ -461,19 +460,36 @@ defmodule PlausibleWeb.Api.ExternalControllerTest do
assert Map.get(event, :"meta.value") == []
end

test "ignores custom prop with array value", %{conn: conn} do
test "can send props stringified", %{conn: conn} do
params = %{
name: "Signup",
url: "http://gigride.live/",
domain: "custom-prop-test-3.com",
props: Jason.encode!(%{number_test: 12})
}

conn
|> post("/api/event", params)

event = get_event("custom-prop-test-3.com")

assert Map.get(event, :"meta.key") == ["number_test"]
assert Map.get(event, :"meta.value") == ["12"]
end

test "ignores custom prop with array value", %{conn: conn} do
params = %{
name: "Signup",
url: "http://gigride.live/",
domain: "custom-prop-test-4.com",
props: Jason.encode!(%{wat: ["some-thing"]})
}

conn = post(conn, "/api/event", params)

assert conn.status == 202

event = get_event("custom-prop-test-3.com")
event = get_event("custom-prop-test-4.com")

assert Map.get(event, :"meta.key") == []
assert Map.get(event, :"meta.value") == []
Expand Down

0 comments on commit 7a02aae

Please sign in to comment.