import multer from 'multer' import fs from 'fs/promises' import path from 'path' // Handle both dev and production paths const getDataPath = (filename) => { const cwd = process.cwd() // In production (.output/server), working dir is .output if (cwd.endsWith('.output')) { return path.join(cwd, '../server/data', filename) } // In development, working dir is project root return path.join(cwd, 'server/data', filename) } // Multer-Konfiguration für PDF-Uploads const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, 'public/documents/') }, filename: (req, file, cb) => { cb(null, 'satzung.pdf') } }) const upload = multer({ storage, fileFilter: (req, file, cb) => { if (file.mimetype === 'application/pdf') { cb(null, true) } else { cb(new Error('Nur PDF-Dateien sind erlaubt'), false) } }, limits: { fileSize: 10 * 1024 * 1024 // 10MB Limit } }) export default defineEventHandler(async (event) => { if (event.method !== 'POST') { throw createError({ statusCode: 405, statusMessage: 'Method Not Allowed' }) } try { // Multer-Middleware für File-Upload await new Promise((resolve, reject) => { upload.single('pdf')(event.node.req, event.node.res, (err) => { if (err) reject(err) else resolve() }) }) const file = event.node.req.file if (!file) { throw createError({ statusCode: 400, statusMessage: 'Keine PDF-Datei hochgeladen' }) } // Für jetzt: Satzungsinhalt als Platzhalter bis PDF-Parsing implementiert ist const htmlContent = `

§ 1 Name und Sitz

Der Verein führt den Namen "Harheimer Tischtennis-Club" und hat seinen Sitz in Harheim.

§ 2 Zweck des Vereins

Der Verein verfolgt ausschließlich und unmittelbar gemeinnützige Zwecke im Sinne des Abschnitts "Steuerbegünstigte Zwecke" der Abgabenordnung.

§ 3 Mitgliedschaft

Mitglied des Vereins kann jede natürliche Person werden, die die Ziele des Vereins unterstützt.

§ 4 Beiträge

Die Mitglieder zahlen Beiträge nach Maßgabe der Beitragsordnung.

§ 5 Vorstand

Der Vorstand besteht aus dem Vorsitzenden, dem stellvertretenden Vorsitzenden, dem Kassenwart und dem Schriftführer.

Hinweis: Dies ist ein Platzhalter-Inhalt. Der vollständige Satzungstext wird automatisch aus der hochgeladenen PDF-Datei extrahiert, sobald das PDF-Parsing implementiert ist.

` // Config aktualisieren const configPath = getDataPath('config.json') const configData = JSON.parse(await fs.readFile(configPath, 'utf-8')) configData.seiten.satzung = { pdfUrl: '/documents/satzung.pdf', content: htmlContent } await fs.writeFile(configPath, JSON.stringify(configData, null, 2)) return { success: true, message: 'Satzung erfolgreich hochgeladen und verarbeitet', pdfUrl: '/documents/satzung.pdf' } } catch (error) { console.error('PDF Upload Error:', error) throw createError({ statusCode: 500, statusMessage: error.message || 'Fehler beim Verarbeiten der PDF-Datei' }) } }) // TODO: PDF-Parsing-Funktion später implementieren // function convertTextToHtml(text) { // // Einfache Text-zu-HTML-Konvertierung // let html = text // .replace(/\n\n+/g, '

') // Absätze // .replace(/\n/g, '
') // Zeilenumbrüche // .replace(/^(.+)$/gm, '

$1

') // Alle Zeilen in Paragraphen // // // Überschriften erkennen (einfache Heuristik) // html = html.replace(/

(§\s*\d+.*?)<\/p>/g, '

$1

') // html = html.replace(/

(\d+\.\s+.*?)<\/p>/g, '

$1

') // // return `

Satzung

${html}` // }