Skip to content

Commit

Permalink
Feature: 소켓 연결 시 기존 세션 종료 기능 구현 (#52)
Browse files Browse the repository at this point in the history
  • Loading branch information
Youthhing authored Jul 6, 2024
1 parent 79043f4 commit 8b6a2d7
Showing 1 changed file with 17 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,24 @@ public class WebSocketHandler extends TextWebSocketHandler {
private static final String MEMBER_ID_KEY = "memberId";
private static final String EDUCATION_ID_KEY = "educationId";
private static final String ROLE_KEY = "role";
private static final CloseStatus ATTEMPT_NEW_CONNECTION = new CloseStatus(4001, "new connection request");
private final ObjectMapper objectMapper = new ObjectMapper();
private final QuizRepository quizRepository;

@Override
public void afterConnectionEstablished(WebSocketSession session) {
public void afterConnectionEstablished(WebSocketSession session) throws IOException {
String memberId = findAttributeByToken(session, MEMBER_ID_KEY);
Long educationId = Long.parseLong(findAttributeByToken(session, EDUCATION_ID_KEY));
String role = findAttributeByToken(session, ROLE_KEY);
MemberRole memberRole = MemberRole.fromKey(role);

addMemberToSession(memberId, session);
if (MemberRoleGroup.hasRole(MemberRoleGroup.CLIENTS, memberRole)) {
handleSessionReplacement(memberId, CLIENTS);
CLIENTS.put(memberId, session);
} else {
handleSessionReplacement(memberId, MANAGERS);
MANAGERS.put(memberId, session);
}

if (MemberRoleGroup.hasRole(MemberRoleGroup.CLIENTS, memberRole)) {
sendCurrentOpenQuiz(educationId, session);
Expand All @@ -57,6 +64,14 @@ public void afterConnectionEstablished(WebSocketSession session) {
log.info("[세션 연결] {}, 연결된 세션: {}", memberId, session.getId());
}

private void handleSessionReplacement(String memberId, ConcurrentHashMap<String, WebSocketSession> managers)
throws IOException {
if (managers.containsKey(memberId)) {
managers.get(memberId).close(ATTEMPT_NEW_CONNECTION);
managers.remove(memberId);
}
}

private void sendCurrentOpenQuiz(Long educationId, WebSocketSession session) {
Optional<Quiz> maybeQuiz = quizRepository.findByStatusAndEducationId(QuizStatus.QUIZ_ON,
educationId);
Expand Down Expand Up @@ -147,19 +162,6 @@ public void stopAllQuiz(Long educationId) {
}
}

private void addMemberToSession(String memberId, WebSocketSession session) {
String roleAttribute = findAttributeByToken(session, ROLE_KEY);
MemberRole role = MemberRole.fromKey(roleAttribute);

if (MemberRoleGroup.hasRole(MemberRoleGroup.CLIENTS, role)) {
CLIENTS.put(memberId, session);
log.info("[부원 연결] : {} , 세션 ID : {}" , memberId, session.getId());
} else {
MANAGERS.put(memberId, session);
log.info("[관리자 연결] : {} , 세션 ID : {}" , memberId, session.getId());
}
}

private String findAttributeByToken(WebSocketSession session, String key) {
return session.getAttributes().get(key).toString();
}
Expand Down

0 comments on commit 8b6a2d7

Please sign in to comment.