Add serverside LOGOUT command #239
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+45
@@ -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?"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+19
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
+18
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user