-- Migration: Erstelle page_views Tabelle für Web-Analytics -- Datum: 2026-04-17 -- Zweck: Protokollierung von Seitenaufrufen, Verweildauer, Browser, Gerät, anonymisierte IP CREATE TABLE IF NOT EXISTS page_views ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), path text NOT NULL, timestamp timestamptz NOT NULL DEFAULT now(), ip_anon text, -- IPv4: x.x.x.0 (DSGVO-anonymisiert) device_type text CHECK (device_type IN ('desktop','tablet','mobile')), browser text, -- Chrome/Firefox/Safari/Edge/Opera/Other os text, -- Windows/macOS/iOS/Android/Linux/Other referrer text, session_id text NOT NULL, -- UUID aus sessionStorage duration_ms int, -- Verweildauer in Millisekunden is_bot boolean NOT NULL DEFAULT false ); -- Indizes für häufige Analytics-Abfragen CREATE INDEX IF NOT EXISTS idx_pv_timestamp ON page_views (timestamp DESC); CREATE INDEX IF NOT EXISTS idx_pv_path ON page_views (path); CREATE INDEX IF NOT EXISTS idx_pv_session ON page_views (session_id); CREATE INDEX IF NOT EXISTS idx_pv_is_bot ON page_views (is_bot) WHERE is_bot = false; CREATE INDEX IF NOT EXISTS idx_pv_path_date ON page_views (path, timestamp DESC) WHERE is_bot = false; -- RLS: Nur Service-Role kann schreiben, Reads später für Admin ALTER TABLE page_views ENABLE ROW LEVEL SECURITY; CREATE POLICY "Service-Role Vollzugriff" ON page_views USING (true) WITH CHECK (true); -- Automatisches Cleanup nach 13 Monaten (DSGVO-Datensparsamkeit) -- Kann via Supabase scheduled function oder pg_cron ausgelöst werden -- HINWEIS: Diesen Query regelmäßig per Cron Job aufrufen: -- DELETE FROM page_views WHERE timestamp < now() - interval '13 months';