From 99241ba25bc71c4b6b3bb2cda736dc37bde16dd5 Mon Sep 17 00:00:00 2001 From: mehdiboudjoudi Date: Wed, 26 Feb 2025 09:36:31 +0100 Subject: [PATCH] defined all players endpoint in oas, implemented method to get all players filtered and paginated (not done) --- api/api.yml | 43 +++++++++++++++-- .../server/admin/AdminApiController.java | 20 ++------ .../server/player/PlayerRepository.java | 2 +- .../server/utils/PlayerMapperService.java | 2 +- .../towerdefence/server/IntegrationTest.java | 17 ++++++- .../GetAllPlayersPaginatedAndSortedTest.java | 48 +++++++++++++++++++ .../server/server/PlayerRegistrationTest.java | 2 - 7 files changed, 111 insertions(+), 23 deletions(-) create mode 100644 src/test/java/de/towerdefence/server/server/GetAllPlayersPaginatedAndSortedTest.java diff --git a/api/api.yml b/api/api.yml index 0c41e0b..74ca498 100644 --- a/api/api.yml +++ b/api/api.yml @@ -65,10 +65,10 @@ components: description: a Player type: object properties: - name: + username: type: string required: - - name + - username responses: 201PlayerCreated: description: "201 - Player Created" @@ -162,9 +162,46 @@ paths: /admin/players: get: operationId: "GetAllPlayers" + summary: "Retrieve a paginated list of players" + description: "Returns a paginated list of players, optionally filtered by username." + parameters: + - name: page + in: query + description: "Page number (zero-based index)." + required: false + schema: + type: integer + default: 0 + - name: pageSize + in: query + description: "Number of players per page." + required: false + schema: + type: integer + default: 10 + - name: sortBy + in: query + description: "Field to sort by (default is username)." + required: false + schema: + type: string + default: "username" + - name: order + in: query + description: "Sorting order (asc or desc)." + required: false + schema: + type: string + enum: [asc, desc] + default: "asc" + - name: username + in: query + description: "Filter players by username (case-insensitive, partial match)." + required: false + schema: + type: string tags: - admin - description: 'Endpoint for getting all players' responses: 200: description: "A List of all Player" diff --git a/src/main/java/de/towerdefence/server/admin/AdminApiController.java b/src/main/java/de/towerdefence/server/admin/AdminApiController.java index 8ae62d9..22fce65 100644 --- a/src/main/java/de/towerdefence/server/admin/AdminApiController.java +++ b/src/main/java/de/towerdefence/server/admin/AdminApiController.java @@ -16,9 +16,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.Optional; @@ -54,25 +52,17 @@ public class AdminApiController implements AdminApi { return ResponseEntity.ok(authInfo); } - - @GetMapping("/admin/players") - public ResponseEntity> getAllPlayers( - @RequestParam(value = "page", required = false, defaultValue = "0") int page, - @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize, - @RequestParam(value = "sortBy", required = false, defaultValue = "name") String sortBy, - @RequestParam(value = "order", required = false, defaultValue = "asc") String order, - @RequestParam(value = "name", required = false) String name) { - - Sort.Direction direction = order.equalsIgnoreCase("desc") ? Sort.Direction.DESC : Sort.Direction.ASC; + @Override + public ResponseEntity> getAllPlayers(Integer page, Integer pageSize, String sortBy, String order, String username) { + Sort.Direction direction = order.equalsIgnoreCase("asc") ? Sort.Direction.ASC : Sort.Direction.DESC; Pageable pageable = PageRequest.of(page, pageSize, Sort.by(direction, sortBy)); - Page playerPage = (name != null && !name.trim().isEmpty()) - ? playerRepository.findByNameContainingIgnoreCase(name, pageable) + Page playerPage = (username != null && !username.trim().isEmpty()) + ? playerRepository.findByUsernameContainingIgnoreCase(username, pageable) : playerRepository.findAll(pageable); List playersMapped = playerMapperService.mapPlayerToApiPlayers(playerPage.getContent()); return playersMapped.isEmpty() ? ResponseEntity.noContent().build() : ResponseEntity.ok(playersMapped); } - } diff --git a/src/main/java/de/towerdefence/server/player/PlayerRepository.java b/src/main/java/de/towerdefence/server/player/PlayerRepository.java index d4ab50f..612608c 100644 --- a/src/main/java/de/towerdefence/server/player/PlayerRepository.java +++ b/src/main/java/de/towerdefence/server/player/PlayerRepository.java @@ -7,5 +7,5 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface PlayerRepository extends JpaRepository { Player findByUsername(String username); boolean existsByUsername(String username); - Page findByNameContainingIgnoreCase(String name, Pageable pageable); + Page findByUsernameContainingIgnoreCase(String username, Pageable pageable); } diff --git a/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java b/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java index 3f31356..2fad2ef 100644 --- a/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java +++ b/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java @@ -14,7 +14,7 @@ public class PlayerMapperService { List apiPlayers = new ArrayList<>(); for (Player player : players) { PlayerApiModel apiPlayer = new PlayerApiModel(); - apiPlayer.setName(player.getUsername()); + apiPlayer.setUsername(player.getUsername()); } return apiPlayers; } diff --git a/src/test/java/de/towerdefence/server/IntegrationTest.java b/src/test/java/de/towerdefence/server/IntegrationTest.java index 5964f75..eb473b5 100644 --- a/src/test/java/de/towerdefence/server/IntegrationTest.java +++ b/src/test/java/de/towerdefence/server/IntegrationTest.java @@ -1,6 +1,7 @@ package de.towerdefence.server; import com.fasterxml.jackson.databind.ObjectMapper; +import de.towerdefence.server.player.Player; import de.towerdefence.server.player.PlayerRepository; import de.towerdefence.server.player.PlayerService; import org.junit.jupiter.api.AfterEach; @@ -11,6 +12,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; +import java.security.NoSuchAlgorithmException; + @SpringBootTest @AutoConfigureMockMvc(addFilters = false) @ActiveProfiles("test") @@ -24,10 +27,22 @@ public abstract class IntegrationTest { protected ObjectMapper objectMapper; @Autowired protected PlayerRepository playerRepository; - + @Autowired + protected PlayerService playerService; + @BeforeEach void setUp() { playerRepository.deleteAll(); + + Player player1 = new Player(); + player1.setUsername("Player1"); + try { + playerService.setPassword(player1, "1234"); + } catch (NoSuchAlgorithmException e) {return;} + + this.playerRepository.save(player1); + + System.out.println("LISTE: " + playerRepository.findAll()); } @AfterEach diff --git a/src/test/java/de/towerdefence/server/server/GetAllPlayersPaginatedAndSortedTest.java b/src/test/java/de/towerdefence/server/server/GetAllPlayersPaginatedAndSortedTest.java new file mode 100644 index 0000000..deb158c --- /dev/null +++ b/src/test/java/de/towerdefence/server/server/GetAllPlayersPaginatedAndSortedTest.java @@ -0,0 +1,48 @@ +package de.towerdefence.server.server; + +import de.towerdefence.server.IntegrationTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; + +class GetAllPlayersPaginatedAndSortedTest extends IntegrationTest { + + @Test + void testGetAllPlayersPaginatedAndSorted() throws Exception { + this.mvc.perform(MockMvcRequestBuilders.get(baseUri + "/admin/players") + .param("page", "0") + .param("pageSize", "10") + .param("sortBy", "username") + .param("order", "desc") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$[0]").exists()); + + this.mvc.perform(MockMvcRequestBuilders.get(baseUri + "/admin/players") + .param("page", "0") + .param("pageSize", "10") + .param("sortBy", "username") + .param("order", "asc") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$[0].name").value("A")) + .andExpect(jsonPath("$[9].name").value("Z")); + + /* + testing if specific username that is being filtered by is in the result list + this.mvc.perform(MockMvcRequestBuilders.get(baseUri + "/admin/players") + .param("page", "0") + .param("pageSize", "10") + .param("username", "John") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$[0].name").value("John")) + .andExpect(jsonPath("$").isNotEmpty()); + */ + } +} diff --git a/src/test/java/de/towerdefence/server/server/PlayerRegistrationTest.java b/src/test/java/de/towerdefence/server/server/PlayerRegistrationTest.java index 4a76286..df8a3ce 100644 --- a/src/test/java/de/towerdefence/server/server/PlayerRegistrationTest.java +++ b/src/test/java/de/towerdefence/server/server/PlayerRegistrationTest.java @@ -30,6 +30,4 @@ public class PlayerRegistrationTest extends IntegrationTest { .content(this.objectMapper.writeValueAsString(playerRegistrationData)) .contentType(MediaType.APPLICATION_JSON); } - - }