-- PushToken — Expo-Push-Tokens pro User-Device. -- -- Ein User kann mehrere Geräte (iPhone + Android-Tablet etc.) haben, jedes mit eigenem -- ExponentPushToken[xxx]. Token ist unique (kommt von Expo, nicht von uns). -- -- Genutzt von: -- - POST /api/users/me/push-token (Client registriert Token nach permission grant) -- - DELETE /api/users/me/push-token (Client deregistriert bei Logout/permission revoke) -- - server/services/push.ts sendChatPush() (Backend triggert Push nach Chat-Message) -- -- DSGVO: bei Profile-Delete (Art-17) kaskadiert via FK ON DELETE CASCADE → alle Tokens gelöscht. CREATE TABLE IF NOT EXISTS "rebreak"."push_tokens" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "user_id" UUID NOT NULL, "token" TEXT NOT NULL, "platform" TEXT NOT NULL, -- 'ios' | 'android' "device_id" TEXT, -- optional: Capacitor/Expo persistent UUID "enabled" BOOLEAN NOT NULL DEFAULT true, "created_at" TIMESTAMPTZ NOT NULL DEFAULT now(), "updated_at" TIMESTAMPTZ NOT NULL DEFAULT now(), "last_used_at" TIMESTAMPTZ, CONSTRAINT "push_tokens_pkey" PRIMARY KEY ("id"), CONSTRAINT "push_tokens_token_key" UNIQUE ("token"), CONSTRAINT "push_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "rebreak"."profiles"("id") ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX IF NOT EXISTS "push_tokens_user_id_idx" ON "rebreak"."push_tokens"("user_id"); CREATE INDEX IF NOT EXISTS "push_tokens_enabled_idx" ON "rebreak"."push_tokens"("enabled") WHERE "enabled" = true; -- ─── Profile.chat_push_enabled ───────────────────────────────────────────── -- Per-User Opt-out für Chat-Push (Default ON). Granularer als Token-Enabled -- weil hier User-Präferenz, nicht Device-State. Beide werden im Send-Pfad -- berücksichtigt (UND-Verknüpfung). ALTER TABLE "rebreak"."profiles" ADD COLUMN IF NOT EXISTS "chat_push_enabled" BOOLEAN NOT NULL DEFAULT true;