diff --git a/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java b/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java index d4544e9f..4bea4742 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java +++ b/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java @@ -10,6 +10,7 @@ import static io.f1.backend.global.util.SecurityUtils.getCurrentUserId; import static io.f1.backend.global.util.SecurityUtils.getCurrentUserNickname; +import io.f1.backend.domain.game.dto.PlayerReadyData; import io.f1.backend.domain.game.dto.RoomEventType; import io.f1.backend.domain.game.dto.RoomExitData; import io.f1.backend.domain.game.dto.RoomInitialData; @@ -183,6 +184,22 @@ public RoomExitData exitRoom(Long roomId, String sessionId) { } } + public PlayerReadyData handlePlayerReady(Long roomId, String sessionId) { + Player player = + roomRepository + .findPlayerInRoomBySessionId(roomId, sessionId) + .orElseThrow(() -> new CustomException(RoomErrorCode.PLAYER_NOT_FOUND)); + + player.toggleReady(); + + String destination = getDestination(roomId); + + Room room = findRoom(roomId); + PlayerListResponse playerListResponse = toPlayerListResponse(room); + + return new PlayerReadyData(destination, playerListResponse); + } + public RoomListResponse getAllRooms() { List rooms = roomRepository.findAll(); List roomResponses = diff --git a/backend/src/main/java/io/f1/backend/domain/game/dto/PlayerReadyData.java b/backend/src/main/java/io/f1/backend/domain/game/dto/PlayerReadyData.java new file mode 100644 index 00000000..4676b3e1 --- /dev/null +++ b/backend/src/main/java/io/f1/backend/domain/game/dto/PlayerReadyData.java @@ -0,0 +1,5 @@ +package io.f1.backend.domain.game.dto; + +import io.f1.backend.domain.game.dto.response.PlayerListResponse; + +public record PlayerReadyData(String destination, PlayerListResponse response) {} diff --git a/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepository.java b/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepository.java index 6e87760d..f2852c5d 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepository.java +++ b/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepository.java @@ -1,11 +1,13 @@ package io.f1.backend.domain.game.store; +import io.f1.backend.domain.game.model.Player; import io.f1.backend.domain.game.model.Room; import java.util.List; import java.util.Optional; public interface RoomRepository { + void saveRoom(Room room); Optional findRoom(Long roomId); @@ -13,4 +15,6 @@ public interface RoomRepository { List findAll(); void removeRoom(Long roomId); + + Optional findPlayerInRoomBySessionId(Long roomId, String sessionId); } diff --git a/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java b/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java index cffbba47..7efd4d9e 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java +++ b/backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java @@ -1,5 +1,6 @@ package io.f1.backend.domain.game.store; +import io.f1.backend.domain.game.model.Player; import io.f1.backend.domain.game.model.Room; import org.springframework.stereotype.Repository; @@ -35,6 +36,11 @@ public void removeRoom(Long roomId) { roomMap.remove(roomId); } + @Override + public Optional findPlayerInRoomBySessionId(Long roomId, String sessionId) { + return findRoom(roomId).map(room -> room.getPlayerSessionMap().get(sessionId)); + } + // 테스트 전용 메소드 public Room getRoomForTest(Long roomId) { return roomMap.get(roomId); diff --git a/backend/src/main/java/io/f1/backend/domain/game/websocket/GameSocketController.java b/backend/src/main/java/io/f1/backend/domain/game/websocket/GameSocketController.java index e84e9c36..25be3753 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/websocket/GameSocketController.java +++ b/backend/src/main/java/io/f1/backend/domain/game/websocket/GameSocketController.java @@ -4,6 +4,7 @@ import io.f1.backend.domain.game.app.RoomService; import io.f1.backend.domain.game.dto.GameStartData; import io.f1.backend.domain.game.dto.MessageType; +import io.f1.backend.domain.game.dto.PlayerReadyData; import io.f1.backend.domain.game.dto.RoomExitData; import io.f1.backend.domain.game.dto.RoomInitialData; import io.f1.backend.domain.game.dto.request.GameStartRequest; @@ -31,6 +32,7 @@ public void initializeRoomSocket(@DestinationVariable Long roomId, Message me RoomInitialData roomInitialData = roomService.initializeRoomSocket(roomId, websocketSessionId); + String destination = roomInitialData.destination(); messageSender.send( @@ -72,6 +74,16 @@ public void gameStart(@DestinationVariable Long roomId, Message message) { + + PlayerReadyData playerReadyData = + roomService.handlePlayerReady(roomId, getSessionId(message)); + + messageSender.send( + playerReadyData.destination(), MessageType.PLAYER_LIST, playerReadyData.response()); + } + private static String getSessionId(Message message) { StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message); return accessor.getSessionId(); diff --git a/backend/src/main/java/io/f1/backend/global/exception/errorcode/RoomErrorCode.java b/backend/src/main/java/io/f1/backend/global/exception/errorcode/RoomErrorCode.java index 0626fab0..073ac645 100644 --- a/backend/src/main/java/io/f1/backend/global/exception/errorcode/RoomErrorCode.java +++ b/backend/src/main/java/io/f1/backend/global/exception/errorcode/RoomErrorCode.java @@ -12,6 +12,7 @@ public enum RoomErrorCode implements ErrorCode { ROOM_GAME_IN_PROGRESS("E403003", HttpStatus.FORBIDDEN, "게임이 진행 중 입니다."), ROOM_NOT_FOUND("E404005", HttpStatus.NOT_FOUND, "존재하지 않는 방입니다."), WRONG_PASSWORD("E401006", HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지않습니다."), + PLAYER_NOT_FOUND("E404007", HttpStatus.NOT_FOUND, "존재하지 않는 플레이어입니다."), SOCKET_SESSION_NOT_FOUND("E404006", HttpStatus.NOT_FOUND, "존재하지 않는 소켓 세션입니다."); private final String code;