-- Admin Moderation Queue — Phase E -- Erweitert CommunityPost / CommunityReply um Moderation-Felder und legt -- moderation_actions-Audit-Tabelle an. -- -- Reported-Marker: -- isModerated=true → in /api/admin/moderation/queue gelistet -- Dismiss → isModerated=false (Flag clear) -- Delete → content="", isDeleted=true, isModerated bleibt true -- (für audit / spätere Re-Review) -- -- Audit-Trail (DSGVO): -- Jede Aktion (dismiss / delete / ban_user) schreibt einen ModerationAction- -- Eintrag inkl. content-snapshot. Reporter-Info wird nicht persistiert -- (anonymous report-flow per Convention). -- -- Drift-Hinweis: Diese Migration wird via `pnpm prisma migrate deploy` auf -- staging-/prod-DB gefahren. Lokal NICHT ausführen. Falls Drift erkannt wird: -- pnpm prisma migrate resolve --applied 20260509_moderation_queue -- ─── community_posts: Moderation-Felder ────────────────────────────────────── ALTER TABLE "rebreak"."community_posts" ADD COLUMN IF NOT EXISTS "is_deleted" BOOLEAN NOT NULL DEFAULT false, ADD COLUMN IF NOT EXISTS "deleted_at" TIMESTAMP(3), ADD COLUMN IF NOT EXISTS "reported_at" TIMESTAMP(3); CREATE INDEX IF NOT EXISTS "community_posts_is_moderated_reported_at_idx" ON "rebreak"."community_posts" ("is_moderated", "reported_at"); -- ─── community_replies: Moderation-Felder ──────────────────────────────────── ALTER TABLE "rebreak"."community_replies" ADD COLUMN IF NOT EXISTS "is_moderated" BOOLEAN NOT NULL DEFAULT false, ADD COLUMN IF NOT EXISTS "is_deleted" BOOLEAN NOT NULL DEFAULT false, ADD COLUMN IF NOT EXISTS "deleted_at" TIMESTAMP(3), ADD COLUMN IF NOT EXISTS "reported_at" TIMESTAMP(3); CREATE INDEX IF NOT EXISTS "community_replies_is_moderated_reported_at_idx" ON "rebreak"."community_replies" ("is_moderated", "reported_at"); -- ─── moderation_actions: Audit-Log ─────────────────────────────────────────── CREATE TABLE IF NOT EXISTS "rebreak"."moderation_actions" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "target_type" TEXT NOT NULL, "target_id" UUID NOT NULL, "action" TEXT NOT NULL, "admin_user_id" UUID, "content_snapshot" TEXT, "reason" TEXT, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "moderation_actions_pkey" PRIMARY KEY ("id") ); CREATE INDEX IF NOT EXISTS "moderation_actions_target_idx" ON "rebreak"."moderation_actions" ("target_type", "target_id"); CREATE INDEX IF NOT EXISTS "moderation_actions_created_at_idx" ON "rebreak"."moderation_actions" ("created_at");