diff --git a/api/api.yml b/api/api.yml index 29a8d7d..7189fab 100644 --- a/api/api.yml +++ b/api/api.yml @@ -7,7 +7,7 @@ servers: - url: /api/v1 - url: http://localhost:8080/api/v1 security: - - JWTAuth: [] + - JWTAuth: [ ] components: securitySchemes: @@ -55,7 +55,7 @@ components: type: object properties: username: - type: string + type: string required: - username ############################################# @@ -70,31 +70,32 @@ components: required: - username ############################################# - # GetAllPlayersConfigurationData # + # PlayerFilter # ############################################# - GetAllPlayersConfigurationData: + PlayerFilter: description: Configuration data for query for the getting all players endpoint type: object properties: page: type: integer - default: 0 description: "Page number (zero-based index)." pageSize: type: integer - default: 10 description: "Number of players per page." sortBy: type: string - default: "username" description: "Field to sort by (default is username)." order: type: string - enum: [ascending, descending] + enum: [ ascending, descending ] description: "Sorting order (asc or desc)." username: type: string description: "Filter players by username (case-insensitive, partial match)." + required: + - page + - pageSize + - order responses: 201PlayerCreated: description: "201 - Player Created" @@ -188,15 +189,15 @@ paths: /admin/players: get: operationId: "GetAllPlayers" + tags: + - admin summary: "Retrieve a paginated list of players" description: "Returns a paginated list of players, optionally filtered by username." requestBody: content: application/json: schema: - $ref: "#/components/schemas/GetAllPlayersConfigurationData" - tags: - - admin + $ref: "#/components/schemas/PlayerFilter" 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 826f8a3..9356c2a 100644 --- a/src/main/java/de/towerdefence/server/admin/AdminApiController.java +++ b/src/main/java/de/towerdefence/server/admin/AdminApiController.java @@ -5,9 +5,10 @@ import de.towerdefence.server.auth.UserSession; import de.towerdefence.server.oas.AdminApi; import de.towerdefence.server.oas.models.AdminAuthInfo; import de.towerdefence.server.oas.models.AdministratablePlayer; -import de.towerdefence.server.oas.models.GetAllPlayersConfigurationData; +import de.towerdefence.server.oas.models.PlayerFilter; import de.towerdefence.server.player.Player; import de.towerdefence.server.player.PlayerRepository; +import de.towerdefence.server.utils.OrderToDirectionMapperService; import de.towerdefence.server.utils.PlayerMapperService; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; @@ -35,6 +36,9 @@ public class AdminApiController implements AdminApi { @Autowired PlayerMapperService playerMapperService; + @Autowired + OrderToDirectionMapperService orderToDirectionMapperService; + @Override public Optional getObjectMapper() { @@ -54,30 +58,21 @@ public class AdminApiController implements AdminApi { } @Override - public ResponseEntity> getAllPlayers(GetAllPlayersConfigurationData body) { + public ResponseEntity> getAllPlayers(PlayerFilter body) { - var order = body.getOrder(); - var page = body.getPage(); - var pageSize = body.getPageSize(); - var sortBy = body.getSortBy(); - var username = body.getUsername(); + PlayerFilter.OrderEnum order = body.getOrder(); + Integer page = body.getPage(); + Integer pageSize = body.getPageSize(); + String sortBy = body.getSortBy(); + String username = body.getUsername(); - if (order == null) { - order = GetAllPlayersConfigurationData.OrderEnum.DESCENDING; - } - Sort.Direction direction; - - if (order == GetAllPlayersConfigurationData.OrderEnum.ASCENDING) { - direction = Sort.Direction.ASC; - } else { - direction = Sort.Direction.DESC; - } + Sort.Direction direction = orderToDirectionMapperService.orderToDirection(order); Pageable pageable = PageRequest.of(page, pageSize, Sort.by(direction, sortBy)); Page playerPage; - if (username != null && !username.trim().isEmpty()) { + if (username != null && !username.isEmpty()) { playerPage = playerRepository.findByUsernameContainingIgnoreCase(username, pageable); } else { playerPage = playerRepository.findAll(pageable); @@ -86,10 +81,6 @@ public class AdminApiController implements AdminApi { List playersMapped = playerMapperService.mapPlayersToAdministratablePlayers(playerPage.getContent()); - if (playersMapped.isEmpty()) { - return ResponseEntity.noContent().build(); - } else { - return ResponseEntity.ok(playersMapped); - } + return ResponseEntity.ok(playersMapped); } } diff --git a/src/main/java/de/towerdefence/server/utils/OrderToDirectionMapperService.java b/src/main/java/de/towerdefence/server/utils/OrderToDirectionMapperService.java new file mode 100644 index 0000000..acf0e05 --- /dev/null +++ b/src/main/java/de/towerdefence/server/utils/OrderToDirectionMapperService.java @@ -0,0 +1,18 @@ +package de.towerdefence.server.utils; + +import de.towerdefence.server.oas.models.PlayerFilter; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Component; + +@Component +public class OrderToDirectionMapperService { + + public Sort.Direction orderToDirection(PlayerFilter.OrderEnum order) { + + if (order == PlayerFilter.OrderEnum.ASCENDING) { + return Sort.Direction.ASC; + } else { + return Sort.Direction.DESC; + } + } +} diff --git a/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java b/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java index 9d01960..0de83da 100644 --- a/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java +++ b/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java @@ -11,18 +11,18 @@ import java.util.List; public class PlayerMapperService { public List mapPlayersToAdministratablePlayers(List players) { - List apiPlayers = new ArrayList<>(); + List administratablePlayers = new ArrayList<>(); for (Player player : players) { AdministratablePlayer apiPlayer = new AdministratablePlayer(); apiPlayer.setUsername(player.getUsername()); - apiPlayers.add(apiPlayer); + administratablePlayers.add(apiPlayer); } - return apiPlayers; + return administratablePlayers; } public AdministratablePlayer mapPlayerToAdministratablePlayer(Player player) { - AdministratablePlayer apiPlayer = new AdministratablePlayer(); - apiPlayer.setUsername(player.getUsername()); - return apiPlayer; + AdministratablePlayer administratablePlayer = new AdministratablePlayer(); + administratablePlayer.setUsername(player.getUsername()); + return administratablePlayer; } } diff --git a/src/test/java/de/towerdefence/server/IntegrationTest.java b/src/test/java/de/towerdefence/server/IntegrationTest.java index 5fba1d5..62d2861 100644 --- a/src/test/java/de/towerdefence/server/IntegrationTest.java +++ b/src/test/java/de/towerdefence/server/IntegrationTest.java @@ -45,7 +45,7 @@ public abstract class IntegrationTest { player.setUsername(username); try { playerService.setPassword(player, password); - playerRepository.save(player); + playerRepository.saveAndFlush(player); } catch (NoSuchAlgorithmException e) { System.err.println("Error setting password for player: " + username); } diff --git a/src/test/java/de/towerdefence/server/server/GetAllPlayersTest.java b/src/test/java/de/towerdefence/server/server/GetAllPlayersTest.java index 69aa942..556c338 100644 --- a/src/test/java/de/towerdefence/server/server/GetAllPlayersTest.java +++ b/src/test/java/de/towerdefence/server/server/GetAllPlayersTest.java @@ -1,6 +1,7 @@ package de.towerdefence.server.server; import de.towerdefence.server.IntegrationTest; +import de.towerdefence.server.oas.models.PlayerFilter; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -19,13 +20,13 @@ class GetAllPlayersTest extends IntegrationTest { @Test void playersExist() throws Exception { - String requestBody = "{" + - "\"page\": 0," + - "\"pageSize\": 10," + - "\"sortBy\": \"username\"," + - "\"order\": \"descending\"," + - "\"username\": \"\"" + - "}"; + PlayerFilter playerFilter = new PlayerFilter(); + playerFilter.setPage(0); + playerFilter.setPageSize(10); + playerFilter.setOrder(PlayerFilter.OrderEnum.DESCENDING); + playerFilter.setUsername(""); + playerFilter.setSortBy("username"); + String requestBody = this.objectMapper.writeValueAsString(playerFilter); this.mvc.perform(createGetAllPlayersRequest(requestBody)) .andExpect(status().isOk()) @@ -35,13 +36,14 @@ class GetAllPlayersTest extends IntegrationTest { @Test void playersSortedByAsc() throws Exception { - String requestBody = "{" + - "\"page\": 0," + - "\"pageSize\": 10," + - "\"sortBy\": \"username\"," + - "\"order\": \"ascending\"," + - "\"username\": \"\"" + - "}"; + + PlayerFilter playerFilter = new PlayerFilter(); + playerFilter.setPage(0); + playerFilter.setPageSize(10); + playerFilter.setOrder(PlayerFilter.OrderEnum.ASCENDING); + playerFilter.setUsername(""); + playerFilter.setSortBy("username"); + String requestBody = this.objectMapper.writeValueAsString(playerFilter); this.mvc.perform(createGetAllPlayersRequest(requestBody)) .andExpect(status().isOk()) @@ -51,13 +53,13 @@ class GetAllPlayersTest extends IntegrationTest { @Test void playersSortedByDesc() throws Exception { - String requestBody = "{" + - "\"page\": 0," + - "\"pageSize\": 10," + - "\"sortBy\": \"username\"," + - "\"order\": \"descending\"," + - "\"username\": \"\"" + - "}"; + PlayerFilter playerFilter = new PlayerFilter(); + playerFilter.setPage(0); + playerFilter.setPageSize(10); + playerFilter.setOrder(PlayerFilter.OrderEnum.DESCENDING); + playerFilter.setUsername(""); + playerFilter.setSortBy("username"); + String requestBody = this.objectMapper.writeValueAsString(playerFilter); this.mvc.perform(createGetAllPlayersRequest(requestBody)) .andExpect(status().isOk()) @@ -67,16 +69,16 @@ class GetAllPlayersTest extends IntegrationTest { @Test void playersFiltered() throws Exception { - String requestBody = "{" + - "\"page\": 0," + - "\"pageSize\": 10," + - "\"username\": \"Alex\","+ - "\"order\": \"ascending\""+ - "}"; + PlayerFilter playerFilter = new PlayerFilter(); + playerFilter.setPage(0); + playerFilter.setPageSize(10); + playerFilter.setOrder(PlayerFilter.OrderEnum.ASCENDING); + playerFilter.setUsername("Alex"); + playerFilter.setSortBy("username"); + String requestBody = this.objectMapper.writeValueAsString(playerFilter); this.mvc.perform(createGetAllPlayersRequest(requestBody)) .andExpect(status().isOk()) - .andExpect(jsonPath("$").isArray()) .andExpect(jsonPath("$[0].username").value("Alex")) .andExpect(jsonPath("$").isNotEmpty()); }