add now features
This commit is contained in:
139
backend/src/controllers/atemschutz.controller.ts
Normal file
139
backend/src/controllers/atemschutz.controller.ts
Normal file
@@ -0,0 +1,139 @@
|
||||
import { Request, Response } from 'express';
|
||||
import atemschutzService from '../services/atemschutz.service';
|
||||
import { CreateAtemschutzSchema, UpdateAtemschutzSchema } from '../models/atemschutz.model';
|
||||
import logger from '../utils/logger';
|
||||
|
||||
// ── UUID validation ───────────────────────────────────────────────────────────
|
||||
|
||||
function isValidUUID(s: string): boolean {
|
||||
return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s);
|
||||
}
|
||||
|
||||
// ── Helper ────────────────────────────────────────────────────────────────────
|
||||
|
||||
function getUserId(req: Request): string {
|
||||
return req.user!.id;
|
||||
}
|
||||
|
||||
// ── Controller ────────────────────────────────────────────────────────────────
|
||||
|
||||
class AtemschutzController {
|
||||
async list(_req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const records = await atemschutzService.getAll();
|
||||
res.status(200).json({ success: true, data: records });
|
||||
} catch (error) {
|
||||
logger.error('Atemschutz list error', { error });
|
||||
res.status(500).json({ success: false, message: 'Atemschutzträger konnten nicht geladen werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async getOne(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { id } = req.params as Record<string, string>;
|
||||
if (!isValidUUID(id)) {
|
||||
res.status(400).json({ success: false, message: 'Ungültige Atemschutz-ID' });
|
||||
return;
|
||||
}
|
||||
const record = await atemschutzService.getById(id);
|
||||
if (!record) {
|
||||
res.status(404).json({ success: false, message: 'Atemschutzträger nicht gefunden' });
|
||||
return;
|
||||
}
|
||||
res.status(200).json({ success: true, data: record });
|
||||
} catch (error) {
|
||||
logger.error('Atemschutz getOne error', { error, id: req.params.id });
|
||||
res.status(500).json({ success: false, message: 'Atemschutzträger konnte nicht geladen werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async getStats(_req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const stats = await atemschutzService.getStats();
|
||||
res.status(200).json({ success: true, data: stats });
|
||||
} catch (error) {
|
||||
logger.error('Atemschutz getStats error', { error });
|
||||
res.status(500).json({ success: false, message: 'Atemschutz-Statistiken konnten nicht geladen werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async create(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const parsed = CreateAtemschutzSchema.safeParse(req.body);
|
||||
if (!parsed.success) {
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
message: 'Validierungsfehler',
|
||||
errors: parsed.error.flatten().fieldErrors,
|
||||
});
|
||||
return;
|
||||
}
|
||||
const record = await atemschutzService.create(parsed.data, getUserId(req));
|
||||
res.status(201).json({ success: true, data: record });
|
||||
} catch (error: any) {
|
||||
if (error?.message?.includes('bereits ein Atemschutz-Eintrag')) {
|
||||
res.status(409).json({ success: false, message: error.message });
|
||||
return;
|
||||
}
|
||||
logger.error('Atemschutz create error', { error });
|
||||
res.status(500).json({ success: false, message: 'Atemschutzträger konnte nicht erstellt werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async update(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { id } = req.params as Record<string, string>;
|
||||
if (!isValidUUID(id)) {
|
||||
res.status(400).json({ success: false, message: 'Ungültige Atemschutz-ID' });
|
||||
return;
|
||||
}
|
||||
const parsed = UpdateAtemschutzSchema.safeParse(req.body);
|
||||
if (!parsed.success) {
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
message: 'Validierungsfehler',
|
||||
errors: parsed.error.flatten().fieldErrors,
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (Object.keys(parsed.data).length === 0) {
|
||||
res.status(400).json({ success: false, message: 'Kein Feld zum Aktualisieren angegeben' });
|
||||
return;
|
||||
}
|
||||
const record = await atemschutzService.update(id, parsed.data, getUserId(req));
|
||||
if (!record) {
|
||||
res.status(404).json({ success: false, message: 'Atemschutzträger nicht gefunden' });
|
||||
return;
|
||||
}
|
||||
res.status(200).json({ success: true, data: record });
|
||||
} catch (error: any) {
|
||||
if (error?.message === 'No fields to update') {
|
||||
res.status(400).json({ success: false, message: 'Kein Feld zum Aktualisieren angegeben' });
|
||||
return;
|
||||
}
|
||||
logger.error('Atemschutz update error', { error, id: req.params.id });
|
||||
res.status(500).json({ success: false, message: 'Atemschutzträger konnte nicht aktualisiert werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async delete(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { id } = req.params as Record<string, string>;
|
||||
if (!isValidUUID(id)) {
|
||||
res.status(400).json({ success: false, message: 'Ungültige Atemschutz-ID' });
|
||||
return;
|
||||
}
|
||||
const deleted = await atemschutzService.delete(id, getUserId(req));
|
||||
if (!deleted) {
|
||||
res.status(404).json({ success: false, message: 'Atemschutzträger nicht gefunden' });
|
||||
return;
|
||||
}
|
||||
res.status(200).json({ success: true, message: 'Atemschutzträger gelöscht' });
|
||||
} catch (error) {
|
||||
logger.error('Atemschutz delete error', { error, id: req.params.id });
|
||||
res.status(500).json({ success: false, message: 'Atemschutzträger konnte nicht gelöscht werden' });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default new AtemschutzController();
|
||||
Reference in New Issue
Block a user