Season-Endpunkte aufräumen: zwei ohne Aufrufer weg, clubCount überall, playerCount weg, 409 statt 400 #130
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#130
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?
Entschieden am 22.10.2026 im Zalando-Review von
/api/seasons(Punkte d bis g). Für die Nutzer ändert sich nichts.d. Zwei Endpunkte ohne Aufrufer löschen
Nach CLAUDE.md „Kein Produktivcode nur für Tests“ (#45) fallen beide weg, zusammen mit ihren Tests.
PUT /api/seasons/{id}(SeasonResource.updateSeason) ändert nur den Namen. Keine Oberfläche, kein Skript ruft ihn auf. Tests: die PUT-Fälle inSeasonResourceTest(Z. 66, 172, 263) und inSeasonNameFormatTest(Z. 81). Die Formatprüfung beim Anlegen bleibt und ist dort weiter getestet.GET /api/seasons/active/name(getActiveSeasonName,text/plain). Tests:SeasonActiveNameTestund der/active/name-Fall inSeasonActiveEmptyTest. Die Zeile inARCHITECTURE.md:97, die ihn als Beispiel für@PermitAllnennt, bekommt ein anderes Beispiel. Im Kommentar an #129 steht „hier oder beim Aufräumen“: Er fällt hier weg.SeasonRequest: Der Record dient danach nur noch dem Anlegen.preparationDatewird im Schema Pflichtfeld (@Schema(nullable = true)weg), die Prüfung im Backend bleibt. Das Javadoc („dient POST und PUT“) wird angepasst.e.
{id}→{seasonId}In
SeasonResource(getSeason,setPhase,enterPhaseDate) heisst der Pfad-Parameter wie bei den Unterressourcen{seasonId}. Die URL bleibt gleich, es ändern sich nur@PathParamund der Name inopenapi.json. Zalando schreibt dazu nichts vor, es geht nur um Einheitlichkeit. Die anderen fünf Ressourcen mit gemischten Namen (clubs,categories,players,team-matches,eventsmit{eid}) folgen, wenn ihr Knoten im Durchgang dran ist.f.
clubCountüberall,playerCountwegHeute füllt nur
GET /api/seasonsbeide Zahlen.GET /{id},/activeund das Anlegen liefern denselbenSeasonResponsemit fest 0 (Zusatzkonstruktor inSeasonResponse). Das verstösst gegen „Eine Bedeutung je Feld“.playerCountfällt weg. Niemand liest ihn. Die Dashboard-Kachel kommt aus/players/count, das bleibt. Danach habenPlayerRepository.countBySeasonIdund die Injektion vonSeasonReferenceDateinSeasonResourcekeinen Aufrufer mehr und fallen ebenfalls weg, sofern nichts anderes sie braucht (prüfen).clubCountsteht in jeder Antwort, gezählt mitClubRepository.countBySeasonId. Heute lädt die Liste stattdessen alle Vereine je Saison und nimmt.size(). Der Zusatzkonstruktor mit der 0 fällt weg.SeasonResourcemacht denArchitectureTestrot. Entfallen dadurch eingefrorene Verstösse vonSeasonResource(findBySeasonId,countBySeasonId,getActiveSeasonName), schrumpft der Store, und er wird mitcommittet.g. Datum einer noch nicht erreichten Phase: 409 statt 400
PUT /api/seasons/{seasonId}/phase-dates/{phase}mit einer Phase nach der aktuellen antwortet409 Conflictstatt400. Die Anfrage ist richtig gebaut, sie passt nur nicht zum Stand der Saison. Der Text „Diese Phase ist noch nicht erreicht“ bleibt. Über die Oberfläche kommt der Fall nicht vor, weilPhaseDialog.tsx:89nur erreichte Phasen bearbeiten lässt. Den Test, der heute 400 erwartet, findet der Bau beim Umstellen (SeasonPhaseEndpointTest,MeldeschlussNachtragenTestoderSeasonResourceTest).Abnahme
mvn -B clean verify, die Frontend-Builds, E2E undmetrics.py diffsind grün. Der ArchUnit-Store wächst nicht.openapi.json:PUT /api/seasons/{seasonId}und kein/active/namemehr.SeasonResponseohneplayerCount.SeasonRequestistpreparationDatePflicht.seasonId.GET /{seasonId}und erwartetclubCount> 0. Heute schlägt er fehl.