From 2f161d1eb547f704e7229276255dc6996aad8d32 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 6 Nov 2025 08:16:14 +0100 Subject: [PATCH] Refactor logging in MemberTransferService to use info and error logs Updated the MemberTransferService to replace debug logging with info and error logging for better visibility in production. This change enhances the logging of login credentials, transfer details, and error handling, ensuring critical information is captured appropriately during member transfers. --- backend/services/memberTransferService.js | 128 +++++++++++----------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/backend/services/memberTransferService.js b/backend/services/memberTransferService.js index 0cd7db5..ca41c2d 100644 --- a/backend/services/memberTransferService.js +++ b/backend/services/memberTransferService.js @@ -3,7 +3,7 @@ import Member from '../models/Member.js'; import MemberTransferConfig from '../models/MemberTransferConfig.js'; import { checkAccess, getUserByToken } from '../utils/userUtils.js'; import { encryptData, decryptData } from '../utils/encrypt.js'; -import { devLog } from '../utils/logger.js'; +import { devLog, infoLog, errorLog } from '../utils/logger.js'; class MemberTransferService { /** @@ -81,7 +81,7 @@ class MemberTransferService { if (normalizedSavedEndpoint === normalizedConfigEndpoint || !savedConfig.loginEndpoint) { const savedCredentials = savedConfig.getLoginCredentials(); if (savedCredentials && Object.keys(savedCredentials).length > 0) { - devLog('[transferMembers] Verwende gespeicherte Login-Credentials'); + infoLog('[transferMembers] Verwende gespeicherte Login-Credentials'); loginCredentials = savedCredentials; } } @@ -109,7 +109,7 @@ class MemberTransferService { if (savedEndpointFull === normalizedConfigEndpoint || !savedConfig.loginEndpoint) { const savedCredentials = savedConfig.getLoginCredentials(); if (savedCredentials && Object.keys(savedCredentials).length > 0) { - devLog('[transferMembers] Verwende gespeicherte Login-Credentials (vollständige URL)'); + infoLog('[transferMembers] Verwende gespeicherte Login-Credentials (vollständige URL)'); loginCredentials = savedCredentials; } } @@ -127,7 +127,7 @@ class MemberTransferService { if (savedConfig) { const savedCredentials = savedConfig.getLoginCredentials(); if (savedCredentials && Object.keys(savedCredentials).length > 0) { - devLog('[transferMembers] Fallback: Verwende gespeicherte Login-Credentials'); + infoLog('[transferMembers] Fallback: Verwende gespeicherte Login-Credentials'); loginCredentials = savedCredentials; } } @@ -160,37 +160,37 @@ class MemberTransferService { ); if (!hasValidCredentials) { - devLog('[transferMembers] Login-Credentials enthalten nur leere Werte'); + infoLog('[transferMembers] Login-Credentials enthalten nur leere Werte'); loginCredentials = null; } } - // Debug-Logging für Login-Credentials + // Debug-Logging für Login-Credentials (auch in Prod) if (loginEndpointUrl) { if (loginCredentials && Object.keys(loginCredentials).length > 0) { - devLog('[transferMembers] Login-Credentials gefunden:', Object.keys(loginCredentials)); + infoLog('[transferMembers] Login-Credentials gefunden:', Object.keys(loginCredentials)); // Logge nur die Keys, nicht die Werte (Sicherheit) - devLog('[transferMembers] Login-Endpoint:', loginEndpointUrl); - devLog('[transferMembers] Login-Format:', config.loginFormat || 'json'); + infoLog('[transferMembers] Login-Endpoint:', loginEndpointUrl); + infoLog('[transferMembers] Login-Format:', config.loginFormat || 'json'); // Mapping: Wenn "username" vorhanden ist, aber kein "email", verwende "username" als "email" // Viele APIs erwarten "email" statt "username" if (loginCredentials.username && !loginCredentials.email) { - devLog('[transferMembers] Mappe "username" zu "email" für Login'); + infoLog('[transferMembers] Mappe "username" zu "email" für Login'); loginCredentials.email = loginCredentials.username; // Entferne username, falls email erwartet wird // delete loginCredentials.username; // Auskommentiert, falls beide benötigt werden } } else { - devLog('[transferMembers] WARNUNG: Keine Login-Credentials gefunden!'); - devLog('[transferMembers] loginEndpointUrl:', loginEndpointUrl); - devLog('[transferMembers] config.loginEndpoint:', config.loginEndpoint); - devLog('[transferMembers] savedConfig vorhanden:', !!savedConfig); + infoLog('[transferMembers] WARNUNG: Keine Login-Credentials gefunden!'); + infoLog('[transferMembers] loginEndpointUrl:', loginEndpointUrl); + infoLog('[transferMembers] config.loginEndpoint:', config.loginEndpoint); + infoLog('[transferMembers] savedConfig vorhanden:', !!savedConfig); if (savedConfig) { const savedCreds = savedConfig.getLoginCredentials(); - devLog('[transferMembers] Gespeicherte Credentials vorhanden:', !!savedCreds && Object.keys(savedCreds).length > 0); + infoLog('[transferMembers] Gespeicherte Credentials vorhanden:', !!savedCreds && Object.keys(savedCreds).length > 0); if (savedCreds) { - devLog('[transferMembers] Gespeicherte Credential-Keys:', Object.keys(savedCreds)); + infoLog('[transferMembers] Gespeicherte Credential-Keys:', Object.keys(savedCreds)); } } } @@ -222,7 +222,7 @@ class MemberTransferService { authToken = loginResult.token; sessionCookie = loginResult.cookie; } catch (loginError) { - devLog('[transferMembers] Login error:', loginError); + errorLog('[transferMembers] Login error:', loginError); // WICHTIG: Verwende 400 statt 401, damit der Benutzer nicht ausgeloggt wird return { status: 400, @@ -252,14 +252,14 @@ class MemberTransferService { member ); - // Debug-Logging: Erste 3 Mitglieder vollständig loggen + // Debug-Logging: Erste 3 Mitglieder vollständig loggen (auch in Prod) if (membersArray.length < 3) { - devLog(`[transferMembers] Mitglied ${membersArray.length + 1} (${member.firstName} ${member.lastName}):`, JSON.stringify(memberData, null, 2)); + infoLog(`[transferMembers] Mitglied ${membersArray.length + 1} (${member.firstName} ${member.lastName}):`, JSON.stringify(memberData, null, 2)); } membersArray.push(memberData); } catch (error) { - devLog(`[transferMembers] Error processing ${member.firstName} ${member.lastName}:`, error); + infoLog(`[transferMembers] Error processing ${member.firstName} ${member.lastName}:`, error); memberErrors.push({ member: `${member.firstName} ${member.lastName}`, error: error.message @@ -267,7 +267,7 @@ class MemberTransferService { } } - devLog(`[transferMembers] Anzahl zu übertragender Mitglieder: ${membersArray.length}`); + infoLog(`[transferMembers] Anzahl zu übertragender Mitglieder: ${membersArray.length}`); // Bulk-Objekt erstellen let bulkData; @@ -298,9 +298,9 @@ class MemberTransferService { try { bulkData = JSON.parse(wrapperString); } catch (parseError) { - devLog('[transferMembers] Error parsing wrapper template after replacement:', parseError); - devLog('[transferMembers] Wrapper template:', wrapperTemplate); - devLog('[transferMembers] After replacement:', wrapperString); + infoLog('[transferMembers] Error parsing wrapper template after replacement:', parseError); + infoLog('[transferMembers] Wrapper template:', wrapperTemplate); + infoLog('[transferMembers] After replacement:', wrapperString); // Fallback: Standard-Format bulkData = { members: membersArray @@ -313,28 +313,28 @@ class MemberTransferService { }; } - // Debug-Logging: Was wird übertragen? - devLog('[transferMembers] Bulk-Daten werden übertragen:'); - devLog('[transferMembers] Endpoint:', transferEndpointUrl); - devLog('[transferMembers] Methode:', config.transferMethod || 'POST'); - devLog('[transferMembers] Format:', config.transferFormat || 'json'); - devLog('[transferMembers] Anzahl Mitglieder im Bulk:', membersArray.length); + // Debug-Logging: Was wird übertragen? (auch in Prod) + infoLog('[transferMembers] Bulk-Daten werden übertragen:'); + infoLog('[transferMembers] Endpoint:', transferEndpointUrl); + infoLog('[transferMembers] Methode:', config.transferMethod || 'POST'); + infoLog('[transferMembers] Format:', config.transferFormat || 'json'); + infoLog('[transferMembers] Anzahl Mitglieder im Bulk:', membersArray.length); // Logge die ersten 2 Mitglieder vollständig für Debugging if (membersArray.length > 0) { - devLog('[transferMembers] Erstes Mitglied (Beispiel):', JSON.stringify(membersArray[0], null, 2)); + infoLog('[transferMembers] Erstes Mitglied (Beispiel):', JSON.stringify(membersArray[0], null, 2)); if (membersArray.length > 1) { - devLog('[transferMembers] Zweites Mitglied (Beispiel):', JSON.stringify(membersArray[1], null, 2)); + infoLog('[transferMembers] Zweites Mitglied (Beispiel):', JSON.stringify(membersArray[1], null, 2)); } } // Logge die vollständige Bulk-Struktur (begrenzt auf erste 1000 Zeichen) const bulkDataString = JSON.stringify(bulkData, null, 2); if (bulkDataString.length > 1000) { - devLog('[transferMembers] Bulk-Daten (erste 1000 Zeichen):', bulkDataString.substring(0, 1000) + '...'); - devLog('[transferMembers] Bulk-Daten Gesamtlänge:', bulkDataString.length, 'Zeichen'); + infoLog('[transferMembers] Bulk-Daten (erste 1000 Zeichen):', bulkDataString.substring(0, 1000) + '...'); + infoLog('[transferMembers] Bulk-Daten Gesamtlänge:', bulkDataString.length, 'Zeichen'); } else { - devLog('[transferMembers] Vollständige Bulk-Daten:', bulkDataString); + infoLog('[transferMembers] Vollständige Bulk-Daten:', bulkDataString); } const transferResult = await this.transferMember( @@ -386,7 +386,7 @@ class MemberTransferService { }; } } catch (error) { - devLog('[transferMembers] Bulk transfer error:', error); + errorLog('[transferMembers] Bulk transfer error:', error); return { status: 500, response: { @@ -433,7 +433,7 @@ class MemberTransferService { }); } } catch (error) { - devLog(`[transferMembers] Error transferring ${member.firstName} ${member.lastName}:`, error); + errorLog(`[transferMembers] Error transferring ${member.firstName} ${member.lastName}:`, error); errors.push({ member: `${member.firstName} ${member.lastName}`, error: error.message @@ -456,7 +456,7 @@ class MemberTransferService { }; } } catch (error) { - devLog('[transferMembers] Error:', error); + errorLog('[transferMembers] Error:', error); return { status: 500, response: { @@ -474,11 +474,11 @@ class MemberTransferService { */ async performLogin(endpoint, format, credentials) { try { - // Debug-Logging - devLog('[performLogin] Endpoint:', endpoint); - devLog('[performLogin] Format:', format); - devLog('[performLogin] Credential-Keys:', Object.keys(credentials || {})); - devLog('[performLogin] Credentials vorhanden:', !!(credentials && Object.keys(credentials).length > 0)); + // Debug-Logging (auch in Prod) + infoLog('[performLogin] Endpoint:', endpoint); + infoLog('[performLogin] Format:', format); + infoLog('[performLogin] Credential-Keys:', Object.keys(credentials || {})); + infoLog('[performLogin] Credentials vorhanden:', !!(credentials && Object.keys(credentials).length > 0)); if (!credentials || Object.keys(credentials).length === 0) { return { @@ -502,7 +502,7 @@ class MemberTransferService { 'Content-Type': 'application/json' }; requestConfig.data = credentials; - devLog('[performLogin] Sende JSON-Daten:', JSON.stringify(credentials, null, 2).replace(/("password"[^,}]*")([^"]*)(")/g, '$1***$3')); + infoLog('[performLogin] Sende JSON-Daten:', JSON.stringify(credentials, null, 2).replace(/("password"[^,}]*")([^"]*)(")/g, '$1***$3')); } else if (format === 'form-data' || format === 'multipart/form-data') { const FormData = (await import('form-data')).default; const formData = new FormData(); @@ -549,7 +549,7 @@ class MemberTransferService { response: response.data }; } catch (error) { - devLog('[performLogin] Error:', error); + errorLog('[performLogin] Error:', error); // Extrahiere detaillierte Fehlerinformationen let errorMessage = 'Login fehlgeschlagen'; @@ -565,9 +565,9 @@ class MemberTransferService { errorMessage = error.message; } - // Logge den Status-Code für Debugging + // Logge den Status-Code für Debugging (auch in Prod) if (statusCode) { - devLog(`[performLogin] Externer Endpoint Status: ${statusCode}`); + infoLog(`[performLogin] Externer Endpoint Status: ${statusCode}`); } return { @@ -583,41 +583,41 @@ class MemberTransferService { */ async transferMember(endpoint, method, format, data, authToken, sessionCookie) { try { - // Debug-Logging - devLog('[transferMember] Starte Übertragung:'); - devLog('[transferMember] Endpoint:', endpoint); - devLog('[transferMember] Method:', method); - devLog('[transferMember] Format:', format); - devLog('[transferMember] AuthToken vorhanden:', !!authToken); - devLog('[transferMember] SessionCookie vorhanden:', !!sessionCookie); + // Debug-Logging (auch in Prod) + infoLog('[transferMember] Starte Übertragung:'); + infoLog('[transferMember] Endpoint:', endpoint); + infoLog('[transferMember] Method:', method); + infoLog('[transferMember] Format:', format); + infoLog('[transferMember] AuthToken vorhanden:', !!authToken); + infoLog('[transferMember] SessionCookie vorhanden:', !!sessionCookie); // Logge Daten-Struktur (ohne vollständige Daten bei großen Objekten) if (typeof data === 'object' && data !== null) { if (Array.isArray(data)) { - devLog('[transferMember] Daten ist Array mit', data.length, 'Elementen'); + infoLog('[transferMember] Daten ist Array mit', data.length, 'Elementen'); if (data.length > 0) { - devLog('[transferMember] Erstes Array-Element:', JSON.stringify(data[0], null, 2)); + infoLog('[transferMember] Erstes Array-Element:', JSON.stringify(data[0], null, 2)); } } else if (data.members && Array.isArray(data.members)) { - devLog('[transferMember] Daten enthält members-Array mit', data.members.length, 'Elementen'); + infoLog('[transferMember] Daten enthält members-Array mit', data.members.length, 'Elementen'); if (data.members.length > 0) { - devLog('[transferMember] Erstes Mitglied im members-Array:', JSON.stringify(data.members[0], null, 2)); + infoLog('[transferMember] Erstes Mitglied im members-Array:', JSON.stringify(data.members[0], null, 2)); if (data.members.length > 1) { - devLog('[transferMember] Zweites Mitglied im members-Array:', JSON.stringify(data.members[1], null, 2)); + infoLog('[transferMember] Zweites Mitglied im members-Array:', JSON.stringify(data.members[1], null, 2)); } } } else { const dataString = JSON.stringify(data, null, 2); if (dataString.length > 500) { - devLog('[transferMember] Daten (erste 500 Zeichen):', dataString.substring(0, 500) + '...'); + infoLog('[transferMember] Daten (erste 500 Zeichen):', dataString.substring(0, 500) + '...'); } else { - devLog('[transferMember] Vollständige Daten:', dataString); + infoLog('[transferMember] Vollständige Daten:', dataString); } } } else { - devLog('[transferMember] Daten-Typ:', typeof data); + infoLog('[transferMember] Daten-Typ:', typeof data); if (typeof data === 'string') { - devLog('[transferMember] Daten-String (erste 500 Zeichen):', data.substring(0, 500)); + infoLog('[transferMember] Daten-String (erste 500 Zeichen):', data.substring(0, 500)); } } @@ -726,7 +726,7 @@ class MemberTransferService { data: response.data }; } catch (error) { - devLog('[transferMember] Error:', error); + errorLog('[transferMember] Error:', error); return { success: false, error: error.response?.data?.message || error.message || 'Übertragung fehlgeschlagen',