diff --git a/api/api.yml b/api/api.yml index 5853902..08389d1 100644 --- a/api/api.yml +++ b/api/api.yml @@ -95,8 +95,14 @@ components: properties: username: type: string + id: + type: integer + format: int64 + banned: + type: boolean required: - username + - banned ############################################# # PlayerFilter # ############################################# @@ -259,6 +265,40 @@ 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!" + /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 9356c2a..3191942 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) { @@ -83,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/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..fef4e99 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,18 @@ 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); + }); + } + + 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); } 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;