const hashId = require('../utils/hashId'); /** * Middleware zum automatischen Hashen von IDs in Response-Daten */ const hashResponseIds = (req, res, next) => { // Originale json-Methode speichern const originalJson = res.json.bind(res); // json-Methode überschreiben res.json = function(data) { // Wenn Daten vorhanden sind, IDs hashen if (data) { data = hashResponseData(data); } // Originale Methode aufrufen return originalJson(data); }; next(); }; /** * Rekursiv IDs in Datenstruktur hashen * @param {*} data - Zu verarbeitende Daten * @returns {*} Daten mit gehashten IDs */ function hashResponseData(data) { // Primitive Typen direkt zurückgeben if (data === null || data === undefined) { return data; } // Array: Jedes Element verarbeiten if (Array.isArray(data)) { return data.map(item => hashResponseData(item)); } // Object: ID-Felder hashen if (typeof data === 'object') { const result = {}; for (const [key, value] of Object.entries(data)) { // ID-Felder identifizieren und hashen if (isIdField(key) && typeof value === 'number') { result[key] = hashId.encode(value); } // Verschachtelte Objekte/Arrays rekursiv verarbeiten else if (typeof value === 'object') { result[key] = hashResponseData(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 = hashResponseIds;