Files
harheimertc/server/api/cms/satzung-upload.post.js
2025-10-22 14:22:25 +02:00

127 lines
3.8 KiB
JavaScript

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 = `
<h2>§ 1 Name und Sitz</h2>
<p>Der Verein führt den Namen "Harheimer Tischtennis-Club" und hat seinen Sitz in Harheim.</p>
<h2>§ 2 Zweck des Vereins</h2>
<p>Der Verein verfolgt ausschließlich und unmittelbar gemeinnützige Zwecke im Sinne des Abschnitts "Steuerbegünstigte Zwecke" der Abgabenordnung.</p>
<h2>§ 3 Mitgliedschaft</h2>
<p>Mitglied des Vereins kann jede natürliche Person werden, die die Ziele des Vereins unterstützt.</p>
<h2>§ 4 Beiträge</h2>
<p>Die Mitglieder zahlen Beiträge nach Maßgabe der Beitragsordnung.</p>
<h2>§ 5 Vorstand</h2>
<p>Der Vorstand besteht aus dem Vorsitzenden, dem stellvertretenden Vorsitzenden, dem Kassenwart und dem Schriftführer.</p>
<p><em>Hinweis: Dies ist ein Platzhalter-Inhalt. Der vollständige Satzungstext wird automatisch aus der hochgeladenen PDF-Datei extrahiert, sobald das PDF-Parsing implementiert ist.</em></p>
`
// 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, '</p><p>') // Absätze
// .replace(/\n/g, '<br>') // Zeilenumbrüche
// .replace(/^(.+)$/gm, '<p>$1</p>') // Alle Zeilen in Paragraphen
//
// // Überschriften erkennen (einfache Heuristik)
// html = html.replace(/<p>(§\s*\d+.*?)<\/p>/g, '<h3>$1</h3>')
// html = html.replace(/<p>(\d+\.\s+.*?)<\/p>/g, '<h4>$1</h4>')
//
// return `<h2>Satzung</h2>${html}`
// }