From 098d450e0579f9c05d7db66640ab7f0fc4c8ff07 Mon Sep 17 00:00:00 2001 From: Felle33 <96147629+Felle33@users.noreply.github.com> Date: Sun, 4 Feb 2024 12:03:34 +0100 Subject: [PATCH] Made some improvements to the software (#7) * Made some improvements to the software * Fixed the test of permissions * Modified test * Modified permission controller * Try again * fixed test ~ added initTestMode() --------- Co-authored-by: Code-Kata-Battle --- .../controller/SignUpController.java | 5 +- .../CanCloseTournamentController.java | 4 +- .../controller/CreateBattleController.java | 2 +- .../controller/GetTeamController.java | 30 ++----- .../InviteStudentToTeamController.java | 5 +- .../controller/SendMailsToParticipants.java | 11 +-- .../controller/SendTeamsPointsController.java | 8 +- .../BattleManager/service/BattleService.java | 18 +++- .../BattleManager/service/TeamService.java | 1 - .../controller/CEvaluationController.java | 2 +- .../controller/CloseTournamentController.java | 33 ++++--- .../controller/Controller.java | 6 +- .../GetAllTournamentsController.java | 4 +- .../GetTournamentPageController.java | 16 ++-- .../controller/InformStudentsController.java | 2 +- .../controller/NewTournamentController.java | 1 + .../controller/PermissionController.java | 83 ++++++++--------- .../controller/SubscriptionController.java | 2 +- .../service/TournamentService.java | 36 +++++--- .../CheckPermissionControllerTest.java | 89 ++++++++++++++++--- .../controller/CloseTournamentTest.java | 10 +-- .../controller/PermissionControllerTest.java | 59 ++++++------ 22 files changed, 248 insertions(+), 179 deletions(-) diff --git a/code/account-manager/src/main/java/ckb/AccountManager/controller/SignUpController.java b/code/account-manager/src/main/java/ckb/AccountManager/controller/SignUpController.java index 13109b7..b9d7701 100644 --- a/code/account-manager/src/main/java/ckb/AccountManager/controller/SignUpController.java +++ b/code/account-manager/src/main/java/ckb/AccountManager/controller/SignUpController.java @@ -35,7 +35,10 @@ public ResponseEntity signUp(@RequestBody SignUpRequest request) { log.info("Account created for email {}", request.getEmail()); Long userID = userService.getUserIDByEmail(request.getEmail()); - if (userID == null) return new ResponseEntity<>("Error creating account", getHeaders(), HttpStatus.INTERNAL_SERVER_ERROR); + if (userID == null) { + log.error("The email provided is already used by another user"); + return new ResponseEntity<>("The email provided is already used by another user", getHeaders(), HttpStatus.BAD_REQUEST); + } return new ResponseEntity<>(userID, getHeaders(), HttpStatus.CREATED); } diff --git a/code/battle-manager/src/main/java/ckb/BattleManager/controller/CanCloseTournamentController.java b/code/battle-manager/src/main/java/ckb/BattleManager/controller/CanCloseTournamentController.java index 7e6d1ed..b0a36b1 100644 --- a/code/battle-manager/src/main/java/ckb/BattleManager/controller/CanCloseTournamentController.java +++ b/code/battle-manager/src/main/java/ckb/BattleManager/controller/CanCloseTournamentController.java @@ -31,10 +31,12 @@ public CanCloseTournamentController(BattleService battleService) { @PostMapping("/battles-finished") @ResponseStatus(HttpStatus.OK) public ResponseEntity canCloseTournament(@RequestBody CloseTournamentRequest request) { - log.info("[API REQUEST] Battle finished request with id tournament: {}", request.getTournamentID()); + log.info("[API REQUEST] can close the tournament request with id tournament: {}", request.getTournamentID()); if (battleService.canCloseTournament(request.getTournamentID())) { + log.info("The tournament with id {} can be closed", request.getTournamentID()); return new ResponseEntity<>(true, getHeaders(), HttpStatus.OK); } + log.info("The tournament with id {} cannot be closed", request.getTournamentID()); return ResponseEntity.badRequest().body(false); } diff --git a/code/battle-manager/src/main/java/ckb/BattleManager/controller/CreateBattleController.java b/code/battle-manager/src/main/java/ckb/BattleManager/controller/CreateBattleController.java index 063a1a2..cc20968 100644 --- a/code/battle-manager/src/main/java/ckb/BattleManager/controller/CreateBattleController.java +++ b/code/battle-manager/src/main/java/ckb/BattleManager/controller/CreateBattleController.java @@ -109,7 +109,7 @@ public ResponseEntity createBattle( .build(); return createBattle(battle); } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); } } diff --git a/code/battle-manager/src/main/java/ckb/BattleManager/controller/GetTeamController.java b/code/battle-manager/src/main/java/ckb/BattleManager/controller/GetTeamController.java index 9e76ac9..921429b 100644 --- a/code/battle-manager/src/main/java/ckb/BattleManager/controller/GetTeamController.java +++ b/code/battle-manager/src/main/java/ckb/BattleManager/controller/GetTeamController.java @@ -12,24 +12,25 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.reactive.function.client.WebClient; import java.util.ArrayList; import java.util.List; -import java.util.Objects; @RestController @RequestMapping("/api/battle") @Slf4j public class GetTeamController extends Controller { - private final WebClient.Builder webClientBuilder; + private final WebClient webClient = WebClient.create(); private final BattleService battleService; @Autowired public GetTeamController(BattleService battleService) { this.battleService = battleService; - this.webClientBuilder = WebClient.builder(); } /** @@ -45,22 +46,6 @@ public ResponseEntity getTeam(@RequestBody GetTeamStudentReques try { Team team = battleService.getListParticipation(request.getBattleId(), request.getStudentId()); - List participationNames = team.getParticipation() - .stream() - .map( - participation -> { - try { - return getNameOfStudent(participation); - } catch (Exception e) { - log.error("[EXCEPTION] Error occurred while getting name of student {} : {}", - participation.getStudentId(), e.getMessage()); - return null; - } - } - ) - .filter(Objects::nonNull) - .toList(); - List participantNames = new ArrayList<>(); int errors = 0; for (Participation participation : team.getParticipation()) { @@ -79,7 +64,7 @@ public ResponseEntity getTeam(@RequestBody GetTeamStudentReques log.info("Successfully get all the components of the team {} : {}", team.getTeamId(), participantNames); } - return ResponseEntity.ok(new TeamInfoMessage(participationNames, team.getTeamId())); + return ResponseEntity.ok(new TeamInfoMessage(participantNames, team.getTeamId())); } catch (Exception e) { log.error("[EXCEPTION] {}", e.getMessage()); return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); @@ -106,8 +91,7 @@ public ResponseEntity getTeamsOfBattle(@RequestBody GetTeam } private String getNameOfStudent(Participation participation) throws Exception { - ResponseEntity user = webClientBuilder.build() - .post() + ResponseEntity user = webClient.post() .uri(accountManagerUri + "/api/account/user") .bodyValue( participation.getStudentId() diff --git a/code/battle-manager/src/main/java/ckb/BattleManager/controller/InviteStudentToTeamController.java b/code/battle-manager/src/main/java/ckb/BattleManager/controller/InviteStudentToTeamController.java index 169088c..3ddb658 100644 --- a/code/battle-manager/src/main/java/ckb/BattleManager/controller/InviteStudentToTeamController.java +++ b/code/battle-manager/src/main/java/ckb/BattleManager/controller/InviteStudentToTeamController.java @@ -42,7 +42,7 @@ public ResponseEntity inviteStudentToTeam(@RequestBody InviteStudentTeam new DirectMailRequest(List.of(request.getIdStudent().toString()), "You have been invited to join the team: " + request.getIdTeam() + ". Please join the team by clicking on the link below:\n" + - "link: " + "http://localhost:3000/invite.html?idTeam=" + request.getIdTeam() + + "link: " + "http://localhost:8080/invite.html?idTeam=" + request.getIdTeam() + "&idUser=" + request.getIdStudent() ) ) @@ -50,12 +50,11 @@ public ResponseEntity inviteStudentToTeam(@RequestBody InviteStudentTeam .toEntity(String.class) .block(); log.info("Successfully sent email: {}", response); + return ResponseEntity.ok().build(); } catch (Exception e) { log.error("[EXCEPTION] {}", e.getMessage()); return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } - - return ResponseEntity.ok().build(); } } diff --git a/code/battle-manager/src/main/java/ckb/BattleManager/controller/SendMailsToParticipants.java b/code/battle-manager/src/main/java/ckb/BattleManager/controller/SendMailsToParticipants.java index b9813ef..b0770c1 100644 --- a/code/battle-manager/src/main/java/ckb/BattleManager/controller/SendMailsToParticipants.java +++ b/code/battle-manager/src/main/java/ckb/BattleManager/controller/SendMailsToParticipants.java @@ -1,9 +1,7 @@ package ckb.BattleManager.controller; import ckb.BattleManager.dto.output.DirectMailRequest; -import ckb.BattleManager.service.BattleService; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; @@ -13,14 +11,7 @@ @Slf4j @Service public class SendMailsToParticipants extends Controller { - private final WebClient webClient; - private final BattleService battleService; - - @Autowired - public SendMailsToParticipants(BattleService battleService) { - this.battleService = battleService; - this.webClient = WebClient.create(); - } + private final WebClient webClient = WebClient.create(); public void send(List participantIds, String content, String battleName) throws Exception { ResponseEntity response = webClient.post() diff --git a/code/battle-manager/src/main/java/ckb/BattleManager/controller/SendTeamsPointsController.java b/code/battle-manager/src/main/java/ckb/BattleManager/controller/SendTeamsPointsController.java index 6493ffa..0941c66 100644 --- a/code/battle-manager/src/main/java/ckb/BattleManager/controller/SendTeamsPointsController.java +++ b/code/battle-manager/src/main/java/ckb/BattleManager/controller/SendTeamsPointsController.java @@ -13,14 +13,10 @@ @RestController @Slf4j public class SendTeamsPointsController extends Controller { - private final WebClient.Builder webClientBuilder; - public SendTeamsPointsController() { - this.webClientBuilder = WebClient.builder(); - } + private final WebClient webClient = WebClient.create(); public void sendIdUsersPointsFinishedBattle(Battle battle, List> pairsIdUserPoints) { - ResponseEntity response = webClientBuilder.build() - .post() + ResponseEntity response = webClient.post() .uri(tournamentManagerUri + "/api/tournament/update-score") .bodyValue( new UpdateScoreRequest( diff --git a/code/battle-manager/src/main/java/ckb/BattleManager/service/BattleService.java b/code/battle-manager/src/main/java/ckb/BattleManager/service/BattleService.java index 346e61f..b4deb15 100644 --- a/code/battle-manager/src/main/java/ckb/BattleManager/service/BattleService.java +++ b/code/battle-manager/src/main/java/ckb/BattleManager/service/BattleService.java @@ -3,6 +3,7 @@ import ckb.BattleManager.controller.CreateGHRepositoryBattleController; import ckb.BattleManager.dto.input.CreateBattleRequest; import ckb.BattleManager.model.Battle; +import ckb.BattleManager.model.Participation; import ckb.BattleManager.model.Team; import ckb.BattleManager.model.WorkingPair; import ckb.BattleManager.repository.BattleRepository; @@ -78,12 +79,23 @@ public List getBattlesTournament(Long idTournament) { public void joinBattle(Long idStudent, Long idBattle) throws Exception { Battle battle = getBattle(idBattle); - if (LocalDateTime.now().isBefore(battle.getRegDeadline())) { - teamService.createTeam(idStudent, battle); - } else { + if (LocalDateTime.now().isAfter(battle.getRegDeadline())) { log.error("The registration deadline has passed"); throw new Exception("The registration deadline has passed"); } + + List listStudentIdSubscribedToBattle = battle.getTeamsRegistered() + .stream() + .flatMap(team -> team.getParticipation().stream()) + .map(Participation::getStudentId) + .toList(); + + if (listStudentIdSubscribedToBattle.contains(idStudent)) { + log.error("The student {} is already registered in the battle {}", idStudent, idBattle); + throw new Exception("The student is already registered in the battle"); + } + + teamService.createTeam(idStudent, battle); } public void leaveBattle(Long idStudent, Long idBattle) throws Exception { diff --git a/code/battle-manager/src/main/java/ckb/BattleManager/service/TeamService.java b/code/battle-manager/src/main/java/ckb/BattleManager/service/TeamService.java index dda5eb6..29aebe3 100644 --- a/code/battle-manager/src/main/java/ckb/BattleManager/service/TeamService.java +++ b/code/battle-manager/src/main/java/ckb/BattleManager/service/TeamService.java @@ -46,7 +46,6 @@ public Team getTeam(Battle battle, Long idStudent) throws Exception { } public void createTeam(Long studentId, Battle battle) { - // TODO: how to set the repository link? Team team = Team.builder() .battle(battle) .eduEvaluated(false) diff --git a/code/solution-evaluation-service/src/main/java/ckb/SolutionEvaluationService/controller/CEvaluationController.java b/code/solution-evaluation-service/src/main/java/ckb/SolutionEvaluationService/controller/CEvaluationController.java index 1a6bc2f..3780168 100644 --- a/code/solution-evaluation-service/src/main/java/ckb/SolutionEvaluationService/controller/CEvaluationController.java +++ b/code/solution-evaluation-service/src/main/java/ckb/SolutionEvaluationService/controller/CEvaluationController.java @@ -82,7 +82,7 @@ public ResponseEntity evaluate(@RequestBody EvaluationRequest request) { if (staticAnalysisDeduction < 0) { log.error("Error executing static analysis"); evaluationService.cleanUp(path); - return new ResponseEntity<>("Error executing static analysis", getHeaders(), HttpStatus.BAD_REQUEST); + return new ResponseEntity<>("Error executing static analysis", getHeaders(), HttpStatus.INTERNAL_SERVER_ERROR); } else { log.info("Deduction: " + staticAnalysisDeduction); } diff --git a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/CloseTournamentController.java b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/CloseTournamentController.java index 82eb9cf..aa47f23 100644 --- a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/CloseTournamentController.java +++ b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/CloseTournamentController.java @@ -25,27 +25,33 @@ public class CloseTournamentController extends Controller { @PostMapping @ResponseStatus(HttpStatus.OK) - public ResponseEntity CloseTournament(@RequestBody CloseTournamentRequest request) { + public ResponseEntity closeTournament(@RequestBody CloseTournamentRequest request) { // check if the request has valid data ResponseEntity response = checkRequest(request); if (response.getStatusCode().is4xxClientError()) return response; - if (contactBattleManager(request)) { - if (tournamentService.closeTournament(request)) { - Long tournamentID = request.getTournamentID(); - String tournamentName = tournamentService.getTournament(tournamentID).getName(); - List studentIDs = tournamentService.getStudentsSubscribed(tournamentID).stream().map(Object::toString).toList(); - log.info("Tournament {} is now closed", tournamentName); + if (!contactBattleManager(request)) { + log.error("Could not close tournament because or the there was an error contacting the battle manager or the battles are not closed"); + return new ResponseEntity<>("Not possible to close", getHeaders(), HttpStatus.BAD_REQUEST); + } - sendMailToAllStudents(studentIDs, tournamentName); - return new ResponseEntity<>("Tournament closed", getHeaders(), HttpStatus.OK); - } else return new ResponseEntity<>("Not allowed to close tournament", getHeaders(), HttpStatus.BAD_REQUEST); - } else { - return new ResponseEntity<>("Not possible to close", getHeaders(), HttpStatus.INTERNAL_SERVER_ERROR); + try { + tournamentService.closeTournament(request); + Long tournamentID = request.getTournamentID(); + String tournamentName = tournamentService.getTournament(tournamentID).getName(); + + List studentIDs = tournamentService.getStudentsSubscribed(tournamentID).stream().map(Object::toString).toList(); + log.info("Tournament {} is now closed", tournamentName); + + sendMailToAllStudents(studentIDs, tournamentName); + + return new ResponseEntity<>("Tournament closed", getHeaders(), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(e.getMessage(), getHeaders(), HttpStatus.BAD_REQUEST); } } - private void sendMailToAllStudents(List studentIDs, String tournamentName) { + private void sendMailToAllStudents(List studentIDs, String tournamentName) throws Exception { DirectMailRequest request = DirectMailRequest.builder() .userIDs(studentIDs) .content("Tournament " + tournamentName + "has ended") @@ -62,6 +68,7 @@ private void sendMailToAllStudents(List studentIDs, String tournamentNam log.info("Mail sent to all participants of {} to inform them of the tournament ending", tournamentName); } else { log.error("Failed to send email for ending tournament {}", tournamentName); + throw new Exception("Failed to send email for ending tournament"); } } diff --git a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/Controller.java b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/Controller.java index 2218f0f..4f42b1b 100644 --- a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/Controller.java +++ b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/Controller.java @@ -3,9 +3,9 @@ import org.springframework.http.HttpHeaders; public abstract class Controller { - String mailServiceUri = "http://mail-service:8085"; - String accountManagerUri = "http://account-manager:8086"; - String battleManagerUri = "http://battle-manager:8082"; + static String mailServiceUri = "http://mail-service:8085"; + static String accountManagerUri = "http://account-manager:8086"; + static String battleManagerUri = "http://battle-manager:8082"; HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); diff --git a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/GetAllTournamentsController.java b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/GetAllTournamentsController.java index 1b438dd..4dd4e67 100644 --- a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/GetAllTournamentsController.java +++ b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/GetAllTournamentsController.java @@ -20,7 +20,6 @@ public class GetAllTournamentsController extends Controller { private final TournamentService tournamentService; @PostMapping - @ResponseStatus(HttpStatus.CREATED) public ResponseEntity getTournaments(@RequestBody GetAllTournamentsRequest request) { // check if the request has valid data System.out.println("sending information"); @@ -29,8 +28,7 @@ public ResponseEntity getTournaments(@RequestBody GetAllTournamentsReque for (Tournament tournament : t) { answer.put(tournament.getTournamentID(), tournament.getName()); } - System.out.println(answer); - return new ResponseEntity<>(answer, getHeaders(), HttpStatus.CREATED); + return new ResponseEntity<>(answer, getHeaders(), HttpStatus.OK); } } diff --git a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/GetTournamentPageController.java b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/GetTournamentPageController.java index 1bb6ee3..cd9d31b 100644 --- a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/GetTournamentPageController.java +++ b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/GetTournamentPageController.java @@ -24,7 +24,6 @@ public class GetTournamentPageController extends Controller { private final WebClient webClient; @PostMapping - @ResponseStatus(HttpStatus.CREATED) public ResponseEntity getTournamentPage(@RequestBody GetTournamentPageRequest request) { if (invalidRequest(request)) { return new ResponseEntity<>(HttpStatus.BAD_REQUEST); @@ -37,12 +36,11 @@ public ResponseEntity getTournamentPage(@RequestBody GetTournam log.info("Tournament page retrieved"); List battles = getBattles(request.getTournamentID()); responseWrapper = new ResponseWrapper(battles, t); + return new ResponseEntity<>(responseWrapper, getHeaders(), HttpStatus.OK); } catch (Exception e) { log.error("[EXCEPTION] An exception occurred while retrieving battles {}", e.toString()); return ResponseEntity.badRequest().build(); } - - return new ResponseEntity<>(responseWrapper, getHeaders(), HttpStatus.CREATED); } private List getBattles(Long tournamentID) throws Exception { @@ -59,18 +57,18 @@ private List getBattles(Long tournamentID) throws Exception { .block(); if (response == null) { - log.error("[ERROR] The response is null"); - throw new Exception("The response is null"); + log.error("The battle manager response is null"); + throw new Exception("The battle manager response is null"); } if (response.getStatusCode().is4xxClientError()) { - log.error("[ERROR] The response has an error {}", response.getBody()); - throw new Exception("The response has an error"); + log.error("The status code of the battle manager response is 4xx"); + throw new Exception("The status code of the battle manager response is 4xx"); } if (response.getBody() == null) { - log.error("[ERROR] The response body is null"); - throw new Exception("The response body is null"); + log.error("The battle manager response's body is null"); + throw new Exception("The battle manager response's body is null"); } log.info("Successfully retrieved the list of battles"); diff --git a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/InformStudentsController.java b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/InformStudentsController.java index ab2c6c9..e3eea21 100644 --- a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/InformStudentsController.java +++ b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/InformStudentsController.java @@ -47,7 +47,7 @@ public ResponseEntity informStudents(@RequestBody InformStudentsRequest .block(); if (response == null || response.getStatusCode().is4xxClientError()) { - log.error("[ERROR] Error while informing students of a tournament: {}", request.getTournamentId()); + log.error("Error while informing students of a tournament: {}", request.getTournamentId()); return ResponseEntity.badRequest().build(); } diff --git a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/NewTournamentController.java b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/NewTournamentController.java index 5c1acd8..6d51976 100644 --- a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/NewTournamentController.java +++ b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/NewTournamentController.java @@ -52,6 +52,7 @@ private void sendRequest(String content) throws Exception { .block(); if (answer == null || answer.getStatusCode().is4xxClientError()) { + log.error("Error while sending mail to all students"); throw new Exception(); } } diff --git a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/PermissionController.java b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/PermissionController.java index 8b924ff..0492c33 100644 --- a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/PermissionController.java +++ b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/PermissionController.java @@ -24,80 +24,83 @@ @RequestMapping("/api/tournament/permission") @RequiredArgsConstructor -public class PermissionController extends Controller{ +public class PermissionController extends Controller { private final TournamentService tournamentService; @Autowired private final WebClient webClient; @PostMapping - @ResponseStatus(HttpStatus.CREATED) - public ResponseEntity permission(@RequestBody PermissionRequest request) { + public ResponseEntity createPermission(@RequestBody PermissionRequest request) { // check if the request has valid data ResponseEntity response = checkRequest(request); if (response.getStatusCode().is4xxClientError()) return response; + log.info("The permission request is correctly sent"); + User e = checkEducator(request); - if(e == null || e.getRole() != Role.EDUCATOR){ + if (e == null || e.getRole() != Role.EDUCATOR) { log.error("Invalid Request"); return new ResponseEntity<>("Invalid Request", getHeaders(), HttpStatus.BAD_REQUEST); + } else { + log.info("The permission request is valid, the person who granted the permission has the permission"); + String x = tournamentService.addPermission(request); + if (x == null) { + log.error("Illegal request to give permission"); + return new ResponseEntity<>("Illegal request to give permission", getHeaders(), HttpStatus.BAD_REQUEST); + } + String content = "You've gained permission to create battles in tournament: " + x; + log.info("Permission inserted"); + try { + sendRequest(mailServiceUri + "/api/mail/direct", content, request.getUserID()); + } catch (Exception exp) { + log.error("Error while retrieving send request to mail service\n"); + return new ResponseEntity<>(getHeaders(), HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>("Permission inserted", getHeaders(), HttpStatus.CREATED); } - else{ - String x = tournamentService.addPermission(request); - if(x == null ){ - log.error("Illegal request to give permission"); - return new ResponseEntity<>("Illegal request to give permission", getHeaders(), HttpStatus.BAD_REQUEST); - } - String content = "You've gained permission to create battles in tournament: "+x; - log.info("Permission inserted"); - try { - sendRequest("http://localhost:8085/api/mail/direct", content, request.getUserID()); - } catch (Exception exp) { - log.error("Error while retrieving send request to mail service\n"); - return new ResponseEntity<>(getHeaders(), HttpStatus.BAD_REQUEST); - } - return new ResponseEntity<>("Permission inserted", getHeaders(), HttpStatus.CREATED); - }} + } private User checkEducator(PermissionRequest request) { - try{ String c = webClient - .post() - .uri("http://localhost:8086/api/account/user") - .bodyValue(new UserRequest(request.getUserID())) - .retrieve() - .onStatus(HttpStatusCode::is4xxClientError, clientResponse -> Mono.error(new RuntimeException("Errore durante la chiamata HTTP"))) - .bodyToMono(String.class).block(); + try { + String c = webClient + .post() + .uri(accountManagerUri + "/api/account/user") + .bodyValue(new UserRequest(request.getUserID())) + .retrieve() + .onStatus(HttpStatusCode::is4xxClientError, clientResponse -> Mono.error(new RuntimeException("Error during the HTTP call"))) + .bodyToMono(String.class) + .block(); if (c != null) { ObjectMapper objectMapper = new ObjectMapper(); return objectMapper.readValue(c, User.class); } - } - catch (Exception e){ + } catch (Exception e) { return null; } return null; } private void sendRequest(String s, String content, Long userId) { - Mono c = webClient - .post() - .uri(s) - .bodyValue(new DirectMailRequest(Collections.singletonList(userId.toString()), content)) - .retrieve() - .onStatus(HttpStatusCode::is4xxClientError, clientResponse -> Mono.error(new RuntimeException("Errore durante la chiamata HTTP"))) - .bodyToMono(String.class); + Mono c = webClient + .post() + .uri(s) + .bodyValue(new DirectMailRequest(Collections.singletonList(userId.toString()), content)) + .retrieve() + .onStatus(HttpStatusCode::is4xxClientError, clientResponse -> Mono.error(new RuntimeException("Error during the HTTP call"))) + .bodyToMono(String.class); } private ResponseEntity checkRequest(PermissionRequest request) { - if(request.getUserID() == null || request.getTournamentID() == null || request.getCreatorID() == null){ + if (request.getUserID() == null || request.getTournamentID() == null || request.getCreatorID() == null) { log.error("Invalid user or tournament id request"); return new ResponseEntity<>("Invalid user or tournament id request", getHeaders(), HttpStatus.BAD_REQUEST); } - if(tournamentService.getTournament(request.getTournamentID()) == null){ + if (tournamentService.getTournament(request.getTournamentID()) == null) { log.error("Invalid tournament id request"); return new ResponseEntity<>("Invalid tournament id request", getHeaders(), HttpStatus.BAD_REQUEST); } - if(tournamentService.getTournament(request.getTournamentID()).getStatus() == false){ + if (tournamentService.getTournament(request.getTournamentID()).getStatus() == false) { log.error("Tournament already ended"); return new ResponseEntity<>("Tournament already ended", getHeaders(), HttpStatus.BAD_REQUEST); } @@ -109,4 +112,4 @@ private ResponseEntity checkRequest(PermissionRequest request) { return new ResponseEntity<>("Valid request", getHeaders(), HttpStatus.OK); } -} +} \ No newline at end of file diff --git a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/SubscriptionController.java b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/SubscriptionController.java index 5cbf93f..80feb06 100644 --- a/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/SubscriptionController.java +++ b/code/tournament-manager/src/main/java/ckb/TournamentManager/controller/SubscriptionController.java @@ -44,7 +44,7 @@ private ResponseEntity checkRequest(SubscriptionRequest request) { log.error("User already subscribed"); return new ResponseEntity<>("User already subscribed", getHeaders(), HttpStatus.BAD_REQUEST); } - if(tournamentService.getTournament(request.getTournamentID()).getStatus() == false){ + if (!tournamentService.getTournament(request.getTournamentID()).getStatus()) { log.error("Tournament already ended"); return new ResponseEntity<>("Tournament already ended", getHeaders(), HttpStatus.BAD_REQUEST); } diff --git a/code/tournament-manager/src/main/java/ckb/TournamentManager/service/TournamentService.java b/code/tournament-manager/src/main/java/ckb/TournamentManager/service/TournamentService.java index b1c6532..a06dca1 100644 --- a/code/tournament-manager/src/main/java/ckb/TournamentManager/service/TournamentService.java +++ b/code/tournament-manager/src/main/java/ckb/TournamentManager/service/TournamentService.java @@ -9,6 +9,7 @@ import ckb.TournamentManager.repo.TournamentRankingRepo; import ckb.TournamentManager.repo.TournamentRepo; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; @@ -18,7 +19,7 @@ @Service @RequiredArgsConstructor - +@Slf4j public class TournamentService { private final TournamentRepo tournamentRepo; private final TournamentRankingRepo tournamentRankingRepo; @@ -73,17 +74,23 @@ public List getAllTournaments() { return tournamentRepo.findAll(); } - public boolean closeTournament(CloseTournamentRequest request) { - Tournament tournament = tournamentRepo.findByTournamentID(request.getTournamentID()).orElse(null); - if (tournament.getCreatorID().equals(request.getCreatorID())) { - tournament.setStatus(false); - tournamentRepo.save(tournament); - List p = permissionRepo.findAllByTournamentID(request.getTournamentID()); - for (Permission permission : p) { - permissionRepo.delete(permission); - } - return true; - } else return false; + public void closeTournament(CloseTournamentRequest request) throws Exception { + Tournament tournament = tournamentRepo.findByTournamentID(request.getTournamentID()).orElseThrow( + () -> { + log.error("Tournament not found"); + return new Exception("Tournament not found"); + } + ); + + if (!tournament.getCreatorID().equals(request.getCreatorID())) { + log.error("Not allowed to close tournament"); + throw new Exception("Not allowed to close tournament"); + } + + tournament.setStatus(false); + tournamentRepo.save(tournament); + List p = permissionRepo.findAllByTournamentID(request.getTournamentID()); + permissionRepo.deleteAll(p); } public boolean permissionExists(Long tournamentID, Long userID) { @@ -92,7 +99,7 @@ public boolean permissionExists(Long tournamentID, Long userID) { public boolean updateScore(UpdateScoreRequest request) { List records = tournamentRankingRepo.findAllByTournamentID(request.getTournamentID()); - System.out.println("before: " + records); + log.info("Before: " + records); if (records == null) return false; Map scores = new HashMap<>(); @@ -108,8 +115,9 @@ public boolean updateScore(UpdateScoreRequest request) { tournamentRankingRepo.save(student); } } + records = tournamentRankingRepo.findAllByTournamentID(request.getTournamentID()); - System.out.println("after : " + records); + log.info("After : " + records); return true; } diff --git a/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/CheckPermissionControllerTest.java b/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/CheckPermissionControllerTest.java index ec9b8fe..b17a6db 100644 --- a/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/CheckPermissionControllerTest.java +++ b/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/CheckPermissionControllerTest.java @@ -1,17 +1,29 @@ package ckb.TournamentManager.controller; +import ckb.TournamentManager.dto.incoming.CheckPermissionRequest; +import ckb.TournamentManager.dto.incoming.NewTournamentRequest; import ckb.TournamentManager.model.Permission; import ckb.TournamentManager.model.Tournament; import ckb.TournamentManager.repo.PermissionRepo; import ckb.TournamentManager.repo.TournamentRepo; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockserver.integration.ClientAndServer; +import org.mockserver.model.MediaType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.ResponseEntity; import java.util.Calendar; import java.util.Date; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockserver.model.HttpRequest.request; +import static org.mockserver.model.HttpResponse.response; @SpringBootTest class CheckPermissionControllerTest { @@ -22,19 +34,70 @@ class CheckPermissionControllerTest { @Autowired private PermissionRepo permissionRepo; + @Autowired + private CheckPermissionController checkPermissionController; + + @Autowired + private NewTournamentController newTournamentController; + + private static ClientAndServer mockServerMailService; + private static ClientAndServer mockServerAccountManagerService; + + @BeforeEach + public void setUpServer() throws JSONException { + newTournamentController.initTestMode(); + mockServerMailService = ClientAndServer.startClientAndServer(8085); + mockServerAccountManagerService = ClientAndServer.startClientAndServer(8086); + + mockServerMailService + .when(request().withMethod("POST").withPath("/api/mail/all-students")) + .respond(response().withStatusCode(200)); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", 1); + jsonObject.put("email", "example@example.com"); + jsonObject.put("fullName", "John Doe"); + jsonObject.put("password", "password123"); + jsonObject.put("role", "EDUCATOR"); + mockServerAccountManagerService + .when(request().withMethod("POST").withPath("/api/account/user")) + .respond(response().withStatusCode(200).withBody( + jsonObject.toString() + ).withContentType(MediaType.APPLICATION_JSON)); + } + + @AfterEach + public void tearDown() { + mockServerMailService.stop(); + mockServerAccountManagerService.stop(); + tournamentRepo.deleteAll(); + permissionRepo.deleteAll(); + } + @Test - void checkPermission() { - tournamentRepo.save(new Tournament( - 1L, - "Tournament 1", - new Date(2024 - 1900, Calendar.FEBRUARY, 1), - true, - 1L - )); - - assertTrue(permissionRepo.findByTournamentIDAndUserID(1L, 1L).isEmpty()); - - permissionRepo.save(new Permission(1L, 1L)); - assertTrue(permissionRepo.findByTournamentIDAndUserID(1L, 1L).isPresent()); + void checkPermissionFalse() { + ResponseEntity response = newTournamentController.newTournament( + new NewTournamentRequest(1L, "Tournament 1", new Date(2345 - 1900, Calendar.FEBRUARY, 1)) + ); + + assertTrue(response.getStatusCode().is2xxSuccessful()); + + response = checkPermissionController.checkPermission(new CheckPermissionRequest(1L, 2L)); + assertTrue(response.getStatusCode().is4xxClientError()); + } + + @Test + void checkPermissionTrue() { + ResponseEntity responseTournament = newTournamentController.newTournament( + new NewTournamentRequest(1L, "Tournament 1", new Date(2345 - 1900, Calendar.FEBRUARY, 1)) + ); + + assertTrue(responseTournament.getStatusCode().is2xxSuccessful()); + assertNotNull(responseTournament.getBody()); + + Tournament tournament = (Tournament) responseTournament.getBody(); + + ResponseEntity response = checkPermissionController.checkPermission(new CheckPermissionRequest(tournament.getTournamentID(), 1L)); + assertTrue(response.getStatusCode().is2xxSuccessful()); } } \ No newline at end of file diff --git a/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/CloseTournamentTest.java b/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/CloseTournamentTest.java index 97f66de..5154497 100644 --- a/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/CloseTournamentTest.java +++ b/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/CloseTournamentTest.java @@ -67,7 +67,7 @@ public void correctTest() throws JSONException { tournamentID = t.getTournamentID(); Long creatorID = 7L; request = new CloseTournamentRequest(tournamentID,creatorID); - ResponseEntity response = closetController.CloseTournament(request); + ResponseEntity response = closetController.closeTournament(request); assertEquals("Tournament closed", response.getBody()); tournamentRepo.deleteById(tournamentID); } @@ -93,7 +93,7 @@ public void cannotcloseTest() { tournamentID = t.getTournamentID(); Long creatorID = 7L; request = new CloseTournamentRequest(tournamentID,creatorID); - ResponseEntity response = closetController.CloseTournament(request); + ResponseEntity response = closetController.closeTournament(request); assertEquals("Not possible to close", response.getBody()); tournamentRepo.deleteById(tournamentID); @@ -110,7 +110,7 @@ public void TournamentNullTest() { Long tournamentID = null; Long creatorID = 7L; CloseTournamentRequest request = new CloseTournamentRequest(tournamentID,creatorID); - ResponseEntity response = closetController.CloseTournament(request); + ResponseEntity response = closetController.closeTournament(request); assertEquals("Invalid tournament id", response.getBody()); } @@ -125,7 +125,7 @@ public void TournamentNotExistsTest() { Long tournamentID = 4L; Long creatorID = 7L; CloseTournamentRequest request = new CloseTournamentRequest(tournamentID,creatorID); - ResponseEntity response = closetController.CloseTournament(request); + ResponseEntity response = closetController.closeTournament(request); assertEquals("Invalid tournament id request", response.getBody()); } @@ -150,7 +150,7 @@ public void WrongIDCreator() { tournamentID = t.getTournamentID(); Long creatorID = 7L; request = new CloseTournamentRequest(tournamentID,creatorID); - ResponseEntity response = closetController.CloseTournament(request); + ResponseEntity response = closetController.closeTournament(request); assertEquals("The creator ID sent is not the creator of the tournament", response.getBody()); tournamentRepo.deleteById(tournamentID); } diff --git a/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/PermissionControllerTest.java b/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/PermissionControllerTest.java index 7af746c..065e2b8 100644 --- a/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/PermissionControllerTest.java +++ b/code/tournament-manager/src/test/java/ckb/TournamentManager/controller/PermissionControllerTest.java @@ -20,7 +20,6 @@ import java.util.Calendar; import java.util.Date; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.HttpResponse.response; @@ -36,20 +35,21 @@ public class PermissionControllerTest { @Autowired private PermissionRepo permissionRepo; - private static ClientAndServer mockServermail; + private static ClientAndServer mockServerMail; - private static ClientAndServer mockServeraccount; + private static ClientAndServer mockServerAccount; @BeforeEach public void setUpServer() { - mockServeraccount = ClientAndServer.startClientAndServer(8086); - mockServermail = ClientAndServer.startClientAndServer(8085); + permissionController.initTestMode(); + mockServerAccount = ClientAndServer.startClientAndServer(8086); + mockServerMail = ClientAndServer.startClientAndServer(8085); } @AfterEach public void tearDownServer() { - mockServeraccount.stop(); - mockServermail.stop(); + mockServerAccount.stop(); + mockServerMail.stop(); permissionRepo.deleteAll(); tournamentRepo.deleteAll(); } @@ -66,8 +66,9 @@ public void TournamentAlreadyEndedTest() { Long tournamentID = t.getTournamentID(); Long creatorID = 1L; PermissionRequest request = new PermissionRequest(tournamentID, userID,creatorID); - ResponseEntity response = permissionController.permission(request); - assertEquals("Tournament already ended", response.getBody()); + ResponseEntity response = permissionController.createPermission(request); + + assertTrue(response.getStatusCode().is4xxClientError()); } @Test @@ -76,14 +77,15 @@ public void TournamentNotExistsTest() { Long tournamentID = 1L; Long creatorID = 1L; PermissionRequest request = new PermissionRequest(tournamentID, userID,creatorID); - ResponseEntity response = permissionController.permission(request); + ResponseEntity response = permissionController.createPermission(request); + assertTrue(response.getStatusCode().is4xxClientError()); } @Test public void UserAlreadyHasPermissionTest() { Tournament t = new Tournament(); - t.setRegdeadline(new Date((2024 - 1900), Calendar.FEBRUARY, 20)); + t.setRegdeadline(new Date((2345 - 1900), Calendar.FEBRUARY, 20)); t.setStatus(true); t.setCreatorID(2L); tournamentRepo.save(t); @@ -96,9 +98,9 @@ public void UserAlreadyHasPermissionTest() { permissionRepo.save(p); PermissionRequest request = new PermissionRequest(tournamentID, userID, creatorID); - ResponseEntity response = permissionController.permission(request); + ResponseEntity response = permissionController.createPermission(request); - assertEquals("Permission already inserted", response.getBody()); + assertTrue(response.getStatusCode().is4xxClientError()); } @Test @@ -108,10 +110,10 @@ public void WrongUser() throws JsonProcessingException { user.setRole(Role.STUDENT); user.setId(1L); String userJson = new ObjectMapper().writeValueAsString(user); - mockServeraccount + mockServerAccount .when(request().withMethod("POST").withPath("/api/account/user")) .respond(response().withStatusCode(200).withBody(userJson)); - mockServermail + mockServerMail .when(request().withMethod("POST").withPath("/api/mail/direct")) .respond(response().withStatusCode(200).withBody("OK")); @@ -124,8 +126,9 @@ public void WrongUser() throws JsonProcessingException { Long tournamentID = t.getTournamentID(); Long creatorID = 3L; PermissionRequest request = new PermissionRequest(tournamentID, 1L, creatorID); - ResponseEntity response = permissionController.permission(request); - assertEquals("Invalid Request", response.getBody()); + ResponseEntity response = permissionController.createPermission(request); + + assertTrue(response.getStatusCode().is4xxClientError()); } @Test @@ -135,15 +138,15 @@ public void RightUser() throws JsonProcessingException { user.setRole(Role.EDUCATOR); user.setId(1L); String userJson = new ObjectMapper().writeValueAsString(user); - mockServeraccount + mockServerAccount .when(request().withMethod("POST").withPath("/api/account/user")) .respond(response().withStatusCode(200).withBody(userJson)); - mockServermail + mockServerMail .when(request().withMethod("POST").withPath("/api/mail/direct")) - .respond(response().withStatusCode(200).withBody("OK")); + .respond(response().withStatusCode(200)); Tournament t = new Tournament(); - t.setRegdeadline(new Date((2024 - 1900), Calendar.AUGUST, 20)); + t.setRegdeadline(new Date((2345 - 1900), Calendar.AUGUST, 20)); t.setStatus(true); t.setCreatorID(5L); tournamentRepo.save(t); @@ -151,8 +154,9 @@ public void RightUser() throws JsonProcessingException { Long tournamentID = t.getTournamentID(); Long creatorID = 5L; PermissionRequest request = new PermissionRequest(tournamentID, 1L,creatorID); - ResponseEntity response = permissionController.permission(request); - assertEquals("Permission inserted", response.getBody()); + ResponseEntity response = permissionController.createPermission(request); + + assertTrue(response.getStatusCode().is2xxSuccessful()); } @Test @@ -162,10 +166,10 @@ public void InvalidCreatorID() throws JsonProcessingException{ user.setRole(Role.EDUCATOR); user.setId(1L); String userJson = new ObjectMapper().writeValueAsString(user); - mockServeraccount + mockServerAccount .when(request().withMethod("POST").withPath("/api/account/user")) .respond(response().withStatusCode(200).withBody(userJson)); - mockServermail + mockServerMail .when(request().withMethod("POST").withPath("/api/mail/direct")) .respond(response().withStatusCode(200).withBody("OK")); @@ -178,7 +182,8 @@ public void InvalidCreatorID() throws JsonProcessingException{ Long tournamentID = t.getTournamentID(); Long creatorID = 5L; PermissionRequest request = new PermissionRequest(tournamentID, 1L,creatorID); - ResponseEntity response = permissionController.permission(request); - assertEquals("Illegal request to give permission", response.getBody()); + ResponseEntity response = permissionController.createPermission(request); + + assertTrue(response.getStatusCode().is4xxClientError()); } }