61 lines
1.7 KiB
Elixir
61 lines
1.7 KiB
Elixir
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
|