Refactor error handling in MyTischtennisUrlController and improve memberService indexing

Refactored error handling in MyTischtennisUrlController to standardize error messages and ensure consistent status codes. Enhanced memberService by implementing a more efficient indexing system for member data retrieval, improving performance and accuracy in TTR and QTTR updates. Updated TeamManagementView to handle timeout errors and provide detailed user feedback, enhancing overall user experience.
This commit is contained in:
Torsten Schulz (local)
2025-11-03 10:45:04 +01:00
parent acf2cf00bd
commit 23708b99b5
3 changed files with 68 additions and 32 deletions

View File

@@ -264,26 +264,33 @@ class MemberService {
const notFound = [];
const matched = [];
// Maps für schnelleres Matching
const mapByName = (entries) => {
const m = new Map();
// Indizes für schnelleres Matching (nach personId und Name)
const createIndex = (entries) => {
const byName = new Map();
const byPersonId = new Map();
for (const e of (entries || [])) {
const key = `${(e.firstname||'').toLowerCase()}|${(e.lastname||'').toLowerCase()}`;
if (!m.has(key)) m.set(key, e);
const key = `${(e.firstname||'').toLowerCase().trim()}|${(e.lastname||'').toLowerCase().trim()}`;
if (!byName.has(key)) byName.set(key, e);
if (e.personId && !byPersonId.has(String(e.personId))) {
byPersonId.set(String(e.personId), e);
}
}
return m;
return { byName, byPersonId };
};
const currentMap = mapByName(rankingsCurrent.entries);
const quarterMap = rankingsQuarter.success ? mapByName(rankingsQuarter.entries) : new Map();
const currentIdx = createIndex(rankingsCurrent.entries);
const quarterIdx = rankingsQuarter.success ? createIndex(rankingsQuarter.entries) : { byName: new Map(), byPersonId: new Map() };
// 4. Für jedes Mitglied TTR und QTTR aktualisieren
let updatedTtr = 0;
let updatedQttr = 0;
for (const member of members) {
const firstName = member.firstName;
const lastName = member.lastName;
const key = `${(firstName||'').toLowerCase()}|${(lastName||'').toLowerCase()}`;
const rankingEntry = currentMap.get(key);
const rankingQuarterEntry = quarterMap.get(key);
const key = `${(firstName||'').toLowerCase().trim()}|${(lastName||'').toLowerCase().trim()}`;
const personId = member.myTischtennisPlayerId ? String(member.myTischtennisPlayerId).trim() : null;
const rankingEntry = personId ? (currentIdx.byPersonId.get(personId) || currentIdx.byName.get(key)) : currentIdx.byName.get(key);
const rankingQuarterEntry = personId ? (quarterIdx.byPersonId.get(personId) || quarterIdx.byName.get(key)) : quarterIdx.byName.get(key);
if (rankingEntry || rankingQuarterEntry) {
try {
@@ -291,9 +298,18 @@ class MemberService {
const oldQttr = member.qttr;
if (rankingEntry && typeof rankingEntry.fedRank === 'number') {
member.ttr = rankingEntry.fedRank;
if (member.ttr !== oldTtr) updatedTtr++;
}
if (rankingQuarterEntry && typeof rankingQuarterEntry.fedRank === 'number') {
member.qttr = rankingQuarterEntry.fedRank;
if (member.qttr !== oldQttr) updatedQttr++;
} else if (!rankingsQuarter.success && (member.qttr == null)) {
// Fallback: wenn QTTR-Abruf fehlgeschlagen ist und kein Wert vorhanden war,
// setze QTTR ersatzweise auf aktuellen TTR, damit die Anzeige nicht leer bleibt
if (member.ttr != null) {
member.qttr = member.ttr;
if (member.qttr !== oldQttr) updatedQttr++;
}
}
await member.save();
updated++;
@@ -318,7 +334,7 @@ class MemberService {
devLog(`Updated: ${updated}, Not found: ${notFound.length}, Errors: ${errors.length}`);
let message = `${updated} Mitglied(er) aktualisiert.`;
let message = `${updated} Mitglied(er) aktualisiert. (TTR: ${updatedTtr}, QTTR: ${updatedQttr})`;
if (notFound.length > 0) {
message += ` ${notFound.length} nicht in myTischtennis-Rangliste gefunden.`;
}