From 898ed33e6a540b00fc88573f3071c4f8e677f8b5 Mon Sep 17 00:00:00 2001 From: Dorian Nemec Date: Wed, 12 Mar 2025 12:01:47 +0100 Subject: [PATCH 1/3] TD-4: Added banned variable to player --- api/api.yml | 19 +++++++++++++++++++ .../server/admin/AdminApiController.java | 10 ++++++++++ .../de/towerdefence/server/player/Player.java | 10 ++++++---- .../server/player/PlayerService.java | 8 ++++++++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/api/api.yml b/api/api.yml index 5853902..132f35c 100644 --- a/api/api.yml +++ b/api/api.yml @@ -95,6 +95,8 @@ components: properties: username: type: string + id: + type: integer required: - username ############################################# @@ -259,6 +261,23 @@ paths: type: array items: $ref: "#/components/schemas/AdministratablePlayer" + /admin/player/{id}/ban: + parameters: + - in: path + name: id + schema: + type: integer + format: int64 + required: true + post: + operationId: "BanPlayer" + tags: + - admin + summary: "Ban player by id" + description: "Bans a player by id, making them unable to play the game." + responses: + 200: + description: "Successfully banned player!" 401: $ref: "#/components/responses/401Unauthorized" 500: diff --git a/src/main/java/de/towerdefence/server/admin/AdminApiController.java b/src/main/java/de/towerdefence/server/admin/AdminApiController.java index 9356c2a..8e3dee5 100644 --- a/src/main/java/de/towerdefence/server/admin/AdminApiController.java +++ b/src/main/java/de/towerdefence/server/admin/AdminApiController.java @@ -8,6 +8,7 @@ import de.towerdefence.server.oas.models.AdministratablePlayer; import de.towerdefence.server.oas.models.PlayerFilter; import de.towerdefence.server.player.Player; import de.towerdefence.server.player.PlayerRepository; +import de.towerdefence.server.player.PlayerService; import de.towerdefence.server.utils.OrderToDirectionMapperService; import de.towerdefence.server.utils.PlayerMapperService; import jakarta.servlet.http.HttpServletRequest; @@ -36,6 +37,9 @@ public class AdminApiController implements AdminApi { @Autowired PlayerMapperService playerMapperService; + @Autowired + PlayerService playerService; + @Autowired OrderToDirectionMapperService orderToDirectionMapperService; @@ -57,6 +61,12 @@ public class AdminApiController implements AdminApi { return ResponseEntity.ok(authInfo); } + @Override + public ResponseEntity banPlayer(Long id) { + this.playerService.banPlayer(id); + return null; + } + @Override public ResponseEntity> getAllPlayers(PlayerFilter body) { diff --git a/src/main/java/de/towerdefence/server/player/Player.java b/src/main/java/de/towerdefence/server/player/Player.java index 1d84ec9..058b8cf 100644 --- a/src/main/java/de/towerdefence/server/player/Player.java +++ b/src/main/java/de/towerdefence/server/player/Player.java @@ -2,11 +2,9 @@ package de.towerdefence.server.player; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import lombok.Setter; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.AllArgsConstructor; +import lombok.*; import jakarta.persistence.*; +import org.hibernate.annotations.ColumnDefault; @NoArgsConstructor @AllArgsConstructor @@ -33,4 +31,8 @@ public class Player { @NotNull @Size(min = PASSWORD_SALT_BYTE_LENGTH, max = PASSWORD_SALT_BYTE_LENGTH) private byte[] passwordSalt; + + @NotNull + @ColumnDefault("false") + private boolean banned; } diff --git a/src/main/java/de/towerdefence/server/player/PlayerService.java b/src/main/java/de/towerdefence/server/player/PlayerService.java index 0cfc6d1..de7a1c5 100644 --- a/src/main/java/de/towerdefence/server/player/PlayerService.java +++ b/src/main/java/de/towerdefence/server/player/PlayerService.java @@ -1,5 +1,6 @@ package de.towerdefence.server.player; +import de.towerdefence.server.oas.models.AdministratablePlayer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -49,4 +50,11 @@ public class PlayerService { md.update(salt); return md.digest(password); } + + public void banPlayer(Long id) { + this.playerRepository.findById(id).ifPresent(player -> { + player.setBanned(true); + this.playerRepository.saveAndFlush(player); + }); + } } -- 2.45.3 From bce1c6aa4ef2711366f6e2c5b64c17bba2061382 Mon Sep 17 00:00:00 2001 From: Dorian Nemec Date: Wed, 12 Mar 2025 13:16:57 +0100 Subject: [PATCH 2/3] TD-4: Added banning functionality --- api/api.yml | 4 ++++ .../de/towerdefence/server/utils/PlayerMapperService.java | 2 ++ 2 files changed, 6 insertions(+) diff --git a/api/api.yml b/api/api.yml index 132f35c..6910812 100644 --- a/api/api.yml +++ b/api/api.yml @@ -97,8 +97,12 @@ components: type: string id: type: integer + format: int64 + banned: + type: boolean required: - username + - banned ############################################# # PlayerFilter # ############################################# diff --git a/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java b/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java index 0de83da..e6a3f79 100644 --- a/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java +++ b/src/main/java/de/towerdefence/server/utils/PlayerMapperService.java @@ -15,6 +15,8 @@ public class PlayerMapperService { for (Player player : players) { AdministratablePlayer apiPlayer = new AdministratablePlayer(); apiPlayer.setUsername(player.getUsername()); + apiPlayer.setId(player.getId()); + apiPlayer.setBanned(player.isBanned()); administratablePlayers.add(apiPlayer); } return administratablePlayers; -- 2.45.3 From ca8942feba42c9f174b4d7e9f2b057a4b7ea2121 Mon Sep 17 00:00:00 2001 From: Dorian Nemec Date: Wed, 12 Mar 2025 13:53:02 +0100 Subject: [PATCH 3/3] TD-4: Unban --- api/api.yml | 17 +++++++++++++++++ .../server/admin/AdminApiController.java | 6 ++++++ .../server/player/PlayerService.java | 7 +++++++ .../server/server/ServerApiController.java | 6 +++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/api/api.yml b/api/api.yml index 6910812..08389d1 100644 --- a/api/api.yml +++ b/api/api.yml @@ -282,6 +282,23 @@ paths: responses: 200: description: "Successfully banned player!" + /admin/player/{id}/unban: + parameters: + - in: path + name: id + schema: + type: integer + format: int64 + required: true + post: + operationId: "UnbanPlayer" + tags: + - admin + summary: "Unban player by id" + description: "Unbans a player by id, allowing them to play the game." + responses: + 200: + description: "Successfully unbanned player!" 401: $ref: "#/components/responses/401Unauthorized" 500: diff --git a/src/main/java/de/towerdefence/server/admin/AdminApiController.java b/src/main/java/de/towerdefence/server/admin/AdminApiController.java index 8e3dee5..3191942 100644 --- a/src/main/java/de/towerdefence/server/admin/AdminApiController.java +++ b/src/main/java/de/towerdefence/server/admin/AdminApiController.java @@ -93,4 +93,10 @@ public class AdminApiController implements AdminApi { return ResponseEntity.ok(playersMapped); } + + @Override + public ResponseEntity unbanPlayer(Long id) { + this.playerService.unbanPlayer(id); + return null; + } } diff --git a/src/main/java/de/towerdefence/server/player/PlayerService.java b/src/main/java/de/towerdefence/server/player/PlayerService.java index de7a1c5..fef4e99 100644 --- a/src/main/java/de/towerdefence/server/player/PlayerService.java +++ b/src/main/java/de/towerdefence/server/player/PlayerService.java @@ -57,4 +57,11 @@ public class PlayerService { this.playerRepository.saveAndFlush(player); }); } + + public void unbanPlayer(Long id) { + this.playerRepository.findById(id).ifPresent(player -> { + player.setBanned(false); + this.playerRepository.saveAndFlush(player); + }); + } } diff --git a/src/main/java/de/towerdefence/server/server/ServerApiController.java b/src/main/java/de/towerdefence/server/server/ServerApiController.java index 2dda3e3..3975481 100644 --- a/src/main/java/de/towerdefence/server/server/ServerApiController.java +++ b/src/main/java/de/towerdefence/server/server/ServerApiController.java @@ -45,7 +45,7 @@ public class ServerApiController implements ServerApi { @Override public ResponseEntity playerRegister(PlayerRegistrationData body) { if(playerRepository.existsByUsername(body.getUsername())){ - return new ResponseEntity<>(HttpStatus.CONFLICT); + return new ResponseEntity<>(HttpStatus.FORBIDDEN); } Player newPlayer = new Player(); newPlayer.setUsername(body.getUsername()); @@ -61,6 +61,10 @@ public class ServerApiController implements ServerApi { @Override public ResponseEntity playerLogin(PlayerLoginData body) { Player player = playerRepository.findByUsername(body.getUsername()); + if(player.isBanned()) + { + return new ResponseEntity<>(HttpStatus.CONFLICT); + } if(player == null){ return new ResponseEntity<>(HttpStatus.UNAUTHORIZED); } -- 2.45.3