Cup-Runde fortschreiben: Eintrag ohne oder mit falschem Platz wird still übergangen #141

Open
opened 2026-10-24 13:00:57 +00:00 by claude · 1 comment
Collaborator

Beim Fortschreiben einer Cup-Runde (POST /api/competition/cup/{categoryId}/rounds/{number}/matches, ab URL-Neuordnung Etappe 3 POST /api/team-matches mit cupCategoryId) trägt jeder Eintrag einen Platz (position), dazu freiwillig Heimteam und Termin.

Was passiert: CupAdvanceEntry.position ist ein int. Fehlt das Feld im Inhalt, wird es still zu 0. CupTableauService.advance (Zeile ~401) legt die Wünsche nach Platz ab und liest sie nur für die Plätze, die bereit sind. Ein Eintrag mit Platz 0 — oder mit einem Platz, den es in der Runde nicht gibt, etwa 99 — wird darum ohne Meldung übergangen: Die Begegnung entsteht mit dem gerechneten Heimrecht und ohne Termin, obwohl der Aufrufer beides angegeben hat.

Beispiel: {"entries":[{"homeTeamId":12,"scheduledAt":"2026-11-05T19:30:00"}]} → 200/201, die Begegnung hat ein anderes Heimteam und keinen Termin.

Erwartet: 400, wenn position fehlt oder keinen bereiten Platz der Runde bezeichnet (wie beim Setzen des Tableaus, resolveEntries, Zeile ~135: „Platz … liegt ausserhalb …“). Dazu im Schema position als Pflichtfeld (Integer mit Prüfung statt int).

Das Portal schickt position immer mit (CupTableau.tsx), betroffen sind andere Aufrufer und veraltete Tabs. Gefunden im Review des Plans zu Etappe 3 (24.10.), dort bewusst nicht mitgebaut.

Beim Fortschreiben einer Cup-Runde (`POST /api/competition/cup/{categoryId}/rounds/{number}/matches`, ab URL-Neuordnung Etappe 3 `POST /api/team-matches` mit `cupCategoryId`) trägt jeder Eintrag einen Platz (`position`), dazu freiwillig Heimteam und Termin. **Was passiert:** `CupAdvanceEntry.position` ist ein `int`. Fehlt das Feld im Inhalt, wird es still zu `0`. `CupTableauService.advance` (Zeile ~401) legt die Wünsche nach Platz ab und liest sie nur für die Plätze, die bereit sind. Ein Eintrag mit Platz `0` — oder mit einem Platz, den es in der Runde nicht gibt, etwa `99` — wird darum ohne Meldung übergangen: Die Begegnung entsteht mit dem gerechneten Heimrecht und ohne Termin, obwohl der Aufrufer beides angegeben hat. **Beispiel:** `{"entries":[{"homeTeamId":12,"scheduledAt":"2026-11-05T19:30:00"}]}` → `200`/`201`, die Begegnung hat ein anderes Heimteam und keinen Termin. **Erwartet:** `400`, wenn `position` fehlt oder keinen bereiten Platz der Runde bezeichnet (wie beim Setzen des Tableaus, `resolveEntries`, Zeile ~135: „Platz … liegt ausserhalb …“). Dazu im Schema `position` als Pflichtfeld (`Integer` mit Prüfung statt `int`). Das Portal schickt `position` immer mit (`CupTableau.tsx`), betroffen sind andere Aufrufer und veraltete Tabs. Gefunden im Review des Plans zu Etappe 3 (24.10.), dort bewusst nicht mitgebaut.
Author
Collaborator

Dazu aus dem Review von Etappe 3 (24.10.): Ein Eintrag null in entries ({"entries":[null]}) führt in CupTableauService.advance zu einer NullPointerException (wunsch.put(entry.position(), …)) und damit zu 500. Gehört zur selben Prüfung der Einträge: 400 mit Fehlertext statt 500. Betrifft ab Etappe 3 POST /api/team-matches mit cupCategoryId.

Dazu aus dem Review von Etappe 3 (24.10.): Ein Eintrag `null` in `entries` (`{"entries":[null]}`) führt in `CupTableauService.advance` zu einer NullPointerException (`wunsch.put(entry.position(), …)`) und damit zu `500`. Gehört zur selben Prüfung der Einträge: `400` mit Fehlertext statt `500`. Betrifft ab Etappe 3 `POST /api/team-matches` mit `cupCategoryId`.
Sign in to join this conversation.
No description provided.