Add serverside LOGOUT command #239

Merged
lars.winzer merged 9 commits from feat/41-add-serverside-logout-command into main 2026-04-07 14:11:25 +02:00
4 changed files with 89 additions and 0 deletions
@@ -6,6 +6,9 @@ import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick.CheckUsern
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.login.LoginHandler; 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.LoginParser;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.login.LoginRequest; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.login.LoginRequest;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.logout.LogoutHandler;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.logout.LogoutParser;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.logout.LogoutRequest;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.ping.PingHandler; 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.PingParser;
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.ping.PingRequest; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.ping.PingRequest;
@@ -98,5 +101,9 @@ public class ServerApp {
parserDispatcher.register("LOGIN", new LoginParser()); parserDispatcher.register("LOGIN", new LoginParser());
commandRouter.register( commandRouter.register(
LoginRequest.class, new LoginHandler(responseDispatcher, userRegistry)); LoginRequest.class, new LoginHandler(responseDispatcher, userRegistry));
parserDispatcher.register("LOGOUT", new LogoutParser());
commandRouter.register(
LogoutRequest.class, new LogoutHandler(responseDispatcher, userRegistry));
} }
} }
@@ -0,0 +1,45 @@
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.logout;
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.ErrorResponse;
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.OkResponse;
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher;
/** Handles {@link LogoutRequest} to logout connected user. */
public class LogoutHandler implements CommandHandler<LogoutRequest> {
private final ResponseDispatcher responseDispatcher;
private final UserRegistry userRegistry;
/**
* Creates a new logout handler to logout user.
*
* @param responseDispatcher dispatcher used to send the logout result back to the client
* @param userRegistry registry responsible for tracking connected user sessions
*/
public LogoutHandler(ResponseDispatcher responseDispatcher, UserRegistry userRegistry) {
this.responseDispatcher = responseDispatcher;
this.userRegistry = userRegistry;
}
/**
* Executes the logout request for the given request.
*
* <p>The user is removed from the {@link UserRegistry}.
*
* @param request the request to execute
*/
@Override
public void execute(LogoutRequest request) {
boolean wasRemoved = userRegistry.removeBySessionId(request.getSessionId());
if (wasRemoved) {
responseDispatcher.dispatch(new OkResponse(request.getContext()));
} else {
responseDispatcher.dispatch(
new ErrorResponse(
request.getContext(),
"NO_USER_ASSOCIATED",
"No user is associated with your session. Did you login before?"));
}
}
}
@@ -0,0 +1,19 @@
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.logout;
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 LogoutRequest}. */
public class LogoutParser implements CommandParser<LogoutRequest> {
/**
* Parses a primitive request into a LogoutRequest.
*
* @param primitiveRequest the request to parse
* @return the created {@link LogoutRequest}
*/
@Override
public LogoutRequest parse(PrimitiveRequest primitiveRequest) {
return new LogoutRequest(primitiveRequest.context());
}
}
@@ -0,0 +1,18 @@
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.logout;
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 logout a currently logged in user */
public class LogoutRequest extends Request {
/**
* Constructs a new LogoutRequest with the given context.
*
* @param context the {@link RequestContext} containing information for responding to the
* request
*/
public LogoutRequest(RequestContext context) {
super(context);
}
}