eat(ausruestung): allow create role to view full list, add Mitglieder pagination, add admin reset for persoenliche Ausruestung

This commit is contained in:
Matthias Hochmeister
2026-04-16 07:52:36 +02:00
parent 3f8c4d151d
commit dac0b79b3b
7 changed files with 46 additions and 11 deletions

View File

@@ -246,6 +246,7 @@ router.delete('/cleanup/reset-buchhaltung-transaktionen', authenticate, requireP
router.delete('/cleanup/reset-buchhaltung-konten', authenticate, requirePermission('admin:write'), (req, res) => { req.params.resetTarget = 'reset-buchhaltung-konten'; return resetHandler(req, res); });
router.delete('/cleanup/reset-buchhaltung-bankkonten', authenticate, requirePermission('admin:write'), (req, res) => { req.params.resetTarget = 'reset-buchhaltung-bankkonten'; return resetHandler(req, res); });
router.delete('/cleanup/reset-checklist-history', authenticate, requirePermission('admin:write'), (req, res) => { req.params.resetTarget = 'reset-checklist-history'; return resetHandler(req, res); });
router.delete('/cleanup/reset-persoenliche-ausruestung', authenticate, requirePermission('admin:write'), (req, res) => { req.params.resetTarget = 'reset-persoenliche-ausruestung'; return resetHandler(req, res); });
router.delete('/cleanup/issues-all', authenticate, requirePermission('admin:write'), (req, res) => { req.params.resetTarget = 'issues-all'; return resetHandler(req, res); });
router.delete(
@@ -289,6 +290,7 @@ const RESET_TARGETS: Record<string, (confirm: boolean) => Promise<{ count: numbe
'reset-buchhaltung-transaktionen': (c) => cleanupService.resetBuchhaltungTransaktionen(c),
'reset-buchhaltung-konten': (c) => cleanupService.resetBuchhaltungKonten(c),
'reset-buchhaltung-bankkonten': (c) => cleanupService.resetBuchhaltungBankkonten(c),
'reset-persoenliche-ausruestung': (c) => cleanupService.resetPersoenlicheAusruestung(c),
};
const resetHandler = async (req: Request, res: Response): Promise<void> => {

View File

@@ -1,7 +1,7 @@
import { Router } from 'express';
import personalEquipmentController from '../controllers/personalEquipment.controller';
import { authenticate } from '../middleware/auth.middleware';
import { requirePermission } from '../middleware/rbac.middleware';
import { requirePermission, requireAnyPermission } from '../middleware/rbac.middleware';
import { permissionService } from '../services/permission.service';
const router = Router();
@@ -9,8 +9,8 @@ const router = Router();
// Own items — any authenticated user with view permission
router.get('/my', authenticate, personalEquipmentController.getMy.bind(personalEquipmentController));
// All items — requires view_all
router.get('/', authenticate, requirePermission('persoenliche_ausruestung:view_all'), personalEquipmentController.list.bind(personalEquipmentController));
// All items — requires view_all or create
router.get('/', authenticate, requireAnyPermission('persoenliche_ausruestung:view_all', 'persoenliche_ausruestung:create'), personalEquipmentController.list.bind(personalEquipmentController));
// By user — own data or view_all
router.get('/user/:userId', authenticate, async (req, res, next) => {

View File

@@ -238,6 +238,21 @@ class CleanupService {
logger.info(`Cleanup: truncated buchhaltung_bankkonten (${count} rows) and reset sequence`);
return { count, deleted: true };
}
async resetPersoenlicheAusruestung(confirm: boolean): Promise<CleanupResult> {
if (!confirm) {
const { rows } = await pool.query('SELECT COUNT(*)::int AS count FROM persoenliche_ausruestung WHERE geloescht_am IS NULL');
return { count: rows[0].count, deleted: false };
}
const { rows } = await pool.query('SELECT COUNT(*)::int AS count FROM persoenliche_ausruestung');
const count = rows[0].count;
// Clear FK references from request positions before truncating
await pool.query(`UPDATE ausruestung_anfrage_positionen SET zuweisung_persoenlich_id = NULL, zuweisung_typ = 'keine' WHERE zuweisung_persoenlich_id IS NOT NULL`);
// CASCADE removes persoenliche_ausruestung_eigenschaften rows automatically
await pool.query('TRUNCATE persoenliche_ausruestung CASCADE');
logger.info(`Cleanup: truncated persoenliche_ausruestung (${count} rows)`);
return { count, deleted: true };
}
}
export default new CleanupService();