Skip to content

Commit 704626f

Browse files
authored
✨ feat: 플레이어 준비 상태 변경 기능 (#57)
* ✨ feat: 플레이어 준비 상태 변경 기능 추가 * chore: Java 스타일 수정 * ♻️ refactor: 비즈니스 로직 서비스 레이어로 분리 * chore: Java 스타일 수정 --------- Co-authored-by: github-actions <>
1 parent 1bec0d7 commit 704626f

File tree

6 files changed

+45
-0
lines changed

6 files changed

+45
-0
lines changed

backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import static io.f1.backend.global.util.SecurityUtils.getCurrentUserId;
1111
import static io.f1.backend.global.util.SecurityUtils.getCurrentUserNickname;
1212

13+
import io.f1.backend.domain.game.dto.PlayerReadyData;
1314
import io.f1.backend.domain.game.dto.RoomEventType;
1415
import io.f1.backend.domain.game.dto.RoomExitData;
1516
import io.f1.backend.domain.game.dto.RoomInitialData;
@@ -183,6 +184,22 @@ public RoomExitData exitRoom(Long roomId, String sessionId) {
183184
}
184185
}
185186

187+
public PlayerReadyData handlePlayerReady(Long roomId, String sessionId) {
188+
Player player =
189+
roomRepository
190+
.findPlayerInRoomBySessionId(roomId, sessionId)
191+
.orElseThrow(() -> new CustomException(RoomErrorCode.PLAYER_NOT_FOUND));
192+
193+
player.toggleReady();
194+
195+
String destination = getDestination(roomId);
196+
197+
Room room = findRoom(roomId);
198+
PlayerListResponse playerListResponse = toPlayerListResponse(room);
199+
200+
return new PlayerReadyData(destination, playerListResponse);
201+
}
202+
186203
public RoomListResponse getAllRooms() {
187204
List<Room> rooms = roomRepository.findAll();
188205
List<RoomResponse> roomResponses =
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.f1.backend.domain.game.dto;
2+
3+
import io.f1.backend.domain.game.dto.response.PlayerListResponse;
4+
5+
public record PlayerReadyData(String destination, PlayerListResponse response) {}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package io.f1.backend.domain.game.store;
22

3+
import io.f1.backend.domain.game.model.Player;
34
import io.f1.backend.domain.game.model.Room;
45

56
import java.util.List;
67
import java.util.Optional;
78

89
public interface RoomRepository {
10+
911
void saveRoom(Room room);
1012

1113
Optional<Room> findRoom(Long roomId);
1214

1315
List<Room> findAll();
1416

1517
void removeRoom(Long roomId);
18+
19+
Optional<Player> findPlayerInRoomBySessionId(Long roomId, String sessionId);
1620
}

backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.f1.backend.domain.game.store;
22

3+
import io.f1.backend.domain.game.model.Player;
34
import io.f1.backend.domain.game.model.Room;
45

56
import org.springframework.stereotype.Repository;
@@ -35,6 +36,11 @@ public void removeRoom(Long roomId) {
3536
roomMap.remove(roomId);
3637
}
3738

39+
@Override
40+
public Optional<Player> findPlayerInRoomBySessionId(Long roomId, String sessionId) {
41+
return findRoom(roomId).map(room -> room.getPlayerSessionMap().get(sessionId));
42+
}
43+
3844
// 테스트 전용 메소드
3945
public Room getRoomForTest(Long roomId) {
4046
return roomMap.get(roomId);

backend/src/main/java/io/f1/backend/domain/game/websocket/GameSocketController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.f1.backend.domain.game.app.RoomService;
55
import io.f1.backend.domain.game.dto.GameStartData;
66
import io.f1.backend.domain.game.dto.MessageType;
7+
import io.f1.backend.domain.game.dto.PlayerReadyData;
78
import io.f1.backend.domain.game.dto.RoomExitData;
89
import io.f1.backend.domain.game.dto.RoomInitialData;
910
import io.f1.backend.domain.game.dto.request.GameStartRequest;
@@ -31,6 +32,7 @@ public void initializeRoomSocket(@DestinationVariable Long roomId, Message<?> me
3132

3233
RoomInitialData roomInitialData =
3334
roomService.initializeRoomSocket(roomId, websocketSessionId);
35+
3436
String destination = roomInitialData.destination();
3537

3638
messageSender.send(
@@ -72,6 +74,16 @@ public void gameStart(@DestinationVariable Long roomId, Message<GameStartRequest
7274
messageSender.send(destination, MessageType.GAME_START, gameStartData.gameStartResponse());
7375
}
7476

77+
@MessageMapping("/room/ready/{roomId}")
78+
public void playerReady(@DestinationVariable Long roomId, Message<?> message) {
79+
80+
PlayerReadyData playerReadyData =
81+
roomService.handlePlayerReady(roomId, getSessionId(message));
82+
83+
messageSender.send(
84+
playerReadyData.destination(), MessageType.PLAYER_LIST, playerReadyData.response());
85+
}
86+
7587
private static String getSessionId(Message<?> message) {
7688
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
7789
return accessor.getSessionId();

backend/src/main/java/io/f1/backend/global/exception/errorcode/RoomErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public enum RoomErrorCode implements ErrorCode {
1313
PLAYER_NOT_READY("E403004", HttpStatus.FORBIDDEN, "게임 시작을 위한 준비 상태가 아닙니다."),
1414
ROOM_NOT_FOUND("E404005", HttpStatus.NOT_FOUND, "존재하지 않는 방입니다."),
1515
WRONG_PASSWORD("E401006", HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지않습니다."),
16+
PLAYER_NOT_FOUND("E404007", HttpStatus.NOT_FOUND, "존재하지 않는 플레이어입니다."),
1617
SOCKET_SESSION_NOT_FOUND("E404006", HttpStatus.NOT_FOUND, "존재하지 않는 소켓 세션입니다.");
1718

1819
private final String code;

0 commit comments

Comments
 (0)