require('dotenv').config();
const { db } = require('../src/database/db');
async function fixProductionIssues() {
console.log('Fixing production database issues...\n');
try {
// 1. Check and fix email_templates structure
console.log('1. Checking email_templates structure:');
const emailColumns = await db('email_templates').columnInfo();
console.log('Current columns:', Object.keys(emailColumns));
// Check if we need to add basic columns back
const hasSubject = 'subject' in emailColumns;
const hasSubjectEn = 'subject_en' in emailColumns;
if (hasSubjectEn && !hasSubject) {
console.log('Adding basic columns back to email_templates...');
await db.schema.alterTable('email_templates', (table) => {
table.string('subject');
table.text('body_html');
table.text('body_text');
});
// Copy values from _en columns
await db('email_templates').update({
subject: db.raw('subject_en'),
body_html: db.raw('body_html_en'),
body_text: db.raw('body_text_en')
});
console.log('Basic columns added successfully');
}
// 2. Ensure default templates exist
console.log('\n2. Checking email templates:');
const templateCount = await db('email_templates').count('* as count');
console.log('Template count:', templateCount[0].count);
if (templateCount[0].count === 0) {
console.log('No templates found, inserting defaults...');
const defaultTemplates = [
{
template_key: 'gallery_created',
subject: 'Your Photo Gallery is Ready!',
body_html: '
Gallery Created Successfully
...',
body_text: 'Gallery Created Successfully...',
variables: JSON.stringify(['host_name', 'event_name', 'event_date', 'gallery_link', 'gallery_password', 'expiry_date'])
},
{
template_key: 'expiration_warning',
subject: 'Your Photo Gallery Expires Soon',
body_html: 'Gallery Expiring Soon
...',
body_text: 'Gallery Expiring Soon...',
variables: JSON.stringify(['host_name', 'event_name', 'days_remaining', 'gallery_link'])
},
{
template_key: 'gallery_expired',
subject: 'Your Photo Gallery Has Expired',
body_html: 'Gallery Expired
...',
body_text: 'Gallery Expired...',
variables: JSON.stringify(['host_name', 'event_name'])
},
{
template_key: 'archive_complete',
subject: 'Gallery Archive Complete',
body_html: 'Archive Complete
...',
body_text: 'Archive Complete...',
variables: JSON.stringify(['host_name', 'event_name', 'archive_size'])
}
];
for (const template of defaultTemplates) {
// Add language columns if they exist
if (hasSubjectEn) {
template.subject_en = template.subject;
template.body_html_en = template.body_html;
template.body_text_en = template.body_text;
template.subject_de = template.subject;
template.body_html_de = template.body_html;
template.body_text_de = template.body_text;
}
await db('email_templates').insert(template);
}
console.log('Default templates inserted');
}
// 3. Check activity_logs structure
console.log('\n3. Checking activity_logs structure:');
const activityColumns = await db('activity_logs').columnInfo();
console.log('Columns:', Object.keys(activityColumns));
// Check if read_at exists
if (!('read_at' in activityColumns)) {
console.log('Adding read_at column to activity_logs...');
await db.schema.alterTable('activity_logs', (table) => {
table.datetime('read_at').nullable();
});
console.log('read_at column added');
}
// 4. Check and add CMS pages
console.log('\n4. Checking CMS pages:');
const cmsColumns = await db('cms_pages').columnInfo();
console.log('CMS columns:', Object.keys(cmsColumns));
const impressum = await db('cms_pages').where('slug', 'impressum').first();
const datenschutz = await db('cms_pages').where('slug', 'datenschutz').first();
if (!impressum) {
console.log('Adding Impressum page...');
await db('cms_pages').insert({
slug: 'impressum',
title_en: 'Legal Notice',
title_de: 'Impressum',
content_en: 'Legal Notice
Your legal information here...
',
content_de: 'Impressum
Ihre rechtlichen Informationen hier...
',
updated_at: new Date()
});
}
if (!datenschutz) {
console.log('Adding Datenschutz page...');
await db('cms_pages').insert({
slug: 'datenschutz',
title_en: 'Privacy Policy',
title_de: 'Datenschutzerklärung',
content_en: 'Privacy Policy
Your privacy policy here...
',
content_de: 'Datenschutzerklärung
Ihre Datenschutzerklärung hier...
',
updated_at: new Date()
});
}
console.log('\n✅ All fixes applied successfully!');
} catch (error) {
console.error('Error fixing issues:', error);
console.error('Stack:', error.stack);
} finally {
await db.destroy();
process.exit(0);
}
}
fixProductionIssues();