diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java index acea01b72befa875a6c259dc85d8ae7ab08946bb..5687d1172bbc249d207eb0c62fff1cd586e087cb 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -20,6 +20,7 @@ package de.thm.arsnova.services; import java.util.List; +import java.util.UUID; import de.thm.arsnova.connector.model.Course; import de.thm.arsnova.entities.LoggedIn; @@ -46,4 +47,6 @@ public interface ISessionService { int countSessions(List<Course> courses); Session setActive(String sessionkey, Boolean lock); + + Session joinSession(String keyword, UUID socketId); } diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index 52343f340ec87dcba53cfbc308487bc8eabc4426..60915c60e968199f6742e1d379f2038b45d75a68 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -26,6 +26,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -61,9 +62,36 @@ public class SessionService implements ISessionService { this.databaseDao = newDatabaseDao; } + @Override + @Authenticated + public final Session joinSession(final String keyword, UUID socketId) { + /* Socket.IO solution */ + + Session session = databaseDao.getSession(keyword); + User user = userService.getUser2SocketId(socketId); + + userService.addUserToSessionBySocketId(socketId, keyword); + + if (session.getCreator().equals(user.getUsername())) { + databaseDao.updateSessionOwnerActivity(session); + } + databaseDao.registerAsOnlineUser(user, session); + + if (connectorClient != null && session.isCourseSession()) { + String courseid = session.getCourseId(); + if (!connectorClient.getMembership(user.getUsername(), courseid).isMember()) { + throw new ForbiddenException(); + } + } + + return session; + } + @Override @Authenticated public final Session joinSession(final String keyword) { + /* HTTP polling solution (legacy) */ + userService.addCurrentUserToSessionMap(keyword); socketIoServer.reportActiveUserCountForSession(keyword); @@ -144,6 +172,8 @@ public class SessionService implements ISessionService { @Override @Authenticated public final LoggedIn registerAsOnlineUser(final User user, final String sessionkey) { + /* HTTP polling solution (legacy) */ + Session session = this.joinSession(sessionkey); if (session == null) { return null; diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java index 9ce63e7fe3568f80417b3307ec483663fe420afc..d62a882e5d377a20827e6fa63e942c7dff4b3fcb 100644 --- a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java +++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java @@ -103,7 +103,7 @@ public class ARSnovaSocketIOServer { server.addEventListener("setSession", Session.class, new DataListener<Session>() { @Override public void onData(SocketIOClient client, Session session, AckRequest ackSender) { - userService.addUserToSessionBySocketId(client.getSessionId(), session.getKeyword()); + sessionService.joinSession(session.getKeyword(), client.getSessionId()); reportActiveUserCountForSession(session.getKeyword()); reportSessionDataToClient(session.getKeyword(), client); } @@ -225,11 +225,9 @@ public class ARSnovaSocketIOServer { * @param client */ public void reportSessionDataToClient(String sessionKey, SocketIOClient client) { + broadcastInSession(sessionKey, "updateActiveUserCount", sessionService.countActiveUsers(sessionKey)); de.thm.arsnova.entities.Feedback fb = feedbackService.getFeedback(sessionKey); client.sendEvent("updateFeedback", fb.getValues()); - - /* updateActiveUserCount does not need to be send since it is broadcasted - * after the client joined the session */ } public void reportUpdatedFeedbackForSession(String sessionKey) {