fix: improve database permissions script with enhanced logging and user feedback
- Added detailed logging to track changes and errors in the database permissions script. - Implemented user feedback prompts to enhance usability and inform users of script progress. - Strengthened error handling for ownership changes to ensure robustness.
This commit is contained in:
148
scripts/fix-i18n-direct.js
Normal file
148
scripts/fix-i18n-direct.js
Normal file
@@ -0,0 +1,148 @@
|
||||
#!/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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user