Skip to content

Commit f3db1e5

Browse files
authored
refactor : api 경로 변경 및 필요없는 코드 정리 (#97)
* refactor : api 경로 변경 코드 정리 * feat : 문제 풀이 성공시 캐릭터 레벨업 이벤트 publisher 추가 * bug : 웹소켓 disconnect 시 채팅 관련 에러 뜨는 문제 해결
1 parent b42839e commit f3db1e5

File tree

26 files changed

+148
-45
lines changed

26 files changed

+148
-45
lines changed

src/main/java/org/ezcode/codetest/application/chatting/service/ChattingUseCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public void removeChatRoom(ChatRoomDeleteRequest request, String email) {
5656

5757
ChatRoom removedRoom = chattingDomainService.getChatRoom(request.roomId());
5858

59-
chattingDomainService.isChatRoomOwner(removedRoom, user.getId());
59+
chattingDomainService.checkChatRoomOwnerOrAdmin(removedRoom, user);
6060

6161
chattingDomainService.removeChatRoom(removedRoom);
6262

src/main/java/org/ezcode/codetest/application/game/management/GameAdminUseCase.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020
import org.ezcode.codetest.domain.game.model.item.Item;
2121
import org.ezcode.codetest.domain.game.model.skill.Skill;
2222
import org.ezcode.codetest.domain.game.service.GameManagementDomainService;
23+
import org.springframework.security.access.prepost.PreAuthorize;
2324
import org.springframework.stereotype.Service;
2425
import org.springframework.transaction.annotation.Transactional;
2526

2627
import lombok.RequiredArgsConstructor;
2728

2829
@Service
2930
@RequiredArgsConstructor
31+
@PreAuthorize("hasRole('ADMIN')")
3032
public class GameAdminUseCase {
3133

3234
private final GameManagementDomainService managementService;

src/main/java/org/ezcode/codetest/domain/chat/repository/ChatRepository.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ public interface ChatRepository {
88

99
Chat save(Chat chat);
1010

11-
List<Chat> findAll();
12-
1311
List<Chat> findChatsFromLastHour(Long roomId);
1412

1513
}

src/main/java/org/ezcode/codetest/domain/chat/service/ChattingDomainService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import org.ezcode.codetest.domain.chat.model.ChatRoom;
99
import org.ezcode.codetest.domain.chat.repository.ChatRepository;
1010
import org.ezcode.codetest.domain.chat.repository.ChatRoomRepository;
11+
import org.ezcode.codetest.domain.user.model.entity.User;
12+
import org.ezcode.codetest.domain.user.model.enums.UserRole;
1113
import org.springframework.stereotype.Component;
1214

1315
import lombok.RequiredArgsConstructor;
@@ -29,9 +31,9 @@ public void removeChatRoom(ChatRoom room) {
2931
chatRoomRepository.delete(room);
3032
}
3133

32-
public void isChatRoomOwner(ChatRoom room, Long userId) {
34+
public void checkChatRoomOwnerOrAdmin(ChatRoom room, User user) {
3335

34-
if(!room.isOwner(userId)) {
36+
if (!room.isOwner(user.getId()) && user.getRole() != UserRole.ADMIN) {
3537
throw new ChattingException(ChattingExceptionCode.CHATROOM_NOT_OWNER);
3638
}
3739
}

src/main/java/org/ezcode/codetest/infrastructure/event/config/CustomHandShakeHandler.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,17 @@ protected Principal determineUser(
2828
String query = uri.getQuery();
2929
String tokenParam = null;
3030

31-
if (query != null && query.startsWith("token=")) {
31+
if (query == null) {
32+
throw new IllegalArgumentException("WebSocket 연결에 필요한 토큰이 없습니다.");
33+
}
34+
35+
if (query.startsWith("token=")) {
3236
tokenParam = query.substring(6);
37+
} else if (query.startsWith("chat-token=")) {
38+
tokenParam = query.substring(11);
39+
attributes.put("isChattingWebsocket", true);
40+
} else {
41+
throw new IllegalArgumentException("허용되지 않은 토큰 파라미터: " + query);
3342
}
3443

3544
Claims claims = jwtUtil.extractClaims(tokenParam);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.ezcode.codetest.infrastructure.event.dto;
2+
3+
public record GameLevelUpEvent(
4+
5+
Long userId,
6+
7+
boolean isProblemSolved,
8+
9+
String problemCategory
10+
11+
) {
12+
}

src/main/java/org/ezcode/codetest/infrastructure/event/listener/ChatEventListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.ezcode.codetest.infrastructure.event.dto.ChatRoomParticipantCountChangeEvent;
66
import org.ezcode.codetest.infrastructure.event.dto.ChatRoomEntryExitMessageEvent;
77
import org.ezcode.codetest.infrastructure.event.dto.ChatRoomHistoryLoadEvent;
8-
import org.ezcode.codetest.infrastructure.event.service.StompMessageService;
8+
import org.ezcode.codetest.infrastructure.event.publisher.StompMessageService;
99
import org.springframework.stereotype.Component;
1010
import org.springframework.transaction.event.TransactionPhase;
1111
import org.springframework.transaction.event.TransactionalEventListener;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.ezcode.codetest.infrastructure.event.listener;
2+
3+
import org.ezcode.codetest.domain.game.exception.GameException;
4+
import org.ezcode.codetest.domain.game.service.CharacterStatusDomainService;
5+
import org.ezcode.codetest.infrastructure.event.dto.GameLevelUpEvent;
6+
import org.springframework.stereotype.Component;
7+
import org.springframework.transaction.annotation.Propagation;
8+
import org.springframework.transaction.annotation.Transactional;
9+
import org.springframework.transaction.event.TransactionPhase;
10+
import org.springframework.transaction.event.TransactionalEventListener;
11+
import org.springframework.transaction.interceptor.TransactionAspectSupport;
12+
13+
import lombok.RequiredArgsConstructor;
14+
import lombok.extern.slf4j.Slf4j;
15+
16+
@Slf4j
17+
@Component
18+
@RequiredArgsConstructor
19+
public class GameLevelUpListener {
20+
21+
private final CharacterStatusDomainService characterDomainService;
22+
23+
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
24+
@Transactional(propagation = Propagation.REQUIRES_NEW)
25+
public void handleGameCharacterLevelUp(GameLevelUpEvent event) {
26+
27+
try {
28+
characterDomainService.gameCharacterLevelUp(event.userId(), event.isProblemSolved(),
29+
event.problemCategory());
30+
} catch (GameException ge) {
31+
log.info("현재 해당 사용자는 게임 캐릭터를 생성한 상태가 아닙니다. {}", ge.getMessage());
32+
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
33+
} catch (Exception e) {
34+
log.warn("문제 풀이로 인한 레벨업 실패 Unknown Error 발생", e);
35+
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
36+
}
37+
}
38+
}

src/main/java/org/ezcode/codetest/infrastructure/event/listener/NotificationEventListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.ezcode.codetest.application.notification.event.NotificationReadEvent;
88
import org.ezcode.codetest.infrastructure.event.dto.NotificationRecord;
99
import org.ezcode.codetest.infrastructure.event.dto.NotificationResponse;
10-
import org.ezcode.codetest.infrastructure.event.service.StompMessageService;
10+
import org.ezcode.codetest.infrastructure.event.publisher.StompMessageService;
1111
import org.ezcode.codetest.infrastructure.persistence.repository.notification.NotificationRepository;
1212
import org.springframework.context.event.EventListener;
1313
import org.springframework.stereotype.Component;

src/main/java/org/ezcode/codetest/infrastructure/event/listener/WebSocketEventListener.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import org.ezcode.codetest.domain.chat.model.ChatRoom;
99
import org.ezcode.codetest.domain.chat.service.ChattingDomainService;
1010
import org.ezcode.codetest.domain.user.service.UserDomainService;
11-
import org.ezcode.codetest.infrastructure.event.service.StompMessageService;
11+
import org.ezcode.codetest.infrastructure.event.publisher.StompMessageService;
1212
import org.ezcode.codetest.infrastructure.session.service.RedisSessionCountService;
1313
import org.springframework.context.ApplicationListener;
1414
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
@@ -31,11 +31,24 @@ public class WebSocketEventListener implements ApplicationListener<SessionDiscon
3131
@Override
3232
public void onApplicationEvent(SessionDisconnectEvent event) {
3333

34+
StompHeaderAccessor header = StompHeaderAccessor.wrap(event.getMessage());
35+
36+
Map<String, Object> attrs = header.getSessionAttributes();
37+
38+
if (attrs == null) {
39+
return;
40+
}
41+
42+
Boolean isChatWs = (Boolean)attrs.get("isChattingWebsocket");
43+
44+
if (!Boolean.TRUE.equals(isChatWs)) {
45+
return;
46+
}
47+
3448
try {
35-
StompHeaderAccessor h = StompHeaderAccessor.wrap(event.getMessage());
36-
String sessionId = h.getSessionId();
49+
String sessionId = header.getSessionId();
3750

38-
String email = h.getUser().getName();
51+
String email = header.getUser().getName();
3952
String nickName = userDomainService.getUser(email).getNickname();
4053

4154
RoomSessionInfo roomData = sessionService.removeSessionCount(sessionId);
@@ -51,7 +64,7 @@ public void onApplicationEvent(SessionDisconnectEvent event) {
5164
messageService.handleChatRoomEntryExitMessage(ChatMessageTemplate.CHAT_ROOM_LEFT.format(nickName),
5265
chatRoom.getId());
5366
} catch (Exception e) {
54-
log.info("SessionDisconnectEvent 처리 중 예외 발생, 채팅 관련 웹소켓 세션이 아닙니다.", e);
67+
log.info("SessionDisconnectEvent 채팅 세션 정리중 예외 발생", e);
5568
}
5669
}
5770
}

0 commit comments

Comments
 (0)