Files
harheimertc/server/api/cms/upload-spielplan-pdf.post.js

131 lines
3.1 KiB
JavaScript

import multer from 'multer'
import fs from 'fs/promises'
import path from 'path'
import { getUserFromToken, hasAnyRole } from '../../utils/auth.js'
// Multer-Konfiguration für PDF-Uploads
const storage = multer.diskStorage({
destination: (req, file, cb) => {
const uploadPath = path.join(process.cwd(), 'public', 'documents', 'spielplaene')
cb(null, uploadPath)
},
filename: (req, file, cb) => {
const type = req.body.type
const filename = `spielplan_${type}.pdf`
cb(null, filename)
}
})
const upload = multer({
storage: 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) => {
try {
let token = getCookie(event, 'auth_token')
if (!token) {
const authHeader = getHeader(event, 'authorization')
if (authHeader && authHeader.startsWith('Bearer ')) {
token = authHeader.substring(7).trim()
}
}
if (!token) {
throw createError({
statusCode: 401,
statusMessage: 'Nicht authentifiziert'
})
}
const currentUser = await getUserFromToken(token)
if (!currentUser) {
throw createError({
statusCode: 401,
statusMessage: 'Nicht authentifiziert'
})
}
if (!hasAnyRole(currentUser, 'admin', 'vorstand')) {
throw createError({
statusCode: 403,
statusMessage: 'Keine Berechtigung'
})
}
// Multer-Middleware für multipart/form-data
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
const type = event.node.req.body.type
if (!file) {
throw createError({
statusCode: 400,
statusMessage: 'Keine Datei hochgeladen'
})
}
if (!type || !['gesamt', 'erwachsene', 'nachwuchs'].includes(type)) {
// Lösche die hochgeladene Datei
await fs.unlink(file.path)
throw createError({
statusCode: 400,
statusMessage: 'Ungültiger Typ'
})
}
return {
success: true,
message: `PDF für ${type} erfolgreich hochgeladen`,
filename: file.filename,
originalName: file.originalname
}
} catch (error) {
console.error('Fehler beim PDF-Upload:', error)
if (error.statusCode) {
throw error
}
if (error.code === 'LIMIT_FILE_SIZE') {
throw createError({
statusCode: 413,
statusMessage: 'Datei zu groß (max. 10MB)'
})
}
if (error.message === 'Nur PDF-Dateien sind erlaubt') {
throw createError({
statusCode: 400,
statusMessage: 'Nur PDF-Dateien sind erlaubt'
})
}
throw createError({
statusCode: 500,
statusMessage: 'Fehler beim Hochladen der PDF-Datei'
})
}
})