diff --git a/TODO b/TODO index 98d109a..2327a5e 100644 --- a/TODO +++ b/TODO @@ -35,4 +35,6 @@ ALTER TABLE tournament_player ADD counts bigint; UPDATE tournament_player SET counting = false; -UPDATE tournament_player SET counts = 0; \ No newline at end of file +UPDATE tournament_player SET counts = 0; + +tournament_player.substitute_id + constraint \ No newline at end of file diff --git a/src/main/java/nl/connectedit/swiss/controller/TournamentController.java b/src/main/java/nl/connectedit/swiss/controller/TournamentController.java index ac76dd6..2e2be69 100755 --- a/src/main/java/nl/connectedit/swiss/controller/TournamentController.java +++ b/src/main/java/nl/connectedit/swiss/controller/TournamentController.java @@ -196,10 +196,10 @@ public class TournamentController { return ResponseEntity.noContent().build(); } - @PostMapping("/tournaments/{tournamentId}/players/{playerId}/substitute/{substituteId}") - public ResponseEntity substitutePlayer(@PathVariable Long tournamentId, @PathVariable Long playerId, @PathVariable Long substituteId) { + @PostMapping("/tournaments/{tournamentId}/players/{playerId}/event/{eventId}/substitute/{substituteId}") + public ResponseEntity 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))); } } diff --git a/src/main/java/nl/connectedit/swiss/domain/entity/TournamentPlayer.java b/src/main/java/nl/connectedit/swiss/domain/entity/TournamentPlayer.java index 7d43cb9..a7b4da5 100644 --- a/src/main/java/nl/connectedit/swiss/domain/entity/TournamentPlayer.java +++ b/src/main/java/nl/connectedit/swiss/domain/entity/TournamentPlayer.java @@ -33,6 +33,9 @@ public class TournamentPlayer extends AbstractEntity { private Long counts = 0L; + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List substitutions; + public void incrementCounts() { this.counts++; } diff --git a/src/main/java/nl/connectedit/swiss/domain/entity/TournamentPlayerSubstitution.java b/src/main/java/nl/connectedit/swiss/domain/entity/TournamentPlayerSubstitution.java new file mode 100644 index 0000000..a257328 --- /dev/null +++ b/src/main/java/nl/connectedit/swiss/domain/entity/TournamentPlayerSubstitution.java @@ -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; + +} diff --git a/src/main/java/nl/connectedit/swiss/dto/TournamentDto.java b/src/main/java/nl/connectedit/swiss/dto/TournamentDto.java index e3fce0e..aea0f77 100644 --- a/src/main/java/nl/connectedit/swiss/dto/TournamentDto.java +++ b/src/main/java/nl/connectedit/swiss/dto/TournamentDto.java @@ -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 substitutions; + } diff --git a/src/main/java/nl/connectedit/swiss/dto/TournamentPlayerDto.java b/src/main/java/nl/connectedit/swiss/dto/TournamentPlayerDto.java index 6a18dfe..1b2ccf3 100644 --- a/src/main/java/nl/connectedit/swiss/dto/TournamentPlayerDto.java +++ b/src/main/java/nl/connectedit/swiss/dto/TournamentPlayerDto.java @@ -24,4 +24,6 @@ public class TournamentPlayerDto extends AbstractDto { private Long counts; + private List substitutions; + } diff --git a/src/main/java/nl/connectedit/swiss/dto/TournamentPlayerSubstitutionDto.java b/src/main/java/nl/connectedit/swiss/dto/TournamentPlayerSubstitutionDto.java new file mode 100644 index 0000000..db1c9e2 --- /dev/null +++ b/src/main/java/nl/connectedit/swiss/dto/TournamentPlayerSubstitutionDto.java @@ -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; +} diff --git a/src/main/java/nl/connectedit/swiss/mapper/TournamentPlayerMapper.java b/src/main/java/nl/connectedit/swiss/mapper/TournamentPlayerMapper.java index 722d514..e93d689 100644 --- a/src/main/java/nl/connectedit/swiss/mapper/TournamentPlayerMapper.java +++ b/src/main/java/nl/connectedit/swiss/mapper/TournamentPlayerMapper.java @@ -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 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) { diff --git a/src/main/java/nl/connectedit/swiss/service/TournamentPlayService.java b/src/main/java/nl/connectedit/swiss/service/TournamentPlayService.java index d9880c9..e3065ef 100644 --- a/src/main/java/nl/connectedit/swiss/service/TournamentPlayService.java +++ b/src/main/java/nl/connectedit/swiss/service/TournamentPlayService.java @@ -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 tryMatches(List 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);