Feat(ip-infos): show each IP's time zone, derived from its own coordinates

Every geo route now returns an IANA zone name, added on the way out by the
withTimeZone() middleware rather than by any handler — including the private
API pass-through, which needs no new upstream field.

The zone is derived from the latitude/longitude the response itself carries,
not from a second lookup of the same IP. Asking another database would
eventually place the address elsewhere and print a zone that contradicts the
city next to it. Coordinate accuracy measured against MaxMind's own time_zone
over 30k sampled addresses: 99.80% exact, 99.98% correct offset; the rest are
neighbouring zones across a land border that share an offset anyway.

Only the name ships. Geo routes sit behind a 24h edge cache, so a cached UTC
offset would be an hour wrong for everyone between a DST switch and the
entry's expiry — the frontend renders the offset per view instead, reusing
the formatter the analytics path already had.

The field travels the full report path: event payload, builder, schema (as a
typed timeZone kind, not a free string), the /r/:id table, the Markdown
export and the JSON download.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
jason5ng32andClaude Opus 5 committed 2026-08-12 17:44:18 +08:00
1 parent 6c679b20a1
commit 83bdd54674
23 files changed
+468 -25

No files matched your search

+1
View File
@@ -22,6 +22,7 @@
"@iconify/vue": "^5.0.1",
"@khmyznikov/pwa-install": "^0.6.4",
"@lucide/vue": "^1.28.0",
"@photostructure/tz-lookup": "^11.6.1",
"@sentry/node": "^10.69.0",
"@sentry/vue": "^10.69.0",
"@tanstack/vue-table": "^9.0.0",