Toter Code im Backend (Prüfung 03.10.2026) #45
Labels
No labels
Kind
Bug
Kind
Enhancement
Kind
Maintenance
Priority
P1
Priority
P2
Priority
P3
Status
In Progress
Status
Need More Info
Status
Zur Abnahme
Änderungen Wettspielreglement
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sffs-tt-basel/sffs-tt-issues#45
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
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?
Befund einer Prüfung des gesamten Backends auf toten Code (03.10.2026, Stand
mainbei8237f245).Methode: Skript über alle 343 Produktiv- und 221 Testdateien, das Typen, Methoden, Felder, Enum-Konstanten, Record-Komponenten, REST-Endpunkte und Config-Schlüssel gegen Backend, Tests, die drei Frontends, E2E, Skripte und Doku abgleicht. Dazu PMD mit den Unused-Regeln (main + test) und
mvn dependency:analyze. Jeder Kandidat ist per grep und Git-Historie gegengeprüft.1. Sicher tot im Produktivcode
TeamRequestsamt inneremTeamPlayerRequestcompetition/api/TeamRequest.javaa40ac04e(nie aufgerufenen Meldungs-Pfad entfernt)OfficialRepository.findByClubIdAndFunctioncompetition/repository/OfficialRepository.java:17610bd88c,a80588c1)VenueRepository.findByClubIdAndNamecompetition/repository/VenueRepository.java:18ce0e0260(Spiellokale fortschreiben statt löschen)UserClubMappingRepository.deleteByClubIdshared/repository/UserClubMappingRepository.java:18d9d3e1c7(DB-Kaskaden statt Java-Schleifen)GET /api/seasons/latest(getLatestSeason)competition/resource/SeasonResource.java:116SeasonResourceTest@Inject SeasonRepository seasonRepositorycompetition/service/CsvImportService.java:35undcompetition/service/LigaViewService.java:36hasPhonecompetition/service/PdfService.java:235ScrapingResultResponse.clubsImportedcompetition/api/ScrapingResultResponse.javamessage,playersImported,skippedRoles.CAPTAINshared/Roles.java:14@RolesAllowedverwenden Literale. Kein toter Code im engen Sinn, aber ein Widerspruch zur eigenen Doku2. Produktivcode, den nur Tests aufrufen
Entscheidung je Methode nötig: bewusst vorgehaltener Baustein, oder mit dem Aufrufer gestorben und vom Test künstlich am Leben gehalten.
PlayerRepository.findByNameAndClubIdb077f557(Verein als Stichtagsfrage)PlayerRepository.findByLicenseNumberAndClubIdDummyImportService, kein Produktiv-AufruferEloSnapshotRepository.findByPlayerAndSeason81ebe896(Verlauf über alle Halbrunden)EloSnapshotRepository.findBySeasonOrdered5781bdcb(Spielerverzeichnis zeigt ganze Laufbahn)JwtService.isAdminfdb3e5b2(Export/Import ausDatabaseResourceentfernt)EloService.isCutoffReachedValidity.isOpenArticleRepository.latestNewsTtvpCupBracket.participantsAtTtvpCupBracketTestdeleteByClubIdinGameDayEntryRepository,VenueRepository,RegistrationRepositoryCsvImportServiceTest3. Toter Testcode
TestSeasonNames(src/test/java/ch/sffs/tt/TestSeasonNames.java), die ganze Klasse: kein Test referenziert sie, trotz ausführlichem JavadocCupTestFixtures.staerksteMannschaft(Zeile 194): kein AufruferFixtureImportTestFixtures: die@Inject-FeldercategoryRoundRepository(Zeile 49) undmatchWeekRepository(Zeile 51) werden nie benutztGeprüft und nicht tot
CaptainReminderService(@Scheduled),CompetitionClubDirectory(CDI über das InterfaceClubDirectory),UploadSeedServiceundTestDataInitializer(@Observes StartupEvent),ProblemDetailsMapper(@Provider)FixtureImportResponse,TournamentImportResponse,SeasonSeedResponse,EloReportResponse): kein Frontend liest sie, aber die Skripte drucken die komplette JSON-Antwort, also sind sie sichtbarNebenbefunde von PMD (kein toter Code)
TournamentResource.java:458(zweimal),EloCutoffService.java:165ArticleResource.java:178SeasonSeedService.java:287ist kommentiert und gewolltVorschlag
Abschnitt 1 und 3 in einem Commit entfernen. Abschnitt 2 braucht je Methode eine Entscheidung von Olli.
Abgleich mit dem Projekt-Review vom 11.10.2026 (
docs/reviews/2026-10-11-project-review.json, Commit834d38b, liegt auffeature/phasen-kopfzeile). Der Lauf war ein Kalibrierungslauf, seine Befunde sind trotzdem einzeln geprüft. 16 der 21 Produktivcode-Punkte dieses Issues stehen dort als eigene Befunde (quality/2, alle Low). Wer dieses Issue umsetzt, behebt sie mit.Abschnitt 1 — sicher tot
TeamRequestsamtTeamPlayerRequestOfficialRepository.findByClubIdAndFunctionQUAL-a99bdcVenueRepository.findByClubIdAndNameQUAL-fd4cbfUserClubMappingRepository.deleteByClubIdQUAL-cb7f0bGET /api/seasons/latest(getLatestSeason)QUAL-4d6fb5seasonRepositoryinCsvImportServiceQUAL-d5a5e9seasonRepositoryinLigaViewServiceQUAL-fefdachasPhone(PdfService)ScrapingResultResponse.clubsImportedRoles.CAPTAINb58cdb19(10.10.) dreimal inLoginTaskServicebenutzt. Der Widerspruch zur eigenen Doku bleibt: 80 von 83@RolesAllowedinmainverwenden weiter Literale, nur dreiRoles.*Abschnitt 2 — nur Tests rufen auf
PlayerRepository.findByNameAndClubIdQUAL-ea299ePlayerRepository.findByLicenseNumberAndClubIdQUAL-8dc20dEloSnapshotRepository.findByPlayerAndSeasonQUAL-65191dEloSnapshotRepository.findBySeasonOrderedQUAL-80580fJwtService.isAdminQUAL-ce676cEloService.isCutoffReachedQUAL-2b8d13ArticleRepository.latestNewsQUAL-b415e2GameDayEntryRepository.deleteByClubIdQUAL-ba2dc1VenueRepository.deleteByClubIdQUAL-c04082RegistrationRepository.deleteByClubIdQUAL-54818aValidity.isOpenTtvpCupBracket.participantsAtAbschnitt 3 — toter Testcode
Nicht im Bericht: die Rubrik misst nur Produktivcode. Am heutigen Stand (
d8d816c) weiter vorhanden:TestSeasonNames,CupTestFixtures.staerksteMannschaft.Was das Review nicht sieht
TeamRequest(ein ganzer Typ),hasPhone(lokale Variable) undclubsImported(Record-Komponente) erfasst auch der neue Sweep nicht — er prüft Methoden, injizierte Felder und Endpunkte. Eingetragen im Rubrik-Backlog des Skills. Für dieses Issue ändert das nichts: die Punkte bleiben hier stehen.Im Review zusätzlich, nicht in diesem Issue
Backend-Code, der zum Teil erst nach dem 03.10. entstanden ist:
TeamPlayerRepository.findOpenByTeamAndPlayer(QUAL-2ca5ea),EloResource.baselineRepository(QUAL-470157),GET /api/seasons/active/name(QUAL-ac1995),HalbseriePublicationService.isPublished(QUAL-55ed96),SeasonHalbserieService.halbserieOf(QUAL-544503),SeasonSetupService.ensureCategories(QUAL-9d9752).QUAL-0bdacc(GameDayEntryRepository.findAllValidAt) ist ein Fehlalarm: der Aufrufer steht inPublicClubResource, die wegen eines rohen NUL-Bytes im Quelltext fürgrepunsichtbar ist.Umgesetzt und nach der technischen Abnahme in
main(9bc2209):mvn -B clean verify6334/6334, kein Schema-Drift, Portal 1324, E2E gegen Staging 214/214 (lauf403,f699121). Keine Migration, kein ADR — die Regel steht inCLAUDE.mdunter Java: Kein Produktivcode nur für Tests.Was mit den Abschnitten passiert ist
TeamRequestund der EndpunktGET /api/seasons/latest. Zwei Ausnahmen:Roles.CAPTAINist seitb58cdb19(10.10.) benutzt und bleibt. Dass@RolesAllowedfast überall Literale stattRoles.*verwendet, ist jetzt #116.ScrapingResultResponse.clubsImportedbleibt und wird im Portal angezeigt (Prüfschritte unten). Der Server zählt nur neu angelegte Vereine; bestehende benennt er still um, darum heisst 0 nicht „nichts passiert“.findBySeasonAndPlayers,validTo == Validity.OPEN,findByClubIdAtusw.). AusnahmeValidity.isOpen: die Methode war nicht tot, sondern ungenutzt — dieselbe Prüfung stand im Produktivcode zweimal von Hand ausgeschrieben. Sie ersetzt jetzt diese beiden Stellen.halbserieEnd,EloService.matchWeekRepository,JwtService.jwtParser.PMD-Nebenbefunde bleiben
Die überflüssigen Klammern (
TournamentResource,EloCutoffService) und der vereinfachbare Ternär (ArticleResource) sind kein toter Code, und die heutige Fassung liest sich besser: die Klammern zeigen, was zusammengehört, der Ternär nennt beide Fälle ausdrücklich. Der leere Catch inSeasonSeedServiceist kommentiert und gewollt.Prüfschritte (Staging, als Admin)
vereine.csvanlegen mit dem InhaltErwartet: Meldung „1 neuer Verein importiert“, der Verein steht in der Liste.
Erwartet: „Keine neuen Vereine, bestehende aktualisiert“.