From b22ffd0cfa5fdc7554b954f99eb4de7f1f1e6b49 Mon Sep 17 00:00:00 2001 From: mehdiboudjoudi Date: Wed, 19 Feb 2025 10:56:47 +0100 Subject: [PATCH] defined all players endpoint in oas, implemented method to get all players filtered and paginated (not done) --- api/api.yml | 32 +++++++++++++++ .../server/admin/AdminApiController.java | 41 ++++++++++++++++++- .../server/player/PlayerRepository.java | 3 ++ .../server/utils/PlayerMapperService.java | 21 ++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/towerdefence/server/utils/PlayerMapperService.java diff --git a/api/api.yml b/api/api.yml index 17a79e2..0c41e0b 100644 --- a/api/api.yml +++ b/api/api.yml @@ -58,6 +58,17 @@ components: type: string required: - username + ############################################# + # PlayerApiModel # + ############################################# + PlayerApiModel: + description: a Player + type: object + properties: + name: + type: string + required: + - name responses: 201PlayerCreated: description: "201 - Player Created" @@ -146,5 +157,26 @@ paths: $ref: "#/components/responses/401Unauthorized" 500: $ref: "#/components/responses/500InternalError" + 503: + $ref: "#/components/responses/503ServiceUnavailable" + /admin/players: + get: + operationId: "GetAllPlayers" + tags: + - admin + description: 'Endpoint for getting all players' + responses: + 200: + description: "A List of all Player" + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/PlayerApiModel" + 401: + $ref: "#/components/responses/401Unauthorized" + 500: + $ref: "#/components/responses/500InternalError" 503: $ref: "#/components/responses/503ServiceUnavailable" \ No newline at end of file diff --git a/src/main/java/de/towerdefence/server/admin/AdminApiController.java b/src/main/java/de/towerdefence/server/admin/AdminApiController.java index a04f9b6..8ae62d9 100644 --- a/src/main/java/de/towerdefence/server/admin/AdminApiController.java +++ b/src/main/java/de/towerdefence/server/admin/AdminApiController.java @@ -1,16 +1,26 @@ package de.towerdefence.server.admin; - import com.fasterxml.jackson.databind.ObjectMapper; 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.PlayerApiModel; +import de.towerdefence.server.player.Player; +import de.towerdefence.server.player.PlayerRepository; +import de.towerdefence.server.utils.PlayerMapperService; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +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; @Controller @@ -20,6 +30,13 @@ public class AdminApiController implements AdminApi { @Autowired UserSession userSession; + @Autowired + PlayerRepository playerRepository; + + @Autowired + PlayerMapperService playerMapperService; + + @Override public Optional getObjectMapper() { return Optional.empty(); @@ -36,4 +53,26 @@ public class AdminApiController implements AdminApi { authInfo.setUsername(this.userSession.getUsername()); 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; + Pageable pageable = PageRequest.of(page, pageSize, Sort.by(direction, sortBy)); + + Page playerPage = (name != null && !name.trim().isEmpty()) + ? playerRepository.findByNameContainingIgnoreCase(name, 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 5ca4c19..d4ab50f 100644 --- a/src/main/java/de/towerdefence/server/player/PlayerRepository.java +++ b/src/main/java/de/towerdefence/server/player/PlayerRepository.java @@ -1,8 +1,11 @@ package de.towerdefence.server.player; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; 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); } diff --git a/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java b/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java new file mode 100644 index 0000000..3f31356 --- /dev/null +++ b/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java @@ -0,0 +1,21 @@ +package de.towerdefence.server.utils; + +import de.towerdefence.server.oas.models.PlayerApiModel; +import de.towerdefence.server.player.Player; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class PlayerMapperService { + + public List mapPlayerToApiPlayers(List players) { + List apiPlayers = new ArrayList<>(); + for (Player player : players) { + PlayerApiModel apiPlayer = new PlayerApiModel(); + apiPlayer.setName(player.getUsername()); + } + return apiPlayers; + } +}