File size: 1,728 Bytes
8da2481 | 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 | defimpl FunWithFlags.Actor, for: BitString do
def id(str) do
str
end
end
defmodule PlausibleWeb.Api.ExternalController do
use PlausibleWeb, :controller
require Logger
alias Plausible.Ingestion
def event(conn, _params) do
with {:ok, request, conn} <- Ingestion.Request.build(conn),
_ <- Sentry.Context.set_extra_context(%{request: request}) do
case Ingestion.Event.build_and_buffer(request) do
{:ok, %{dropped: [], buffered: _buffered}} ->
conn
|> put_status(202)
|> text("ok")
{:ok, %{dropped: dropped, buffered: _}} ->
first_invalid_changeset = find_first_invalid_changeset(dropped)
if first_invalid_changeset do
conn
|> put_resp_header("x-plausible-dropped", "#{Enum.count(dropped)}")
|> put_status(400)
|> json(%{
errors: Plausible.ChangesetHelpers.traverse_errors(first_invalid_changeset)
})
else
conn
|> put_resp_header("x-plausible-dropped", "#{Enum.count(dropped)}")
|> put_status(202)
|> text("ok")
end
end
else
{:error, %Ecto.Changeset{} = changeset} ->
conn
|> put_status(400)
|> json(%{errors: Plausible.ChangesetHelpers.traverse_errors(changeset)})
end
end
def error(conn, _params) do
Sentry.capture_message("JS snippet error")
send_resp(conn, 200, "")
end
defp find_first_invalid_changeset(dropped) do
Enum.find_value(dropped, nil, fn dropped_event ->
case dropped_event.drop_reason do
{:error, %Ecto.Changeset{} = changeset} -> changeset
_ -> false
end
end)
end
end
|