#!/usr/bin/env node // Direkter Fix für i18n-Daten in SQLite // Arbeitet direkt mit der Datenbank, umgeht Prisma (da es die Daten nicht lesen kann) const fs = require('fs'); const path = require('path'); const { execSync } = require('child_process'); const DB_PATH = process.env.DATABASE_URL?.replace('file:', '') || '/app/data/prod.db'; if (!fs.existsSync(DB_PATH)) { console.error(`❌ Datenbank nicht gefunden: ${DB_PATH}`); process.exit(1); } console.log(`🔧 Fixe i18n-Daten in: ${DB_PATH}`); // SQLite-Befehle zum Fixen const sqlCommands = ` -- Backup erstellen .backup ${DB_PATH}.backup -- Temporäre Tabellen für Genres BEGIN TRANSACTION; -- Prüfe und fixe Genre.name (wenn String statt JSON) UPDATE Genre SET name = json_object('de', name, 'en', name) WHERE typeof(name) = 'text' AND name NOT LIKE '{%'; -- Prüfe und fixe Genre.subtitle UPDATE Genre SET subtitle = json_object('de', subtitle, 'en', subtitle) WHERE subtitle IS NOT NULL AND typeof(subtitle) = 'text' AND subtitle NOT LIKE '{%'; -- Prüfe und fixe Special.name UPDATE Special SET name = json_object('de', name, 'en', name) WHERE typeof(name) = 'text' AND name NOT LIKE '{%'; -- Prüfe und fixe Special.subtitle UPDATE Special SET subtitle = json_object('de', subtitle, 'en', subtitle) WHERE subtitle IS NOT NULL AND typeof(subtitle) = 'text' AND subtitle NOT LIKE '{%'; -- Prüfe und fixe News.title UPDATE News SET title = json_object('de', title, 'en', title) WHERE typeof(title) = 'text' AND title NOT LIKE '{%'; -- Prüfe und fixe News.content UPDATE News SET content = json_object('de', content, 'en', content) WHERE typeof(content) = 'text' AND content NOT LIKE '{%'; COMMIT; -- Zeige Statistiken SELECT 'Genres gefixt:', COUNT(*) FROM Genre WHERE typeof(name) = 'text'; SELECT 'Specials gefixt:', COUNT(*) FROM Special WHERE typeof(name) = 'text'; SELECT 'News gefixt:', COUNT(*) FROM News WHERE typeof(title) = 'text'; `; // Führe SQL-Befehle aus try { console.log('📝 Führe SQL-Updates aus...'); // Installiere sqlite3 falls nicht vorhanden (im Container sollte es nicht da sein) // Wir verwenden stattdessen einen Node.js-Ansatz // Einfacher: Nutze Prisma's direkten DB-Zugriff const Database = require('better-sqlite3'); const db = new Database(DB_PATH); // Prüfe Schema console.log('📊 Prüfe Datenbank-Schema...'); const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table'").all(); console.log(` Gefundene Tabellen: ${tables.map(t => t.name).join(', ')}`); // Fix Genre.name console.log('🔧 Fixe Genre.name...'); const genreResult = db.prepare(` UPDATE Genre SET name = json_object('de', name, 'en', name) WHERE typeof(name) = 'text' AND name NOT LIKE '{%' `).run(); console.log(` ✅ ${genreResult.changes} Genres aktualisiert`); // Fix Genre.subtitle const genreSubtitleResult = db.prepare(` UPDATE Genre SET subtitle = json_object('de', subtitle, 'en', subtitle) WHERE subtitle IS NOT NULL AND typeof(subtitle) = 'text' AND subtitle NOT LIKE '{%' `).run(); console.log(` ✅ ${genreSubtitleResult.changes} Genre-Subtitles aktualisiert`); // Fix Special.name console.log('🔧 Fixe Special.name...'); const specialResult = db.prepare(` UPDATE Special SET name = json_object('de', name, 'en', name) WHERE typeof(name) = 'text' AND name NOT LIKE '{%' `).run(); console.log(` ✅ ${specialResult.changes} Specials aktualisiert`); // Fix Special.subtitle const specialSubtitleResult = db.prepare(` UPDATE Special SET subtitle = json_object('de', subtitle, 'en', subtitle) WHERE subtitle IS NOT NULL AND typeof(subtitle) = 'text' AND subtitle NOT LIKE '{%' `).run(); console.log(` ✅ ${specialSubtitleResult.changes} Special-Subtitles aktualisiert`); // Fix News.title console.log('🔧 Fixe News.title...'); const newsTitleResult = db.prepare(` UPDATE News SET title = json_object('de', title, 'en', title) WHERE typeof(title) = 'text' AND title NOT LIKE '{%' `).run(); console.log(` ✅ ${newsTitleResult.changes} News-Titles aktualisiert`); // Fix News.content const newsContentResult = db.prepare(` UPDATE News SET content = json_object('de', content, 'en', content) WHERE typeof(content) = 'text' AND content NOT LIKE '{%' `).run(); console.log(` ✅ ${newsContentResult.changes} News-Contents aktualisiert`); db.close(); console.log('✅ Alle i18n-Daten wurden gefixt!'); console.log('🔄 Bitte starte den Container neu: docker compose restart hoerdle'); } catch (error) { console.error('❌ Fehler:', error.message); if (error.message.includes('better-sqlite3')) { console.error('\n💡 better-sqlite3 ist nicht installiert. Verwende stattdessen:'); console.error(' docker exec hoerdle sh -c "cd /app && node -e \\"'); console.error(' const fs=require(\\"fs\\");'); console.error(' const {PrismaClient}=require(\\"@prisma/client\\");'); console.error(' // ... alternativer Ansatz'); } process.exit(1); }