Task 1-2: Test Leave Queue Graceful (không có record)
Phase: 1 - Validation Priority: Medium Module:
websocketDepends on: task-1-1 Reference: docs/BountyHunter-Backend/details/feature-matching-matchmaking/SPEC.md
Background
LEAVE_QUEUE_MATCH_MATCHING khi user không có matching record (ví dụ: đã match rồi nhưng client gửi leave lại) hiện tại có thể throw exception không xử lý, gây lỗi WebSocket.
Tasks
DI Note:
MatchMatchingCmdConsumerinjectCreateRoomService(gọileaveAutoMatchMatching()) và có thể injectBroadcastServiceđể gửiLEAVE_QUEUE_SUCCESS. Trước khi viết catch clause, xác nhận exception type bằng cách xemCreateRoomService.leaveAutoMatchMatching()throw exception gì (tìm trongapplication-core/service/).
File: websocket/handler/consumer_handler/MatchMatchingCmdConsumer.java
- [ ] Xác nhận exception type khi không có matching record — grep:
grep -n "leaveAutoMatchMatching\|NotFoundException\|RecordNotFoundException" application-core/service/ -
[ ] Wrap leave action với try-catch:
@OnCmd("LEAVE_QUEUE_MATCH_MATCHING") public void onLeaveAutoMatching(JSONObject objectMessage, String userId) { try { String settingId = objectMessage.getString("playable_game_booth_setting_id"); String prizeId = objectMessage.optString("prize_id", null); createRoomService.leaveAutoMatchMatching(userId, settingId, prizeId); // broadcastService inject riêng: private final BroadcastService broadcastService; broadcastService.sendToUser(userId, "LEAVE_QUEUE_SUCCESS", null); } catch (NotFoundException | RecordNotFoundException e) { // Graceful: user không ở trong queue, bỏ qua — không gửi error event LOGGER.warn("[MATCHING] Leave ignored - no matching record for userId={}", userId); } } -
[ ] Tương tự cho
LEAVE_OPPONENT_POOLtrongOpponentPoolCmdHandlernếu cùng vấn đề — xác nhận bằng code review
Verification / Acceptance Criteria
- [ ]
LEAVE_QUEUE_MATCH_MATCHINGkhi user không trong queue → server log WARN, WebSocket connection không bị close - [ ] Client không nhận
VALIDATE_GAMEerror event khi gửi leave mà không có record - [ ]
LEAVE_QUEUE_MATCH_MATCHINGkhi user đang trong queue → nhậnLEAVE_QUEUE_SUCCESS - [ ]
LEAVE_OPPONENT_POOLtương tự: graceful khi không có record (nếu áp dụng) - [ ] Exception type được xác nhận đúng — không catch quá rộng (ví dụ: không dùng
catch (Exception e))
Files to Modify
websocket/handler/consumer_handler/MatchMatchingCmdConsumer.javawebsocket/handler/consumer_handler/OpponentPoolCmdHandler.java(nếu cần)