const hashId = require('../utils/hashId'); /** * Middleware zum automatischen Enthashen von IDs in Request-Daten */ const unhashRequestIds = (req, res, next) => { // Body-Parameter verarbeiten if (req.body && typeof req.body === 'object') { req.body = unhashRequestData(req.body); } // Query-Parameter verarbeiten if (req.query && typeof req.query === 'object') { req.query = unhashRequestData(req.query); } // Route-Parameter verarbeiten if (req.params && typeof req.params === 'object') { console.log('DEBUG unhashRequest: req.params before =', req.params); req.params = unhashRequestData(req.params); console.log('DEBUG unhashRequest: req.params after =', req.params); } next(); }; /** * Rekursiv Hash-IDs in Datenstruktur entschlüsseln * @param {*} data - Zu verarbeitende Daten * @returns {*} Daten mit entschlüsselten IDs */ function unhashRequestData(data) { // Primitive Typen direkt zurückgeben if (data === null || data === undefined) { return data; } // String: Könnte ein Hash sein if (typeof data === 'string') { // Versuche als Hash zu dekodieren const decoded = hashId.decode(data); if (decoded !== null) { return decoded; } return data; } // Array: Jedes Element verarbeiten if (Array.isArray(data)) { return data.map(item => unhashRequestData(item)); } // Object: Rekursiv verarbeiten if (typeof data === 'object') { const result = {}; for (const [key, value] of Object.entries(data)) { // ID-Felder identifizieren und enthashen if (isIdField(key) && typeof value === 'string') { const decoded = hashId.decode(value); result[key] = decoded !== null ? decoded : value; } // Verschachtelte Objekte/Arrays rekursiv verarbeiten else if (typeof value === 'object') { result[key] = unhashRequestData(value); } // Andere Werte unverändert übernehmen else { result[key] = value; } } return result; } // Andere Typen unverändert return data; } /** * Prüft ob ein Feldname eine ID repräsentiert * @param {string} fieldName - Name des Feldes * @returns {boolean} True wenn ID-Feld */ function isIdField(fieldName) { // Felder die als ID erkannt werden sollen const idPatterns = [ 'id', '_id', 'user_id', 'userId', 'auth_info_id', 'authInfoId', 'auth_token_id', 'authTokenId', 'worklog_id', 'worklogId', 'vacation_id', 'vacationId', 'sick_id', 'sickId', 'holiday_id', 'holidayId', 'state_id', 'stateId', 'sick_type_id', 'sickTypeId', 'weekly_worktime_id', 'weeklyWorktimeId' ]; return idPatterns.includes(fieldName); } module.exports = unhashRequestIds;