Merge branch 'main' into 'feat/client-chat'

# Conflicts:
#   src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java
This commit is contained in:
Mathis Ginkel
2026-04-09 19:34:38 +00:00
7 changed files with 174 additions and 1 deletions
@@ -9,6 +9,9 @@ import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.get_message_count.Get
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.get_next_message.GetNextMessageHandler;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.get_next_message.GetNextMessageParser;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.get_next_message.GetNextMessageRequest;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users.ListUsersHandler;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users.ListUsersParser;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users.ListUsersRequest;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.login.LoginHandler;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.login.LoginParser;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.login.LoginRequest;
@@ -115,6 +118,7 @@ public class ServerApp {
parserDispatcher.register("LOGOUT", new LogoutParser());
commandRouter.register(
LogoutRequest.class, new LogoutHandler(responseDispatcher, userRegistry));
parserDispatcher.register("SEND_MESSAGE", new SendMessageParser());
commandRouter.register(
SendMessageRequest.class, new SendMessageHandler(responseDispatcher, userRegistry));
@@ -128,5 +132,9 @@ public class ServerApp {
commandRouter.register(
GetNextMessageRequest.class,
new GetNextMessageHandler(responseDispatcher, userRegistry));
parserDispatcher.register("LIST_USERS", new ListUsersParser());
commandRouter.register(
ListUsersRequest.class, new ListUsersHandler(responseDispatcher, userRegistry));
}
}
@@ -0,0 +1,40 @@
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users;
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.Collection;
/**
* Handles {@link ListUsersRequest}s by retrieving all users from the {@link UserRegistry} and
* dispatching a {@link ListUsersResponse} containing the list of users.
*/
public class ListUsersHandler extends CommandHandler<ListUsersRequest> {
private final UserRegistry userRegistry;
/**
* Creates a new handler for listing all users
*
* @param responseDispatcher the dispatcher used to send the response
* @param userRegistry the registry used to look up existing users
*/
public ListUsersHandler(ResponseDispatcher responseDispatcher, UserRegistry userRegistry) {
super(responseDispatcher);
this.userRegistry = userRegistry;
}
/**
* Executes the list users request
*
* <p>All users are retrieved from the {@link UserRegistry} and returned in a {@link
* ListUsersResponse}.
*
* @param request the request to execute
*/
@Override
public void execute(ListUsersRequest request) {
Collection<User> users = userRegistry.getAllUsers();
responseDispatcher.dispatch(new ListUsersResponse(request.getContext(), users));
}
}
@@ -0,0 +1,18 @@
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users;
import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParser;
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest;
/** Parses a primitive request into a {@link ListUsersRequest}. */
public class ListUsersParser implements CommandParser<ListUsersRequest> {
/**
* Parses a primitive request into a ListUsersRequest.
*
* @param primitiveRequest the request to parse
* @return the created {@link ListUsersRequest}
*/
@Override
public ListUsersRequest parse(PrimitiveRequest primitiveRequest) {
return new ListUsersRequest(primitiveRequest.context());
}
}
@@ -0,0 +1,17 @@
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users;
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 retrieve all existing users from the server. */
public class ListUsersRequest extends Request {
/**
* Constructs a new ListUsersRequest with the given context
*
* @param context the {@link RequestContext} containing information for responding to the
* request
*/
public ListUsersRequest(RequestContext context) {
super(context);
}
}
@@ -0,0 +1,35 @@
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users;
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User;
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.ResponseBody;
import java.util.Collection;
/** Response containing a list of all active users on the server */
public class ListUsersResponse extends SuccessResponse {
/**
* Creates a new ListUsersResponse containing the given list of users
*
* @param context the {@link RequestContext} associated with the request
* @param users the collection of users currently active on the server
*/
public ListUsersResponse(RequestContext context, Collection<User> users) {
super(
context,
ResponseBody.builder()
.block(
"USERS",
users_block -> {
for (User user : users) {
users_block.block(
"USER",
user_block -> {
user_block.param("USERNAME", user.getName());
user_block.param("ID", user.getId().value());
});
}
})
.build());
}
}
@@ -52,5 +52,5 @@ public abstract class CommandHandler<T extends Request> {
*
* @param request the request to execute, of type T
*/
public void execute(T request) {}
public abstract void execute(T request);
}