From e23ba6f22c437d38c298b1c29054c1d1e3e759db Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 06:09:38 +0000 Subject: [PATCH] fix: correct two regressions from code-review fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - removeMatch: revert targeted-write optimisation — recalculateStatsFromHistory replays all matches, so all players' ELOs can change via chain reaction; writing only the 2-4 participants left every other player stale in Supabase - saveMatch: add DB revert in the catch block — if updatePlayer succeeds for some players but createMatch then throws, the already-written Supabase rows are now corrected back to the post-rollback ELOs so DB stays consistent https://claude.ai/code/session_01TgxiTLy7fCh5xZPJT8eTVt --- app.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app.js b/app.js index e844d90..c5d8016 100644 --- a/app.js +++ b/app.js @@ -320,6 +320,12 @@ async function saveMatch(match, playerEntries) { console.error(err); state.matches.pop(); recalculateStatsFromHistory(); + // Revert any player ELOs already written to Supabase before the failure + try { + await Promise.all(playerEntries.map(({ id }) => updatePlayer(id, state.players[id]))); + } catch (revertErr) { + console.error('ELO-Revert fehlgeschlagen:', revertErr); + } showError('Fehler beim Speichern. Match wurde nicht übertragen.'); } finally { toggleLoading(false); @@ -343,13 +349,9 @@ async function removeMatch(id) { recalculateStatsFromHistory(); - // Only write back players who appeared in the deleted match - const affectedIds = match - ? [...String(match.winnerId || '').split(','), ...String(match.loserId || '').split(',')] - .map(s => s.trim()).filter(s => s && state.players[s]) - : Object.keys(state.players); - - await Promise.all(affectedIds.map(pid => updatePlayer(pid, state.players[pid]))); + await Promise.all( + Object.entries(state.players).map(([pid, player]) => updatePlayer(pid, player)) + ); persistPlayers(); renderRankings(openProfileModal);