fix: predicted_rating wipas av INSERT OR REPLACE i savePlayerToDB #11
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Beskrivning
Predicted rating försvinner för alla spelare samtidigt när topbarens "Refresh all"-knapp klickas (eller annan kod-väg som anropar
savePlayerToDBför existerande spelare). Visas i UI som tom cell—.Tidigare antogs detta vara ett sporadiskt problem — utforskning har nu identifierat rotorsaken (se diskussion).
Rotorsak
src/models/player.js:20-22:INSERT OR REPLACEraderar hela den existerande raden och infogar en ny. Kolumner som inte är med iVALUESåtergår till DEFAULT (NULL):predicted_ratingstd_devlast_round_updateexcluded_rounds_countcutoff_ratingReproduktion
—för allaFix
Byt
INSERT OR REPLACEmot SQLite UPSERT som explicit listar endast de fält som ska uppdateras vid konflikt:Detta bevarar
predicted_rating,std_dev,last_round_update,excluded_rounds_count,cutoff_ratingför existerande spelare.Sekundär konsekvens (att verifiera)
last_round_updatenukas också i samma operation → 24h-cooldownen för/api/refresh-round-history/:pdgaNumbersläpper falskt. Lösningen ovan fixar även detta som biprodukt.Scope
Ingår:
savePlayerToDBisrc/models/player.js:17-28till UPSERTsrc/models/player.jshar sammaINSERT OR REPLACE-mönster (t.ex.saveRoundHistoryToDB, course-modeller) — fixa eller motivera varför inteIngår inte:
/api/add-player(separat issue om vi vill ha det)getPlayerDataFromDB:45(kvarstår som korrekt vid otillräcklig data — om någon spelare faktiskt har < 8 ronder ska de visa—)Acceptanskriterier
savePlayerToDBanvänder UPSERT som bevarar predicted-relaterade kolumnerlast_round_updateöverlever också (cooldown fungerar fortfarande som tänkt)Rotorsak hittad — ingen ytterligare diagnostik behövs
Ny observation: alla predicted_rating-värden var borta samtidigt efter några dagar utan att ha besökt sidan. Det pekade mot global invalidation, inte spelarspecifika edge cases. Utforskning bekräftar rotorsaken.
Smoking gun
src/models/player.js:20-22:INSERT OR REPLACEi SQLite är inte en mjuk upsert — den raderar hela den existerande raden och infogar en ny. Alla kolumner som inte är med iVALUES-listan får sina DEFAULT-värden tillbaka. Här blir detNULLför:predicted_ratingstd_devlast_round_updateexcluded_rounds_countcutoff_ratingTriggerväg
savePlayerToDBanropas från:/api/add-player(src/routes/players.js:239) — manuellt/api/refresh-player/:pdgaNumber(src/routes/players.js:261) — manuellt/api/refresh-all(src/routes/players.js:24) →refreshAllPlayersInDB()→scrapePDGARating()→savePlayerToDB()för varje spelare i DB (src/services/player-service.js:98,300)Topbar-knappen "Refresh all" (
views/partials/topbar.ejs:34,64) triggar/api/refresh-all. Ett enda klick → predicted_rating wipas för hela tabellen.Sekundära konsekvenser
last_round_updatenukas också → 24h-cooldownen släpper, men predicted räknas inte om förrän man manuellt klickar refresh-round-history per spelaregetPlayerDataFromDB(src/services/player-service.js:45-51) försöker beräkna om, mengetPredictedRatingFromDBreturnerar 0 om round_history-tabellen är tom för spelaren → 0 → konverteras tillnulli UIFörslag på fix
SQLite UPSERT (renast, säger explicit vad som ska uppdateras):
Detta lämnar
predicted_rating,std_dev,last_round_update,excluded_rounds_count,cutoff_ratingorörda för existerande spelare.Konsekvens för denna issue
Diagnostik behövs inte längre — vi har rotorsaken. Issuen omklassificeras till fix-issue (se uppdaterad titel/body).
chore: utred och logga var predicted rating försvinnerto fix: predicted_rating wipas av INSERT OR REPLACE i savePlayerToDB