119 lines
2.7 KiB
JavaScript
119 lines
2.7 KiB
JavaScript
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;
|
|
|
|
|
|
|