replace analytics double-count prevention with buffer supersede
All checks were successful
deploy / deploy (push) Successful in 1m13s

The Plug records a pageview with a known ID (plug_ref) into the ETS
buffer. When JS connects, the LiveView hook supersedes that event by
ID and records its own with full data (screen_size from connect params).
If JS never connects, the Plug's event flushes normally after 10s.

Also fixes: admin browsing no longer leaks product_view events — the
Plug now sets no analytics session data for admins, so all downstream
visitor_hash guards naturally filter them out.

Replaces the previous time-based skip logic which was brittle and
race-prone. The supersede approach is deterministic and handles both
the ETS buffer and already-flushed DB cases.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-02-23 14:48:50 +00:00
parent 7ceee9c814
commit 162a5bfe9a
6 changed files with 231 additions and 68 deletions

View File

@@ -42,8 +42,6 @@ defmodule BerrypodWeb.Plugs.AnalyticsTest do
:timer.sleep(50)
count_after = Repo.aggregate(Event, :count)
# POST to /checkout shouldn't create a pageview event via the plug
# (it may fail with a redirect, but the plug should have skipped)
assert count_after == count_before
end
@@ -71,6 +69,17 @@ defmodule BerrypodWeb.Plugs.AnalyticsTest do
assert get_session(conn, "analytics_browser") == "Firefox"
end
test "stores plug_ref in session for buffer supersede", %{conn: conn} do
conn =
conn
|> put_req_header("user-agent", "Mozilla/5.0 Chrome/120.0")
|> get(~p"/")
plug_ref = get_session(conn, "analytics_plug_ref")
assert is_binary(plug_ref)
assert String.length(plug_ref) == 36
end
test "extracts referrer", %{conn: conn} do
conn
|> put_req_header("user-agent", "Mozilla/5.0 Chrome/120.0")