Skip to content

Task 1-2: Test Leave Queue Graceful (không có record)

Phase: 1 - Validation Priority: Medium Module: websocket Depends 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: MatchMatchingCmdConsumer inject CreateRoomService (gọi leaveAutoMatchMatching()) và có thể inject BroadcastService để gửi LEAVE_QUEUE_SUCCESS. Trước khi viết catch clause, xác nhận exception type bằng cách xem CreateRoomService.leaveAutoMatchMatching() throw exception gì (tìm trong application-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_POOL trong OpponentPoolCmdHandler nếu cùng vấn đề — xác nhận bằng code review

Verification / Acceptance Criteria

  • [ ] LEAVE_QUEUE_MATCH_MATCHING khi user không trong queue → server log WARN, WebSocket connection không bị close
  • [ ] Client không nhận VALIDATE_GAME error event khi gửi leave mà không có record
  • [ ] LEAVE_QUEUE_MATCH_MATCHING khi user đang trong queue → nhận LEAVE_QUEUE_SUCCESS
  • [ ] LEAVE_OPPONENT_POOL tươ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.java
  • websocket/handler/consumer_handler/OpponentPoolCmdHandler.java (nếu cần)