From 35c8590c57ea364c91128a0c4e603ef310d54004 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 2 Apr 2026 13:10:01 +0200 Subject: [PATCH 01/10] Add: CheckUsernameRequest containing username to check for availability --- .../check_nick/CheckUsernameRequest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java new file mode 100644 index 0000000..0b5bda6 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java @@ -0,0 +1,17 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick; + +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; + +public class CheckUsernameRequest extends Request { + private final String username; + + public CheckUsernameRequest(RequestContext context, String username) { + super(context); + this.username = username; + } + + public String getUsername() { + return username; + } +} -- 2.52.0 From 3b44e58505fa521f97abe68e278d48eb024228c6 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 2 Apr 2026 13:26:27 +0200 Subject: [PATCH 02/10] Add: CheckUsernameParser to check for required parameter --- .../commands/check_nick/CheckUsernameParser.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java new file mode 100644 index 0000000..24b5263 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java @@ -0,0 +1,13 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick; + +import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParser; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.accessor.RequestParameterAccessor; + +public class CheckUsernameParser implements CommandParser { + @Override + public CheckUsernameRequest parse(PrimitiveRequest primitiveRequest) { + RequestParameterAccessor accessor = new RequestParameterAccessor(primitiveRequest.parameters()); + return new CheckUsernameRequest(primitiveRequest.context(), accessor.require("USERNAME")); + } +} -- 2.52.0 From 07587340d411c2f59a2c91d98400e837079dffcb Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 2 Apr 2026 13:30:22 +0200 Subject: [PATCH 03/10] Add: Register CheckUsernameParser in composition root --- .../ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java index 4d4f1ec..a182f80 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java @@ -1,5 +1,6 @@ package ch.unibas.dmi.dbis.cs108.casono.server; +import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick.CheckUsernameParser; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.ping.PingHandler; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.ping.PingParser; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.ping.PingRequest; @@ -64,7 +65,7 @@ public class ServerApp { ResponseDispatcher responseDispatcher = new ResponseDispatcher(sessionManager); - registerCommands(dispatcher, router, responseDispatcher); + registerCommands(dispatcher, router, responseDispatcher, userRegistry); networkManager.start(); } @@ -79,8 +80,11 @@ public class ServerApp { private static void registerCommands( CommandParserDispatcher parserDispatcher, CommandRouter commandRouter, - ResponseDispatcher responseDispatcher) { + ResponseDispatcher responseDispatcher, + UserRegistry userRegistry) { parserDispatcher.register("PING", new PingParser()); commandRouter.register(PingRequest.class, new PingHandler(responseDispatcher)); + + parserDispatcher.register("CHECK_USERNAME", new CheckUsernameParser()); } } -- 2.52.0 From bfbf4b20152b7aa90b71ad79ec0c1fa0a22b8c3a Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 2 Apr 2026 14:28:56 +0200 Subject: [PATCH 04/10] Add: UsernameAvailability enum with availability states --- .../app/commands/check_nick/UsernameAvailability.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java new file mode 100644 index 0000000..1f176d1 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java @@ -0,0 +1,6 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick; + +public enum UsernameAvailability { + FREE, + TAKEN +} -- 2.52.0 From 9087f009d3d38f2d3ac64dc98c0b989a99dbfd5e Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 2 Apr 2026 14:33:26 +0200 Subject: [PATCH 05/10] Add: CheckUsernameResponse containing username availability field --- .../commands/check_nick/CheckUsernameResponse.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameResponse.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameResponse.java new file mode 100644 index 0000000..70fcb60 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameResponse.java @@ -0,0 +1,11 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick; + +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.SuccessResponse; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBodyBuilder; + +public class CheckUsernameResponse extends SuccessResponse { + public CheckUsernameResponse(RequestContext context, UsernameAvailability availability) { + super(context, new ResponseBodyBuilder().param("STATUS", availability).build()); + } +} -- 2.52.0 From 5fa478c4406c4a5133d72686fd6af356deb5729f Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 2 Apr 2026 14:33:59 +0200 Subject: [PATCH 06/10] Add: CheckUsernameHandler getting User from UserRegistry and determining availablity --- .../check_nick/CheckUsernameHandler.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameHandler.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameHandler.java new file mode 100644 index 0000000..d2c1d28 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameHandler.java @@ -0,0 +1,29 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick; + +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.CommandHandler; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher; +import java.util.Optional; + +public class CheckUsernameHandler implements CommandHandler { + private final ResponseDispatcher responseDispatcher; + private final UserRegistry userRegistry; + + public CheckUsernameHandler(ResponseDispatcher responseDispatcher, UserRegistry userRegistry) { + this.responseDispatcher = responseDispatcher; + this.userRegistry = userRegistry; + } + + @Override + public void execute(CheckUsernameRequest request) { + Optional user = userRegistry.getByUsername(request.getUsername()); + UsernameAvailability availability; + if (user.isEmpty()) { + availability = UsernameAvailability.FREE; + } else { + availability = UsernameAvailability.TAKEN; + } + responseDispatcher.dispatch(new CheckUsernameResponse(request.getContext(), availability)); + } +} -- 2.52.0 From 5ef2fa5df1a6a314036f8e0b36a45e4fe3c2b3fd Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 2 Apr 2026 14:34:24 +0200 Subject: [PATCH 07/10] Refactor: Change UsernameAvailability from public to package-private access --- .../server/app/commands/check_nick/UsernameAvailability.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java index 1f176d1..4cf42eb 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java @@ -1,6 +1,6 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick; -public enum UsernameAvailability { +enum UsernameAvailability { FREE, TAKEN } -- 2.52.0 From 72e3d257ffc8aa1b2fc4467fa522410c123fb3bd Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 2 Apr 2026 14:35:56 +0200 Subject: [PATCH 08/10] Add: Register CheckUsernameHandler in composition root --- .../ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java index a182f80..48ac98f 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java @@ -1,6 +1,8 @@ package ch.unibas.dmi.dbis.cs108.casono.server; +import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick.CheckUsernameHandler; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick.CheckUsernameParser; +import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick.CheckUsernameRequest; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.ping.PingHandler; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.ping.PingParser; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.ping.PingRequest; @@ -86,5 +88,8 @@ public class ServerApp { commandRouter.register(PingRequest.class, new PingHandler(responseDispatcher)); parserDispatcher.register("CHECK_USERNAME", new CheckUsernameParser()); + commandRouter.register( + CheckUsernameRequest.class, + new CheckUsernameHandler(responseDispatcher, userRegistry)); } } -- 2.52.0 From de11d673dc0f18949b163520f14f226688dc0a69 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 2 Apr 2026 15:02:00 +0200 Subject: [PATCH 09/10] Docs: Write JavaDoc for added components --- .../commands/check_nick/CheckUsernameHandler.java | 15 +++++++++++++++ .../commands/check_nick/CheckUsernameParser.java | 7 +++++++ .../commands/check_nick/CheckUsernameRequest.java | 13 +++++++++++++ .../check_nick/CheckUsernameResponse.java | 7 +++++++ .../commands/check_nick/UsernameAvailability.java | 4 ++++ 5 files changed, 46 insertions(+) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameHandler.java index d2c1d28..c238ba1 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameHandler.java @@ -6,15 +6,30 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandH import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher; import java.util.Optional; +/** Handles {@link CheckUsernameRequest}s to check whether a username is available. */ public class CheckUsernameHandler implements CommandHandler { private final ResponseDispatcher responseDispatcher; private final UserRegistry userRegistry; + /** + * Creates a new handler for checking username availability. + * + * @param responseDispatcher the dispatcher used to send the response + * @param userRegistry the registry used to look up existing users + */ public CheckUsernameHandler(ResponseDispatcher responseDispatcher, UserRegistry userRegistry) { this.responseDispatcher = responseDispatcher; this.userRegistry = userRegistry; } + /** + * Executes the username availability check for the given request. + * + *

If no user exists for the requested username, the username is reported as {@link + * UsernameAvailability#FREE}; otherwise, it is reported as {@link UsernameAvailability#TAKEN}. + * + * @param request the request to execute + */ @Override public void execute(CheckUsernameRequest request) { Optional user = userRegistry.getByUsername(request.getUsername()); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java index 24b5263..07df259 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java @@ -4,7 +4,14 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandPar import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.accessor.RequestParameterAccessor; +/** Parses a primitive request into a {@link CheckUsernameRequest}. */ public class CheckUsernameParser implements CommandParser { + /** + * Extracts the required {@code USERNAME} parameter from the incoming request. + * + * @param primitiveRequest the request to parse + * @return {@link CheckUsernameRequest} containing the username + */ @Override public CheckUsernameRequest parse(PrimitiveRequest primitiveRequest) { RequestParameterAccessor accessor = new RequestParameterAccessor(primitiveRequest.parameters()); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java index 0b5bda6..e5c34fa 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java @@ -3,14 +3,27 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; +/** Request implementation used to check whether a username is available or already taken */ public class CheckUsernameRequest extends Request { private final String username; + /** + * Constructs a new CheckUsernameRequest with the given context and username to check + * + * @param context the {@link RequestContext} containing information for responding to the + * request + * @param username the username to check for availability + */ public CheckUsernameRequest(RequestContext context, String username) { super(context); this.username = username; } + /** + * Returns the provided username in the request + * + * @return username to check + */ public String getUsername() { return username; } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameResponse.java index 70fcb60..5018323 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameResponse.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameResponse.java @@ -4,7 +4,14 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestCo import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.SuccessResponse; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBodyBuilder; +/** Response indicating the availability status of a username check. */ public class CheckUsernameResponse extends SuccessResponse { + /** + * Creates a new response to respond to the username availability check to + * + * @param context the {@link RequestContext} associated with the request + * @param availability the availability status of the requested username + */ public CheckUsernameResponse(RequestContext context, UsernameAvailability availability) { super(context, new ResponseBodyBuilder().param("STATUS", availability).build()); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java index 4cf42eb..df3d358 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/UsernameAvailability.java @@ -1,6 +1,10 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick; +/** Represents the availability status of a username */ enum UsernameAvailability { + /** Username is available */ FREE, + + /** Username is already in use */ TAKEN } -- 2.52.0 From 93dba00a4d961a497e36fc873a3adc59b0f58a52 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 2 Apr 2026 15:02:58 +0200 Subject: [PATCH 10/10] Style: Apply Spotless --- .../server/app/commands/check_nick/CheckUsernameParser.java | 3 ++- .../server/app/commands/check_nick/CheckUsernameRequest.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java index 07df259..20624c0 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameParser.java @@ -14,7 +14,8 @@ public class CheckUsernameParser implements CommandParser */ @Override public CheckUsernameRequest parse(PrimitiveRequest primitiveRequest) { - RequestParameterAccessor accessor = new RequestParameterAccessor(primitiveRequest.parameters()); + RequestParameterAccessor accessor = + new RequestParameterAccessor(primitiveRequest.parameters()); return new CheckUsernameRequest(primitiveRequest.context(), accessor.require("USERNAME")); } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java index e5c34fa..7247b0e 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/check_nick/CheckUsernameRequest.java @@ -9,7 +9,7 @@ public class CheckUsernameRequest extends Request { /** * Constructs a new CheckUsernameRequest with the given context and username to check - * + * * @param context the {@link RequestContext} containing information for responding to the * request * @param username the username to check for availability -- 2.52.0