Invallers
All checks were successful
Gitea/swiss-backend/pipeline/head This commit looks good

This commit is contained in:
2025-09-11 23:43:10 +02:00
parent d7dee35d6e
commit da7ea66d3e
10 changed files with 111 additions and 9 deletions

4
TODO
View File

@@ -35,4 +35,6 @@ ALTER TABLE tournament_player
ADD counts bigint;
UPDATE tournament_player SET counting = false;
UPDATE tournament_player SET counts = 0;
UPDATE tournament_player SET counts = 0;
tournament_player.substitute_id + constraint

View File

@@ -196,10 +196,10 @@ public class TournamentController {
return ResponseEntity.noContent().build();
}
@PostMapping("/tournaments/{tournamentId}/players/{playerId}/substitute/{substituteId}")
public ResponseEntity<TournamentDto> substitutePlayer(@PathVariable Long tournamentId, @PathVariable Long playerId, @PathVariable Long substituteId) {
@PostMapping("/tournaments/{tournamentId}/players/{playerId}/event/{eventId}/substitute/{substituteId}")
public ResponseEntity<TournamentDto> substitutePlayer(@PathVariable Long tournamentId, @PathVariable Long playerId, @PathVariable Long eventId, @PathVariable Long substituteId) {
var tournament = tournamentService.findTournamentById(tournamentId);
return ResponseEntity.ok(tournamentMapper.toDto(tournamentPlayService.substitutePlayer(tournament, playerId, substituteId)));
return ResponseEntity.ok(tournamentMapper.toDto(tournamentPlayService.substitutePlayer(tournament, eventId, playerId, substituteId)));
}
}

View File

@@ -33,6 +33,9 @@ public class TournamentPlayer extends AbstractEntity {
private Long counts = 0L;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<TournamentPlayerSubstitution> substitutions;
public void incrementCounts() {
this.counts++;
}

View File

@@ -0,0 +1,28 @@
package nl.connectedit.swiss.domain.entity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Entity
@Table
@Getter
@Setter
public class TournamentPlayerSubstitution extends AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private TournamentPlayer tournamentPlayer;
@ManyToOne
private Event event;
@ManyToOne
private TournamentPlayer substitute;
}

View File

@@ -3,6 +3,7 @@ package nl.connectedit.swiss.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import nl.connectedit.swiss.domain.entity.TournamentPlayerSubstitution;
import java.util.List;
@@ -31,4 +32,6 @@ public class TournamentDto extends AbstractDto {
private Boolean active;
private List<TournamentPlayerSubstitutionDto> substitutions;
}

View File

@@ -24,4 +24,6 @@ public class TournamentPlayerDto extends AbstractDto {
private Long counts;
private List<TournamentPlayerSubstitutionDto> substitutions;
}

View File

@@ -0,0 +1,15 @@
package nl.connectedit.swiss.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class TournamentPlayerSubstitutionDto extends AbstractDto {
private Long substitutionId;
private String event;
private TournamentPlayerDto substitute;
}

View File

@@ -3,8 +3,10 @@ package nl.connectedit.swiss.mapper;
import lombok.RequiredArgsConstructor;
import nl.connectedit.swiss.domain.entity.Team;
import nl.connectedit.swiss.domain.entity.TournamentPlayer;
import nl.connectedit.swiss.domain.entity.TournamentPlayerSubstitution;
import nl.connectedit.swiss.dto.TeamDto;
import nl.connectedit.swiss.dto.TournamentPlayerDto;
import nl.connectedit.swiss.dto.TournamentPlayerSubstitutionDto;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
@@ -23,7 +25,24 @@ public class TournamentPlayerMapper implements DtoMapper<TournamentPlayer, Tourn
tournamentPlayerDto.setPresent(tournamentPlayer.isPresent());
tournamentPlayerDto.setCounting(tournamentPlayer.isCounting());
tournamentPlayerDto.setCounts(tournamentPlayer.getCounts());
if (tournamentPlayer.getSubstitutions() != null) {
tournamentPlayerDto.setSubstitutions(
tournamentPlayer.getSubstitutions()
.stream()
.map(this::mapSubstitution)
.toList());
}
return tournamentPlayerDto;
}
private TournamentPlayerSubstitutionDto mapSubstitution(TournamentPlayerSubstitution tournamentPlayerSubstitution) {
var tournamentPlayerSubstitutionDto = new TournamentPlayerSubstitutionDto();
tournamentPlayerSubstitutionDto.setEvent(tournamentPlayerSubstitution.getEvent().getType().name());
if (tournamentPlayerSubstitution.getSubstitute() != null) {
tournamentPlayerSubstitutionDto.setSubstitute(toDto(tournamentPlayerSubstitution.getSubstitute()));
}
return tournamentPlayerSubstitutionDto;
}
}

View File

@@ -53,11 +53,19 @@ public class RegistrationService {
private void removeEventFromTournamentPlayer(Tournament tournament, Player player, Event event) {
var tournamentPlayer = findOrAddTournamentPlayer(tournament, player);
tournamentPlayer.getEvents().removeIf(eventType -> eventType.equals(event.getType().name()));
tournamentPlayer.getSubstitutions().removeIf(substitution -> substitution.getEvent().equals(event));
}
private void addEventToTournamentPlayer(Tournament tournament, Player player, Event event) {
var tournamentPlayer = findOrAddTournamentPlayer(tournament, player);
tournamentPlayer.getEvents().add(event.getType().name());
if (tournamentPlayer.getSubstitutions() == null) {
tournamentPlayer.setSubstitutions(new ArrayList<>());
}
var substitution = new TournamentPlayerSubstitution();
substitution.setEvent(event);
substitution.setSubstitute(null);
tournamentPlayer.getSubstitutions().add(substitution);
}
private TournamentPlayer findOrAddTournamentPlayer(Tournament tournament, Player player) {

View File

@@ -183,10 +183,32 @@ public class TournamentPlayService {
}
}
public Tournament substitutePlayer(Tournament tournament, Long playerId, Long substituteId) {
public Tournament substitutePlayer(Tournament tournament, Long eventId, Long playerId, Long substituteId) {
var event = getEvent(tournament, eventId);
var tournamentPlayer = getTournamentPlayer(tournament, playerId);
var substitute = getTournamentPlayer(tournament, substituteId);
var substitution = new TournamentPlayerSubstitution();
substitution.setEvent(event);
substitution.setTournamentPlayer(tournamentPlayer);
substitution.setSubstitute(substitute);
tournamentPlayer.getSubstitutions().add(substitution); //TODO
tournamentRepository.save(tournament);
return tournament;
}
private Event getEvent(Tournament tournament, Long eventId) {
for (var event : tournament.getEvents()) {
if (event.getId().equals(eventId)) {
return event;
}
}
return null;
}
private static class ConflictInDrawException extends RuntimeException {}
private List<Match> tryMatches(List<Team> remainingTeams, Group group) {
@@ -251,7 +273,7 @@ public class TournamentPlayService {
match.setStartTime(LocalDateTime.now());
match.setCourt(court);
var countingPlayer = getPlayer(tournament, counter);
var countingPlayer = getTournamentPlayer(tournament, counter);
countingPlayer.setCounting(true);
match.setCounter(countingPlayer.getPlayer());
@@ -259,7 +281,7 @@ public class TournamentPlayService {
return tournament;
}
private TournamentPlayer getPlayer(Tournament tournament, Long playerId) {
private TournamentPlayer getTournamentPlayer(Tournament tournament, Long playerId) {
for (var tournamentPlayer : tournament.getTournamentPlayers()) {
if (playerId.equals(tournamentPlayer.getPlayer().getId())) {
return tournamentPlayer;
@@ -274,7 +296,7 @@ public class TournamentPlayService {
match.setStartTime(null);
match.setCourt(null);
var countingPlayer = getPlayer(tournament, match.getCounter().getId());
var countingPlayer = getTournamentPlayer(tournament, match.getCounter().getId());
countingPlayer.setCounting(false);
match.setCounter(null);
@@ -294,7 +316,7 @@ public class TournamentPlayService {
var counter = match.getCounter();
if (counter != null) { // match was already saved, this is a correction
var countingPlayer = getPlayer(tournament, counter.getId());
var countingPlayer = getTournamentPlayer(tournament, counter.getId());
countingPlayer.setCounting(false);
countingPlayer.incrementCounts();
match.setCounter(null);