Skip to content

Commit

Permalink
clone configuration (#19)
Browse files Browse the repository at this point in the history
Part of Gamify-IT/issues#387

Adds the option to clone a configuration.
  • Loading branch information
Aaron2000119 authored Apr 11, 2023
1 parent 2a816b4 commit 7ccea59
Show file tree
Hide file tree
Showing 23 changed files with 257 additions and 142 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,21 @@
import de.unistuttgart.towercrushbackend.data.mapper.QuestionMapper;
import de.unistuttgart.towercrushbackend.repositories.ConfigurationRepository;
import de.unistuttgart.towercrushbackend.service.ConfigService;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;
import java.util.UUID;

/**
* This controller handles all game-configuration-related REST-APIs
*/
@RestController
@RequestMapping("/configurations")
@Import({JWTValidatorService.class})
@Import({ JWTValidatorService.class })
@Slf4j
public class ConfigController {

Expand Down Expand Up @@ -140,4 +139,12 @@ public Set<QuestionDTO> getQuestions(
log.debug("get configuration {}", id);
return configurationMapper.configurationToConfigurationDTO(configService.getConfiguration(id)).getQuestions();
}

@PostMapping("/{id}/clone")
@ResponseStatus(HttpStatus.CREATED)
public UUID cloneConfiguration(@CookieValue("access_token") final String accessToken, @PathVariable final UUID id) {
jwtValidatorService.validateTokenOrThrow(accessToken);
jwtValidatorService.hasRolesOrThrow(accessToken, List.of("lecturer"));
return configService.cloneConfiguration(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
*/
@RestController
@RequestMapping("/results")
@Import({JWTValidatorService.class})
@Import({ JWTValidatorService.class })
@Slf4j
public class GameResultController {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package de.unistuttgart.towercrushbackend.controller.components;

import lombok.extern.slf4j.Slf4j;

import java.security.Principal;
import lombok.extern.slf4j.Slf4j;

/**
* This Class overrides the User implementation used for the websocket subscriptions.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
package de.unistuttgart.towercrushbackend.controller.components;

import static org.springframework.messaging.support.NativeMessageHeaderAccessor.NATIVE_HEADERS;

import java.util.ArrayList;
import java.util.Map;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.messaging.support.MessageHeaderAccessor;

import java.util.ArrayList;
import java.util.Map;

import static org.springframework.messaging.support.NativeMessageHeaderAccessor.NATIVE_HEADERS;

public class UserInterceptor implements ChannelInterceptor {

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
import de.unistuttgart.towercrushbackend.service.websockets.GameService;
import de.unistuttgart.towercrushbackend.service.websockets.LobbyManagerService;
import de.unistuttgart.towercrushbackend.service.websockets.WebsocketService;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
Expand All @@ -15,13 +21,6 @@
import org.springframework.web.socket.messaging.SessionDisconnectEvent;
import org.springframework.web.socket.messaging.SessionSubscribeEvent;

import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
* The WebsocketListener handles websocket events like connections and subscriptions.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@
import de.unistuttgart.towercrushbackend.service.websockets.GameService;
import de.unistuttgart.towercrushbackend.service.websockets.LobbyManagerService;
import de.unistuttgart.towercrushbackend.service.websockets.WebsocketService;
import java.security.Principal;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;

import java.security.Principal;
import java.util.UUID;

@Controller
@Slf4j
public class WebsocketController {
Expand Down Expand Up @@ -42,10 +41,8 @@ public class WebsocketController {
* @throws JsonProcessingException if the information that should be sent could not be parsed
*/
@MessageMapping("/get/infos/on/join/{lobby}")
public void getInfosOnJoinLobby(
@DestinationVariable final String lobby,
final Principal user
) throws JsonProcessingException {
public void getInfosOnJoinLobby(@DestinationVariable final String lobby, final Principal user)
throws JsonProcessingException {
log.info("Send lobby infos to newly joined User: " + user.getName());
final String sendTo = user.getName();
final Message updateLobbyMassage = new UpdateLobbyMassage(lobbyManagerService.getLobby(lobby));
Expand Down Expand Up @@ -89,10 +86,8 @@ public void joinTeam(
* @throws JsonProcessingException if the information that should be sent could not be parsed
*/
@MessageMapping("/lobby/{lobby}/change-ready")
public void changeReady(
@DestinationVariable final String lobby,
final Principal user
) throws JsonProcessingException {
public void changeReady(@DestinationVariable final String lobby, final Principal user)
throws JsonProcessingException {
final UUID playerUUID = UUID.fromString(user.getName());
final Player player = lobbyManagerService.getPlayerFromLobby(lobby, playerUUID);
log.info("lobby '{}' player '{}' changedReady", lobby, player.getPlayerName());
Expand All @@ -107,9 +102,7 @@ public void changeReady(
* @throws JsonProcessingException if the information that should be sent could not be parsed
*/
@MessageMapping("/lobby/{lobby}/start-game")
public void startGame(
@DestinationVariable final String lobby
) throws JsonProcessingException {
public void startGame(@DestinationVariable final String lobby) throws JsonProcessingException {
log.info("lobby '{}' started", lobby);
lobbyManagerService.startGame(lobby);
broadcastLobbyUpdate(lobby);
Expand Down Expand Up @@ -146,10 +139,7 @@ public void voteAnswer(
* @param team team that requested "evaluateAnswers"
*/
@MessageMapping("/lobby/{lobby}/evaluate/answers/team/{team}")
public void evaluateAnswers(
@DestinationVariable final String lobby,
@DestinationVariable final String team
) {
public void evaluateAnswers(@DestinationVariable final String lobby, @DestinationVariable final String team) {
gameService.evaluateAnswers(lobby, team);
}

Expand All @@ -161,10 +151,8 @@ public void evaluateAnswers(
* @throws JsonProcessingException if the information that should be sent could not be parsed
*/
@MessageMapping("/init/Game/{lobby}/configurationId/{configurationId}")
public void initGame(
@DestinationVariable final String lobby,
@DestinationVariable final UUID configurationId
) throws JsonProcessingException {
public void initGame(@DestinationVariable final String lobby, @DestinationVariable final UUID configurationId)
throws JsonProcessingException {
gameService.createGame(lobby, configurationId);
broadcastGameUpdate(lobby);
}
Expand All @@ -177,10 +165,8 @@ public void initGame(
* @throws JsonProcessingException if the information that should be sent could not be parsed
*/
@MessageMapping("/next/Question/{lobby}/team/{team}")
public void nextQuestion(
@DestinationVariable final String lobby,
@DestinationVariable final String team
) throws JsonProcessingException {
public void nextQuestion(@DestinationVariable final String lobby, @DestinationVariable final String team)
throws JsonProcessingException {
if (gameService.hasNextQuestion(lobby, team)) {
gameService.nextQuestion(lobby, team);
broadcastGameUpdate(lobby);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.persistence.*;
import lombok.AccessLevel;
import lombok.Data;
Expand Down Expand Up @@ -35,4 +36,9 @@ public void addQuestion(final Question question) {
public void removeQuestion(final Question question) {
this.questions.remove(question);
}

@Override
public Configuration clone() {
return new Configuration(this.questions.stream().map(Question::clone).collect(Collectors.toSet()));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.unistuttgart.towercrushbackend.data;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import javax.persistence.ElementCollection;
Expand Down Expand Up @@ -35,4 +36,9 @@ public Question(final String text, final String rightAnswer, final Set<String> w
this.rightAnswer = rightAnswer;
this.wrongAnswers = wrongAnswers;
}

@Override
public Question clone() {
return new Question(this.text, this.rightAnswer, new HashSet<>(this.wrongAnswers));
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package de.unistuttgart.towercrushbackend.data.websockets;

import java.util.List;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.FieldDefaults;

import java.util.List;

/**
* This Class contains the infos that are necessary to display the lobby infos in the frontend
*/
Expand All @@ -16,5 +15,6 @@
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class DeveloperMessage implements Message {

List<Lobby> lobbyList;
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package de.unistuttgart.towercrushbackend.data.websockets;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* This class contains all infos that need to be saved for one played game of tower crush
Expand All @@ -25,24 +24,30 @@ public class Game {
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonIgnore
private UUID id;

private String lobbyName;

@ElementCollection
private Map<String, Team> teams;

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Round> rounds;

private UUID configurationId;

@ElementCollection
private Map<String, Integer> currentQuestion;

private long initialTowerSize;

@ElementCollection
private Map<String, Integer> towerSize;

@ElementCollection
private Map<String, Integer> answerPoints;

private String winnerTeam;

@JsonIgnore
private LocalDateTime startedGame;

Expand All @@ -52,7 +57,14 @@ public class Game {
private static String TEAM_A_NAME = "teamA";
private static String TEAM_B_NAME = "teamB";

public Game(final String lobbyName, final Team teamA, final Team teamB, final List<Round> rounds, final UUID configurationId, final long initialTowerSize) {
public Game(
final String lobbyName,
final Team teamA,
final Team teamB,
final List<Round> rounds,
final UUID configurationId,
final long initialTowerSize
) {
this.lobbyName = lobbyName;
this.teams = new HashMap<>();
this.teams.put(TEAM_A_NAME, teamA);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package de.unistuttgart.towercrushbackend.data.websockets;

import lombok.AllArgsConstructor;
import lombok.Data;

import javax.persistence.ElementCollection;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import javax.persistence.ElementCollection;
import lombok.AllArgsConstructor;
import lombok.Data;

/**
* This class contains all the infos that need to be saved for a lobby of tower crush
Expand All @@ -17,6 +16,7 @@ public class Lobby {

@ElementCollection
private Map<String, Team> teams;

private Set<Player> players = new HashSet<>();

private Set<Player> readyPlayers = new HashSet<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,4 @@
/**
* Message interface used to update the fronted
*/
public interface Message {
}
public interface Message {}
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package de.unistuttgart.towercrushbackend.data.websockets;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.UUID;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* This class contains all the player specific infos
Expand Down
Loading

0 comments on commit 7ccea59

Please sign in to comment.