import { db } from '../config/database.js'; import { events, galleryImages } from '../db/schema.js'; import fs from 'fs'; import path from 'path'; import sharp from 'sharp'; // Old events data const oldEvents = [ { image: "/images/events/event_karaoke.jpg", title: "Karaoke", date: "2025-12-31", // Set as ongoing event description: `Bei uns gibt es Karaoke Mi-Sa!!
Seid ihr eine Gruppe und lieber unter euch? ..unseren 2.Stock kannst du auch mieten ;)
Reserviere am besten gleich per Whatsapp 077 232 27 70`, displayOrder: 0, }, { image: "/images/events/event_pub-quiz.jpg", title: "Pub Quiz", date: "2025-12-31", // Set as ongoing event description: `Jeden Freitag findet unser Pub Quiz statt. Gespielt wird tischweise in 3-4 Runden.
Jede Woche gibt es ein anderes Thema. Es geht um Ruhm und Ehre und zusätzlich werden die Sieger der Herzen durch das Publikum gekürt! <3
Auch Einzelpersonen sind herzlich willkommen!
*zum mitmachen minimum 1 Getränk konsumieren oder 5CHF`, displayOrder: 1, }, { image: "/images/events/event_schlager-karaoke.jpeg", title: "Schlager Hüttenzauber Karaoke", date: "2025-11-27", description: `Ab 19:00 Uhr Eintritt ist Frei! Reservieren unter 077 232 27 70`, displayOrder: 2, }, { image: "/images/events/event_advents-kalender.jpeg", title: "Adventskalender", date: "2025-12-20", description: `Jeden Tag neue Überraschungen! Check unsere Social Media Stories!`, displayOrder: 3, }, { image: "/images/events/event_santa_karaoke.jpeg", title: "Santa Karaoke-Party", date: "2025-12-06", description: `🤶🏻🎅🏻Komme als Weihnachts-Mann/-Frau und bekomme einen Shot auf's Haus!🤶🏻🎅🏻`, displayOrder: 4, }, { image: "/images/events/event_ferien.jpeg", title: "Weihnachtsferien", date: "2025-12-21", description: `Wir sind ab 02.01.2026 wieder wie gewohnt für euch da! 🍀.
Für Anfragen WA 077 232 27 70 Antwort innerhalb 48h`, displayOrder: 5, }, { image: "/images/events/event_neujahrs-apero.jpeg", title: "Neujahrs-Apero", date: "2026-01-02", description: `18:00-20:00 Uhr`, displayOrder: 6, }, ]; // Old gallery images const oldGalleryImages = [ { src: "/images/gallery/Gallery7.png", alt: "Gallery 7" }, { src: "/images/gallery/Gallery8.png", alt: "Gallery 8" }, { src: "/images/gallery/Gallery9.png", alt: "Gallery 9" }, { src: "/images/gallery/Gallery6.png", alt: "Gallery 6" }, { src: "/images/gallery/Gallery1.png", alt: "Gallery 1" }, { src: "/images/gallery/Gallery2.png", alt: "Gallery 2" }, { src: "/images/gallery/Gallery3.png", alt: "Gallery 3" }, { src: "/images/gallery/Gallery4.png", alt: "Gallery 4" }, { src: "/images/gallery/Gallery5.png", alt: "Gallery 5" }, ]; async function copyAndConvertImage( sourcePath: string, destDir: string, filename: string ): Promise { const projectRoot = path.join(process.cwd(), '..'); const fullSourcePath = path.join(projectRoot, 'public', sourcePath); // Ensure destination directory exists if (!fs.existsSync(destDir)) { fs.mkdirSync(destDir, { recursive: true }); } const ext = path.extname(filename); const baseName = path.basename(filename, ext); const webpFilename = `${baseName}.webp`; const destPath = path.join(destDir, webpFilename); console.log(`Processing: ${fullSourcePath} -> ${destPath}`); // Check if source exists if (!fs.existsSync(fullSourcePath)) { console.error(`Source file not found: ${fullSourcePath}`); throw new Error(`Source file not found: ${fullSourcePath}`); } // Convert to webp and copy await sharp(fullSourcePath) .rotate() // Auto-rotate based on EXIF .resize({ width: 1600, withoutEnlargement: true }) .webp({ quality: 85 }) .toFile(destPath); return `/images/${path.relative(destDir, destPath).replace(/\\/g, '/')}`; } async function migrateEvents() { console.log('\n=== Migrating Events ===\n'); const dataDir = process.env.GIT_WORKSPACE_DIR || path.join(process.cwd(), 'data'); const eventsImageDir = path.join(dataDir, 'images', 'events'); for (const event of oldEvents) { try { const filename = path.basename(event.image); const newImageUrl = await copyAndConvertImage( event.image, eventsImageDir, filename ); const [newEvent] = await db.insert(events).values({ title: event.title, date: event.date, description: event.description, imageUrl: newImageUrl, displayOrder: event.displayOrder, isPublished: true, }).returning(); console.log(`✓ Migrated event: ${newEvent.title}`); } catch (error) { console.error(`✗ Failed to migrate event "${event.title}":`, error); } } } async function migrateGallery() { console.log('\n=== Migrating Gallery Images ===\n'); const dataDir = process.env.GIT_WORKSPACE_DIR || path.join(process.cwd(), 'data'); const galleryImageDir = path.join(dataDir, 'images', 'gallery'); for (let i = 0; i < oldGalleryImages.length; i++) { const img = oldGalleryImages[i]; try { const filename = path.basename(img.src); const newImageUrl = await copyAndConvertImage( img.src, galleryImageDir, filename ); const [newImage] = await db.insert(galleryImages).values({ imageUrl: newImageUrl, altText: img.alt, displayOrder: i, isPublished: true, }).returning(); console.log(`✓ Migrated gallery image: ${newImage.altText}`); } catch (error) { console.error(`✗ Failed to migrate gallery image "${img.alt}":`, error); } } } async function main() { console.log('Starting migration of old data...\n'); console.log('Working directory:', process.cwd()); console.log('Data directory:', process.env.GIT_WORKSPACE_DIR || path.join(process.cwd(), 'data')); try { await migrateEvents(); await migrateGallery(); console.log('\n✓ Migration completed successfully!'); } catch (error) { console.error('\n✗ Migration failed:', error); process.exit(1); } } main();