Dateien nach "backend/src/routes" hochladen

This commit is contained in:
Giuseppe Lombardo 2026-08-12 21:38:33 +00:00
parent e33aadaa90
commit 1dc1eade8f

View File

@ -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' });
}
},
);