package com.flexpoker.web.controller;
import java.security.Principal;
import java.util.List;
import java.util.UUID;
import javax.inject.Inject;
import org.springframework.messaging.handler.annotation.MessageExceptionHandler;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.annotation.SendToUser;
import org.springframework.messaging.simp.annotation.SubscribeMapping;
import org.springframework.stereotype.Controller;
import com.flexpoker.framework.command.CommandSender;
import com.flexpoker.game.command.commands.CreateGameCommand;
import com.flexpoker.game.command.commands.JoinGameCommand;
import com.flexpoker.game.command.framework.GameCommandType;
import com.flexpoker.game.query.dto.GameInListDTO;
import com.flexpoker.game.query.dto.OpenGameForUser;
import com.flexpoker.game.query.repository.GameListRepository;
import com.flexpoker.game.query.repository.OpenGameForPlayerRepository;
import com.flexpoker.login.repository.LoginRepository;
import com.flexpoker.web.dto.incoming.CreateGameDTO;
@Controller
public class GameManagementController {
private final OpenGameForPlayerRepository openGameForUserRepository;
private final CommandSender<GameCommandType> commandSender;
private final LoginRepository loginRepository;
private final GameListRepository gameRepository;
@Inject
public GameManagementController(
OpenGameForPlayerRepository openGameForUserRepository,
CommandSender<GameCommandType> commandSender,
LoginRepository loginRepository, GameListRepository gameRepository) {
this.openGameForUserRepository = openGameForUserRepository;
this.commandSender = commandSender;
this.loginRepository = loginRepository;
this.gameRepository = gameRepository;
}
@SubscribeMapping("/topic/availabletournaments")
public List<GameInListDTO> displayAllGames() {
return gameRepository.fetchAll();
}
@SubscribeMapping("/app/opengamesforuser")
public List<OpenGameForUser> displayOpenGames(Principal principal) {
UUID playerId = loginRepository.fetchAggregateIdByUsername(principal.getName());
return openGameForUserRepository.fetchAllOpenGamesForPlayer(playerId);
}
@MessageMapping("/app/creategame")
public void createGame(CreateGameDTO model, Principal principal) {
UUID playerId = loginRepository.fetchAggregateIdByUsername(principal.getName());
CreateGameCommand command = new CreateGameCommand(model.getName(),
model.getPlayers(), model.getPlayersPerTable(), playerId,
model.getNumberOfMinutesBetweenBlindLevels());
commandSender.send(command);
}
@MessageMapping("/app/joingame")
public void joinGame(UUID gameId, Principal principal) {
UUID playerId = loginRepository.fetchAggregateIdByUsername(principal.getName());
JoinGameCommand command = new JoinGameCommand(gameId, playerId);
commandSender.send(command);
}
@MessageExceptionHandler
@SendToUser("/queue/errors")
public String handleException(Throwable exception) {
return exception.getMessage();
}
}