-- Device-Account-Binding: Bypass-Schutz für Pro/Legend-User. -- -- Wenn ein Pro/Legend-User ein Gerät registriert, wird dieses Gerät an seinen -- Account gebunden. Ein Ausloggen + Einloggen mit einem anderen Account auf -- demselben Gerät wird mit 409 DEVICE_LOCKED blockiert. -- -- Neue Felder auf user_devices: -- bound_to_plan — Plan des Users ZUM ZEITPUNKT der Bindung. Binding gilt -- nur wenn bound_to_plan IN ('pro','legend','standard','premium'). -- Free-Devices binden NICHT. Der Lock bleibt bestehen -- auch wenn der Original-User danach auf Free downgradet -- (Lock aufheben = Bypass-Vektor öffnen). -- release_requested_at — wann der Original-User "Gerät freigeben" angeklickt -- hat. release_requested_at + 24h = automatische Freigabe -- (24h Cooldown schützt gegen impulsive Freigabe im Drang-Window). -- lock_notified_at — Rate-Limit: max. 1 Mail pro Device pro 6h wenn jemand -- auf einem gebundenen Gerät versucht sich einzuloggen. -- -- DSGVO-Hinweis (Hans-Müller): wenn der Original-User sein Konto löscht -- (Art. 17 Recht auf Löschung), werden alle seine user_devices-Rows kaskadiert -- gelöscht → alle Device-Locks automatisch released. Dies ist korrekt, da die -- Verarbeitungsgrundlage (Nutzervertrag) erlischt. Keine gesonderte Cascade-Logik -- nötig — DB-ON DELETE CASCADE reicht. ALTER TABLE "rebreak"."user_devices" ADD COLUMN IF NOT EXISTS "bound_to_plan" TEXT NULL, ADD COLUMN IF NOT EXISTS "release_requested_at" TIMESTAMPTZ NULL, ADD COLUMN IF NOT EXISTS "lock_notified_at" TIMESTAMPTZ NULL; -- Index: schnelle Suche "ist deviceId schon an einen anderen User gebunden?" CREATE INDEX IF NOT EXISTS "user_devices_device_id_idx" ON "rebreak"."user_devices" ("device_id");