From 16c91c6aaef73454e5f14faeb9946be95ed0be5f Mon Sep 17 00:00:00 2001 From: Jona Walpert Date: Thu, 23 Apr 2026 15:16:45 +0200 Subject: [PATCH 1/2] Feat: Add lobby check to repalce duplicate code --- .../app/checks/GameLobbyExistsCheck.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/checks/GameLobbyExistsCheck.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/checks/GameLobbyExistsCheck.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/checks/GameLobbyExistsCheck.java new file mode 100644 index 0000000..fba5240 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/checks/GameLobbyExistsCheck.java @@ -0,0 +1,75 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.checks; + +import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.game.bet.PlayerBetRequest; +import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.game.call.PlayerCallRequest; +import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.game.fold.PlayerFoldRequest; +import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.game.raise.PlayerRaiseRequest; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.Lobby; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyId; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyManager; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry; +import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.checks.HandlerCheck; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.ErrorResponse; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.Response; +import java.util.Optional; + +/** + * Checks whether a target lobby exists for game action commands. + * + *

Supported commands are BET, CALL, FOLD and RAISE. If a request specifies a GAME_ID, the check + * validates that this lobby exists. Otherwise, it validates that the logged-in user is in a lobby. + */ +public class GameLobbyExistsCheck implements HandlerCheck { + private final UserRegistry userRegistry; + private final LobbyManager lobbyManager; + + public GameLobbyExistsCheck(UserRegistry userRegistry, LobbyManager lobbyManager) { + this.userRegistry = userRegistry; + this.lobbyManager = lobbyManager; + } + + @Override + public Optional check(Request request) { + Integer gameId = extractGameId(request); + User user = userRegistry.getBySessionId(request.getSessionId()).get(); + + Lobby lobby; + if (gameId != null) { + lobby = lobbyManager.getLobby(LobbyId.of(gameId)); + } else { + lobby = lobbyManager.getLobbyByUsername(user.getName()); + } + + if (lobby != null) { + return Optional.empty(); + } + + if (gameId != null) { + return Optional.of( + new ErrorResponse(request.getContext(), "LOBBY_NOT_FOUND", "Lobby not found")); + } + + return Optional.of( + new ErrorResponse(request.getContext(), "NOT_IN_LOBBY", "User not in a lobby")); + } + + private Integer extractGameId(Request request) { + if (request instanceof PlayerBetRequest) { + return ((PlayerBetRequest) request).getGameId(); + } + if (request instanceof PlayerCallRequest) { + return ((PlayerCallRequest) request).getGameId(); + } + if (request instanceof PlayerFoldRequest) { + return ((PlayerFoldRequest) request).getGameId(); + } + if (request instanceof PlayerRaiseRequest) { + return ((PlayerRaiseRequest) request).getGameId(); + } + + throw new IllegalStateException( + "GameLobbyExistsCheck is only supported for BET, CALL, FOLD and RAISE requests"); + } +} From b9e45142c285c8425b39ca0b137247bb62004f57 Mon Sep 17 00:00:00 2001 From: Jona Walpert Date: Thu, 23 Apr 2026 15:17:30 +0200 Subject: [PATCH 2/2] Refactor: changed duplicate lobyb existence checks to the new preexecution check --- .../commands/game/bet/PlayerBetHandler.java | 26 +++++++------------ .../commands/game/call/PlayerCallHandler.java | 26 +++++++------------ .../commands/game/fold/PlayerFoldHandler.java | 26 +++++++------------ .../game/raise/PlayerRaiseHandler.java | 26 +++++++------------ 4 files changed, 40 insertions(+), 64 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/bet/PlayerBetHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/bet/PlayerBetHandler.java index a37ebce..11c6ee3 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/bet/PlayerBetHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/bet/PlayerBetHandler.java @@ -1,7 +1,10 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.game.bet; +import ch.unibas.dmi.dbis.cs108.casono.server.app.checks.GameLobbyExistsCheck; +import ch.unibas.dmi.dbis.cs108.casono.server.app.checks.UserLoggedInCheck; import ch.unibas.dmi.dbis.cs108.casono.server.domain.game.GameController; import ch.unibas.dmi.dbis.cs108.casono.server.domain.game.player.PlayerId; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.Lobby; import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyId; import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyManager; import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User; @@ -41,6 +44,8 @@ public class PlayerBetHandler extends CommandHandler { super(responseDispatcher); this.userRegistry = userRegistry; this.lobbyManager = lobbyManager; + addCheck(new UserLoggedInCheck(userRegistry)); + addCheck(new GameLobbyExistsCheck(userRegistry, lobbyManager)); } /** @@ -69,22 +74,11 @@ public class PlayerBetHandler extends CommandHandler { String username = opt.get().getName(); Integer gameId = request.getGameId(); - var lobby = - (gameId != null) - ? lobbyManager.getLobby(LobbyId.of(gameId)) - : lobbyManager.getLobbyByUsername(username); - - if (lobby == null) { - if (gameId != null) { - responseDispatcher.dispatch( - new ErrorResponse( - request.getContext(), "LOBBY_NOT_FOUND", "Lobby not found")); - } else { - responseDispatcher.dispatch( - new ErrorResponse( - request.getContext(), "NOT_IN_LOBBY", "User not in a lobby")); - } - return; + Lobby lobby; + if (gameId != null) { + lobby = lobbyManager.getLobby(LobbyId.of(gameId)); + } else { + lobby = lobbyManager.getLobbyByUsername(username); } GameController game = lobby.getGameController(); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/call/PlayerCallHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/call/PlayerCallHandler.java index b1c3618..3dcc013 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/call/PlayerCallHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/call/PlayerCallHandler.java @@ -1,7 +1,10 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.game.call; +import ch.unibas.dmi.dbis.cs108.casono.server.app.checks.GameLobbyExistsCheck; +import ch.unibas.dmi.dbis.cs108.casono.server.app.checks.UserLoggedInCheck; import ch.unibas.dmi.dbis.cs108.casono.server.domain.game.GameController; import ch.unibas.dmi.dbis.cs108.casono.server.domain.game.player.PlayerId; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.Lobby; import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyId; import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyManager; import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User; @@ -37,6 +40,8 @@ public class PlayerCallHandler extends CommandHandler { super(responseDispatcher); this.userRegistry = userRegistry; this.lobbyManager = lobbyManager; + addCheck(new UserLoggedInCheck(userRegistry)); + addCheck(new GameLobbyExistsCheck(userRegistry, lobbyManager)); } /** @@ -57,22 +62,11 @@ public class PlayerCallHandler extends CommandHandler { String username = opt.get().getName(); Integer gameId = request.getGameId(); - var lobby = - (gameId != null) - ? lobbyManager.getLobby(LobbyId.of(gameId)) - : lobbyManager.getLobbyByUsername(username); - - if (lobby == null) { - if (gameId != null) { - responseDispatcher.dispatch( - new ErrorResponse( - request.getContext(), "LOBBY_NOT_FOUND", "Lobby not found")); - } else { - responseDispatcher.dispatch( - new ErrorResponse( - request.getContext(), "NOT_IN_LOBBY", "User not in a lobby")); - } - return; + Lobby lobby; + if (gameId != null) { + lobby = lobbyManager.getLobby(LobbyId.of(gameId)); + } else { + lobby = lobbyManager.getLobbyByUsername(username); } GameController game = lobby.getGameController(); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/fold/PlayerFoldHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/fold/PlayerFoldHandler.java index 7adca85..0aafca7 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/fold/PlayerFoldHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/fold/PlayerFoldHandler.java @@ -1,7 +1,10 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.game.fold; +import ch.unibas.dmi.dbis.cs108.casono.server.app.checks.GameLobbyExistsCheck; +import ch.unibas.dmi.dbis.cs108.casono.server.app.checks.UserLoggedInCheck; import ch.unibas.dmi.dbis.cs108.casono.server.domain.game.GameController; import ch.unibas.dmi.dbis.cs108.casono.server.domain.game.player.PlayerId; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.Lobby; import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyId; import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyManager; import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User; @@ -37,6 +40,8 @@ public class PlayerFoldHandler extends CommandHandler { super(responseDispatcher); this.userRegistry = userRegistry; this.lobbyManager = lobbyManager; + addCheck(new UserLoggedInCheck(userRegistry)); + addCheck(new GameLobbyExistsCheck(userRegistry, lobbyManager)); } /** @@ -57,22 +62,11 @@ public class PlayerFoldHandler extends CommandHandler { String username = opt.get().getName(); Integer gameId = request.getGameId(); - var lobby = - (gameId != null) - ? lobbyManager.getLobby(LobbyId.of(gameId)) - : lobbyManager.getLobbyByUsername(username); - - if (lobby == null) { - if (gameId != null) { - responseDispatcher.dispatch( - new ErrorResponse( - request.getContext(), "LOBBY_NOT_FOUND", "Lobby not found")); - } else { - responseDispatcher.dispatch( - new ErrorResponse( - request.getContext(), "NOT_IN_LOBBY", "User not in a lobby")); - } - return; + Lobby lobby; + if (gameId != null) { + lobby = lobbyManager.getLobby(LobbyId.of(gameId)); + } else { + lobby = lobbyManager.getLobbyByUsername(username); } GameController game = lobby.getGameController(); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/raise/PlayerRaiseHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/raise/PlayerRaiseHandler.java index c17b11c..a089603 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/raise/PlayerRaiseHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/game/raise/PlayerRaiseHandler.java @@ -1,7 +1,10 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.game.raise; +import ch.unibas.dmi.dbis.cs108.casono.server.app.checks.GameLobbyExistsCheck; +import ch.unibas.dmi.dbis.cs108.casono.server.app.checks.UserLoggedInCheck; import ch.unibas.dmi.dbis.cs108.casono.server.domain.game.GameController; import ch.unibas.dmi.dbis.cs108.casono.server.domain.game.player.PlayerId; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.Lobby; import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyId; import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyManager; import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User; @@ -41,6 +44,8 @@ public class PlayerRaiseHandler extends CommandHandler { super(responseDispatcher); this.userRegistry = userRegistry; this.lobbyManager = lobbyManager; + addCheck(new UserLoggedInCheck(userRegistry)); + addCheck(new GameLobbyExistsCheck(userRegistry, lobbyManager)); } /** @@ -71,22 +76,11 @@ public class PlayerRaiseHandler extends CommandHandler { String username = opt.get().getName(); Integer gameId = request.getGameId(); - var lobby = - (gameId != null) - ? lobbyManager.getLobby(LobbyId.of(gameId)) - : lobbyManager.getLobbyByUsername(username); - - if (lobby == null) { - if (gameId != null) { - responseDispatcher.dispatch( - new ErrorResponse( - request.getContext(), "LOBBY_NOT_FOUND", "Lobby not found")); - } else { - responseDispatcher.dispatch( - new ErrorResponse( - request.getContext(), "NOT_IN_LOBBY", "User not in a lobby")); - } - return; + Lobby lobby; + if (gameId != null) { + lobby = lobbyManager.getLobby(LobbyId.of(gameId)); + } else { + lobby = lobbyManager.getLobbyByUsername(username); } GameController game = lobby.getGameController();