Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Main: 소켓 연결 시 기존 세션 종료 기능 구현 #54

Merged
merged 1 commit into from
Jul 6, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading