79 lines
2.4 KiB
TypeScript
79 lines
2.4 KiB
TypeScript
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' });
|
|
}
|
|
},
|
|
);
|