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',