Move to new server

This commit is contained in:
2024-10-12 13:37:59 +02:00
commit 2959eb5cfd
111 changed files with 12795 additions and 0 deletions

View File

@@ -0,0 +1,279 @@
package nl.connectedit.swiss.service;
import lombok.RequiredArgsConstructor;
import lombok.extern.java.Log;
import nl.connectedit.swiss.domain.Status;
import nl.connectedit.swiss.domain.TournamentStatus;
import nl.connectedit.swiss.domain.entity.*;
import nl.connectedit.swiss.dto.ResultDto;
import nl.connectedit.swiss.dto.StandingsEntry;
import nl.connectedit.swiss.repository.TournamentRepository;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Random;
import java.util.stream.Collectors;
import static nl.connectedit.swiss.service.ServiceUtil.*;
@Service
@RequiredArgsConstructor
@Log
public class TournamentPlayService {
private final TournamentRepository tournamentRepository;
private final StandingsService standingsService;
public Tournament startRound(Tournament tournament, Long roundId) {
getRound(tournament, roundId).setStatus(Status.IN_PROGRESS);
tournament.setStatus(TournamentStatus.ONGOING);
tournamentRepository.save(tournament);
return tournament;
}
public Tournament finishRound(Tournament tournament, Long roundId) {
getRound(tournament, roundId).setStatus(Status.FINISHED);
tournamentRepository.save(tournament);
return tournament;
}
public Tournament finishGroup(Tournament tournament, Long groupId) {
getGroup(tournament, groupId).setStatus(Status.FINISHED);
tournamentRepository.save(tournament);
return tournament;
}
public Tournament newRound(Tournament tournament, Long groupId) {
var group = getGroup(tournament, groupId);
var standings = standingsService.getStandings(group.getRounds(), group.getTeams());
var remainingTeams = standings.stream()
.map(StandingsEntry::getTeam)
.collect(Collectors.toCollection(ArrayList::new));
var round = new Round();
round.setName("Ronde " + (group.getRounds().size() + 1));
round.setGroup(group);
round.setStatus(Status.NOT_STARTED);
if (remainingTeams.size() % 2 == 1) {
var random = new Random();
var drawnOutPlayers = getDrawnOutPlayers(tournament);
do {
var randomTeam = remainingTeams.get(random.nextInt(remainingTeams.size()));
if (!drawnOutPlayers.contains(randomTeam.getPlayer1()) && (randomTeam.getPlayer2() == null || !drawnOutPlayers.contains(randomTeam.getPlayer2()))) {
remainingTeams.remove(randomTeam);
round.setDrawnOut(randomTeam);
break;
}
} while(true);
}
var matches = tryMatches(remainingTeams, group).reversed();
for (var match : matches) {
match.setType(group.getType());
match.setStatus(Status.NOT_STARTED);
match.setPlayed(false);
match.setRound(round);
}
round.setMatches(matches);
printRound(round, standings);
group.getRounds().add(round);
tournamentRepository.save(tournament);
return tournament;
}
private List<Player> getDrawnOutPlayers(Tournament tournament) {
var players = new ArrayList<Player>();
for (var event : tournament.getEvents()) {
for (var group : event.getGroups()) {
var playersInGroup = group.getTeams().stream()
.map(this::getPlayersInTeam)
.flatMap(List::stream)
.toList();
for (var player : playersInGroup) {
for (var round : group.getRounds()) {
var foundInRound = false;
for (var match : round.getMatches()) {
if (playerIsInMatch(match, player)) {
foundInRound = true;
}
}
if (!foundInRound) {
players.add(player);
log.info(player.getFullName() + " is al uitgeloot in het toernooi.");
}
}
}
}
}
return players;
}
private List<Player> getPlayersInTeam(Team team) {
return team.getPlayer2() == null ? List.of(team.getPlayer1()) : List.of(team.getPlayer1(), team.getPlayer2());
}
private boolean playerIsInTeam(Team team, Player player) {
return Objects.equals(team.getPlayer1(), player) || Objects.equals(team.getPlayer2(), player);
}
private boolean playerIsInMatch(Match match, Player player) {
return playerIsInTeam(match.getTeam1(), player) || playerIsInTeam(match.getTeam2(), player);
}
private void printRound(Round round, List<StandingsEntry> standings) {
for (var match: round.getMatches()) {
log.info("%s - %s".formatted(
String.valueOf(standings.stream().filter(entry -> entry.getTeam().equals(match.getTeam1())).map(StandingsEntry::getPosition).findFirst().get()),
String.valueOf(standings.stream().filter(entry -> entry.getTeam().equals(match.getTeam2())).map(StandingsEntry::getPosition).findFirst().get())));
}
}
private static class ConflictInDrawException extends RuntimeException {}
private List<Match> tryMatches(List<Team> remainingTeams, Group group) {
var newMatches = new ArrayList<Match>();
if (remainingTeams.isEmpty()) {
return newMatches;
}
var newMatch = new Match();
newMatch.setTeam1(remainingTeams.getFirst());
for (var opponentIndex = 1; opponentIndex < remainingTeams.size(); opponentIndex++) {
if (!findPreviousMatchOccurence(newMatch.getTeam1(), remainingTeams.get(opponentIndex), group)) {
newMatch.setTeam2(remainingTeams.get(opponentIndex));
} else {
log.info("Wedstrijd %s - %s kwam al eerder voor.".formatted(newMatch.getTeam1().toString(), remainingTeams.get(opponentIndex).toString()));
continue;
}
var newRemainingTeams = getRemainingTeams(remainingTeams, opponentIndex);
if (newRemainingTeams.size() == 1) {
newMatches.add(newMatch);
break;
} else {
try {
newMatches.addAll(tryMatches(newRemainingTeams, group));
newMatches.add(newMatch);
break;
} catch (ConflictInDrawException ignored) {
}
}
}
if (newMatch.getTeam2() == null) {
log.info("Geen tegenstander gevonden voor %s.".formatted(newMatch.getTeam1().toString()));
throw new ConflictInDrawException();
}
return newMatches;
}
private List<Team> getRemainingTeams(List<Team> remainingTeams, int opponentIndex) {
var newRemainingTeams = new ArrayList<Team>();
for (var remainingTeamIndex = 1; remainingTeamIndex < remainingTeams.size(); remainingTeamIndex++) {
if (remainingTeamIndex == opponentIndex) continue;
newRemainingTeams.add(remainingTeams.get(remainingTeamIndex));
}
return newRemainingTeams;
}
private boolean findPreviousMatchOccurence(Team team1, Team team2, Group group) {
for (var round : group.getRounds()) {
for (var match : round.getMatches()) {
if ((Objects.equals(match.getTeam1(), team1) && Objects.equals(match.getTeam2(), team2))
|| (Objects.equals(match.getTeam1(), team2) && Objects.equals(match.getTeam2(), team1))) {
return true;
}
}
}
return false;
}
private boolean playerHasSkippedRoundBefore(Player player, Tournament tournament) {
var hasSkippedRound = false;
return hasSkippedRound;
}
public Tournament startMatch(Tournament tournament, Long matchId, Long court) {
var match = getMatch(tournament, matchId);
match.setStatus(Status.IN_PROGRESS);
match.setStartTime(LocalDateTime.now());
match.setCourt(court);
tournamentRepository.save(tournament);
return tournament;
}
public Tournament stopMatch(Tournament tournament, Long matchId) {
var match = getMatch(tournament, matchId);
match.setStatus(Status.NOT_STARTED);
match.setStartTime(null);
match.setCourt(null);
tournamentRepository.save(tournament);
return tournament;
}
public Tournament saveResult(Tournament tournament, Long matchId, ResultDto result) {
var match = getMatch(tournament, matchId);
if (match.getGames().isEmpty()) {
match.setEndTime(LocalDateTime.now());
match.setStatus(Status.FINISHED);
match.setPlayed(true);
}
match.getGames().clear();
match.getGames().addAll(resultToGames(result, match));
tournamentRepository.save(tournament);
return tournament;
}
private List<Game> resultToGames(ResultDto result, Match match) {
var games = new ArrayList<Game>();
for (var game : result.getGames()) {
if (game.getScore1() != null) {
games.add(Game.builder()
.score1(game.getScore1())
.score2(game.getScore2())
.match(match)
.build());
}
}
return games;
}
public void updatePaid(Tournament tournament, Long playerId, Boolean paid) {
var tournamentPlayer = tournament.getTournamentPlayers()
.stream()
.filter(player -> player.getPlayer().getId().equals(playerId))
.findFirst()
.get();
tournamentPlayer.setPaid(paid);
tournamentRepository.save(tournament);
}
public void updatePresent(Tournament tournament, Long playerId, Boolean present) {
var tournamentPlayer = tournament.getTournamentPlayers()
.stream()
.filter(player -> player.getPlayer().getId().equals(playerId))
.findFirst()
.get();
tournamentPlayer.setPresent(present);
tournamentRepository.save(tournament);
}
}