"""Migration 2026-07-25: Tabelle user_activity_days anlegen (MAU/DAU). Der Monitor legt die Tabelle beim Start selbst an und schreibt je Nutzer und Kalendertag einen Eintrag (auth.get_current_user). Die Portal-Staging-Umgebung nutzt eine EIGENE Datenbank ohne laufenden Monitor, deshalb dieses Skript. Idempotent (CREATE TABLE IF NOT EXISTS), es werden keine Daten eingefügt. Ausführung: DB_PATH=/home/claude-dev/AegisSight-Monitor-staging/data/osint.db python3 migrations/2026-07-25_user_activity.py DB_PATH=/home/claude-dev/osint-data/osint.db python3 migrations/2026-07-25_user_activity.py """ import os import sqlite3 import sys def main(db_path: str) -> int: if not os.path.exists(db_path): print(f"FEHLER: DB nicht gefunden: {db_path}", file=sys.stderr) return 1 conn = sqlite3.connect(db_path, timeout=60) conn.execute("PRAGMA busy_timeout = 60000") conn.execute("PRAGMA journal_mode = WAL") print(f"Migration auf {db_path}") conn.execute(""" CREATE TABLE IF NOT EXISTS user_activity_days ( user_id INTEGER NOT NULL, day TEXT NOT NULL, tenant_id INTEGER, PRIMARY KEY (user_id, day) ) """) print(" + user_activity_days angelegt (oder vorhanden)") conn.commit() conn.close() print("Migration abgeschlossen.") return 0 if __name__ == "__main__": db_path = os.environ.get("DB_PATH", "/home/claude-dev/osint-data/osint.db") sys.exit(main(db_path))