From 1dc1eade8f7a4bb0cf8dbb99355aa2ad7b50730d Mon Sep 17 00:00:00 2001 From: Giuseppe Lombardo Date: Wed, 12 Aug 2026 21:38:33 +0000 Subject: [PATCH] Dateien nach "backend/src/routes" hochladen --- backend/src/routes/documents.ts | 78 +++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 backend/src/routes/documents.ts diff --git a/backend/src/routes/documents.ts b/backend/src/routes/documents.ts new file mode 100644 index 0000000..a5654bf --- /dev/null +++ b/backend/src/routes/documents.ts @@ -0,0 +1,78 @@ +import { Router, Response } from 'express'; +import { PrismaClient, DocumentCategory } from '@prisma/client'; +import { AuthedRequest, requireAuth, requireRole } from '../middleware/auth'; + +const prisma = new PrismaClient(); + +/** + * Router für den Dokumenten-Safe & Tutorials (Hausordnung, WLAN-Zugang, + * Video/Bild-Guides zur Gerätepflege). Für alle eingeloggten Nutzer + * sichtbar; Hochladen/Löschen ist Vermieter/Admin vorbehalten. + */ +export const documentsRouter = Router(); + +const CATEGORIES = Object.values(DocumentCategory); + +const DOCUMENT_SELECT = { + id: true, + title: true, + category: true, + url: true, + description: true, + createdAt: true, + uploadedBy: { select: { id: true, fullName: true } }, +}; + +documentsRouter.get('/documents', requireAuth, async (_req: AuthedRequest, res: Response) => { + const documents = await prisma.document.findMany({ + orderBy: { createdAt: 'desc' }, + select: DOCUMENT_SELECT, + }); + res.status(200).json({ documents }); +}); + +documentsRouter.post( + '/documents', + requireAuth, + requireRole('LANDLORD', 'ADMIN'), + async (req: AuthedRequest, res: Response) => { + const { title, category, url, description } = req.body || {}; + + if (!title || typeof title !== 'string' || !title.trim()) { + return res.status(400).json({ error: 'title ist erforderlich' }); + } + if (!url || typeof url !== 'string' || !url.trim()) { + return res.status(400).json({ error: 'url ist erforderlich' }); + } + if (category && !CATEGORIES.includes(category)) { + return res.status(400).json({ error: `Ungültige Kategorie. Erlaubt: ${CATEGORIES.join(', ')}` }); + } + + const document = await prisma.document.create({ + data: { + title: title.trim().slice(0, 120), + category: category || DocumentCategory.SONSTIGES, + url: url.trim(), + description: typeof description === 'string' && description.trim() ? description.trim().slice(0, 280) : null, + uploadedById: req.user!.id, + }, + select: DOCUMENT_SELECT, + }); + + res.status(201).json({ document }); + }, +); + +documentsRouter.delete( + '/documents/:id', + requireAuth, + requireRole('LANDLORD', 'ADMIN'), + async (req: AuthedRequest, res: Response) => { + try { + await prisma.document.delete({ where: { id: req.params.id } }); + res.status(204).send(); + } catch { + res.status(404).json({ error: 'Dokument nicht gefunden' }); + } + }, +);