/** * seed-country-blocklists.ts * * Befüllt die `curated_domains`-Tabelle mit Initial-Curation für DE/FR/GB/TN. * Wird einmalig auf dem Server ausgeführt — idempotent (upsert). * * Ausführen (nach pnpm build oder direkt mit tsx): * DATABASE_URL=... tsx scripts/seed-country-blocklists.ts * * HINWEIS: Diese Liste ist ein Platzhalter-Skelett. * Die echten Top-25-50 Domains pro Land müssen vom Rebreak-Team recherchiert * und hier eingetragen werden (Quellen: GambleAware UK, Bundeszentrale für * gesundheitliche Aufklärung, ANJ Frankreich, öffentliche Sperrlisten). * * Admin-ID: UUID des Admin-Profils das die Domains "suggested" hat. * Setze SEED_ADMIN_ID als Env-Variable oder trage hier einen Wert ein. */ import { PrismaClient } from "../server/generated/prisma"; const db = new PrismaClient(); // ─── Konfiguration ───────────────────────────────────────────────────────────── // Admin-UUID der als "suggestedByUserId" gesetzt wird. // Verwende den Rebreak-Admin-User aus admin_users-Tabelle. const SEED_ADMIN_ID = process.env.SEED_ADMIN_ID ?? null; // ─── Country-Listen (INITIAL CURATION — von Rebreak-Team zu befüllen) ───────── // Format: { domain: string, country: "DE" | "FR" | "GB" | "TN" }[] // Alle Einträge werden mit status="approved" gespeichert (direkte Admin-Curation, // kein Review-Flow nötig für Initial-Seed). // // Diese Liste ergänzt die statische gambling-domains.json. Domains die bereits // dort vorhanden sind, können hier trotzdem eingetragen werden — die // webcontent-domains.get.ts dedupliziert automatisch. const INITIAL_DOMAINS: { domain: string; country: string }[] = [ // ── DE — Top Gambling-Domains für Deutschland ───────────────────────────── // TODO: Rebreak-Team ergänzt hier 25-50 Domains // Quellen: https://www.bzga.de, https://www.gluecksspielsucht.de, // öffentliche GLÜSTV-Sperrlisten // { domain: "beispielcasino.de", country: "DE" }, // ── FR — Top Gambling-Domains für Frankreich ───────────────────────────── // TODO: Rebreak-Team ergänzt hier 25-50 Domains // Quellen: https://www.anj.fr (Autorité nationale des jeux), // Liste noire ANJ // { domain: "exempleecasino.fr", country: "FR" }, // ── GB — Top Gambling-Domains für Grossbritannien ──────────────────────── // TODO: Rebreak-Team ergänzt hier 25-50 Domains // Quellen: https://www.gambleaware.org, https://www.gamblingcommission.gov.uk // GamStop-Mitgliederliste (https://www.gamstop.co.uk) // { domain: "examplecasino.co.uk", country: "GB" }, // ── TN — Top Gambling-Domains für Tunesien ─────────────────────────────── // TODO: Rebreak-Team ergänzt hier verfügbare Domains // Quellen: eigene Recherche + Community-Feedback // { domain: "مثال-كازينو.tn", country: "TN" }, ]; // ─── Seed-Logik ──────────────────────────────────────────────────────────────── async function main() { if (INITIAL_DOMAINS.length === 0) { console.log( "[seed] Keine Domains definiert — Skelett-Script. Bitte INITIAL_DOMAINS befüllen.", ); return; } console.log(`[seed] Starte mit ${INITIAL_DOMAINS.length} Domains...`); let created = 0; let skipped = 0; for (const { domain, country } of INITIAL_DOMAINS) { try { const result = await db.curatedDomain.upsert({ where: { country_domain: { country, domain } }, create: { domain, country, status: "approved", suggestedByUserId: SEED_ADMIN_ID, reviewedAt: new Date(), }, update: { // Bestehende Einträge: nur Status auf approved upgraden falls noch suggested status: "approved", reviewedAt: new Date(), }, select: { id: true, domain: true, country: true, status: true }, }); console.log(` [${result.country}] ${result.domain} → ${result.status}`); created++; } catch (err) { console.error(` FEHLER für ${domain} (${country}):`, err); skipped++; } } console.log(`\n[seed] Fertig: ${created} verarbeitet, ${skipped} Fehler.`); } main() .catch((err) => { console.error("[seed] Fataler Fehler:", err); process.exit(1); }) .finally(() => db.$disconnect());