chore(release): v1.4.27

v1.4.27 — Mobile capability and maintainer-finding cleanup.

ResponsiveSheet primitive (bottom-sheet on narrow viewports, centred dialog on desktop)
applied to BD, Weight, Glucose, Mood, Activity forms. Maintainer-finding cleanups across
Coach, Insights, Reports, Privacy. GeoLite2 offline geocoding with resilience layer
(graceful fallback when EULA not yet propagated). E2E gap-fill coverage. 450-line
release notes attached to the GitHub Release.
This commit is contained in:
Marc-André Bombeck authored and GitHub committed 2026-05-15 22:59:10 +02:00
1 parent d98e85cd03
commit 4f09c3f862
314 files changed
+26801 -4419

No files matched your search

@@ -0,0 +1,20 @@
-- v1.4.27 B3 — Persist the ASN + carrier on login audit rows.
--
-- The bundled MaxMind GeoLite2-ASN MMDB resolves an autonomous-system
-- number and the organisation string ("Deutsche Telekom AG") at
-- audit-creation time. Both columns are nullable so the schema stays
-- valid for older rows, for private/loopback IPs that skip the
-- lookup entirely, and for offline-miss rows that the resolver could
-- not match.
--
-- asn — INTEGER, the autonomous-system number from the MMDB.
-- carrier — TEXT, the autonomous-system organisation string.
--
-- The `IF NOT EXISTS` guards make the migration idempotent — the
-- demo server may already carry hand-edited columns from a prior
-- partial run, and the same migration must apply cleanly to a fresh
-- database. Same posture as 0058_user_research_mode.
ALTER TABLE "audit_logs"
ADD COLUMN IF NOT EXISTS "asn" INTEGER,
ADD COLUMN IF NOT EXISTS "carrier" TEXT;
+7
View File
@@ -1232,6 +1232,13 @@ model AuditLog {
details String? // JSON string, no sensitive data
ipAddress String? @map("ip_address")
location String? // e.g. "Berlin, DE" — resolved from IP at log time
// v1.4.27 B3 — resolved at audit-creation time from the bundled
// GeoLite2-ASN MMDB. `asn` is the autonomous-system number,
// `carrier` is the organisation string (e.g. "Deutsche Telekom AG").
// Both nullable so older rows, private-IP rows, and offline-miss
// rows stay valid.
asn Int? // autonomous-system number
carrier String? // autonomous-system organisation
createdAt DateTime @default(now()) @map("created_at")
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)