Skip to content

Commit b84628e

Browse files
committed
♻️ refactor : GameService 분리
1 parent e625940 commit b84628e

File tree

3 files changed

+77
-49
lines changed

3 files changed

+77
-49
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package io.f1.backend.domain.game.app;
2+
3+
import io.f1.backend.domain.game.dto.GameStartData;
4+
import io.f1.backend.domain.game.dto.response.GameStartResponse;
5+
import io.f1.backend.domain.game.model.GameSetting;
6+
import io.f1.backend.domain.game.model.Player;
7+
import io.f1.backend.domain.game.model.Room;
8+
import io.f1.backend.domain.game.model.RoomState;
9+
import io.f1.backend.domain.game.store.RoomRepository;
10+
import io.f1.backend.domain.quiz.app.QuizService;
11+
import java.util.Map;
12+
import lombok.RequiredArgsConstructor;
13+
import org.springframework.stereotype.Service;
14+
15+
@Service
16+
@RequiredArgsConstructor
17+
public class GameService {
18+
19+
private final QuizService quizService;
20+
private final RoomRepository roomRepository;
21+
22+
private Integer checkGameSetting(Room room, Long quizId) {
23+
24+
GameSetting gameSetting = room.getGameSetting();
25+
26+
Long roomQuizId = gameSetting.getQuizId();
27+
28+
if (!roomQuizId.equals(quizId)) {
29+
throw new IllegalArgumentException("E409002 : 게임 설정이 다릅니다. (게임을 시작할 수 없습니다.)");
30+
}
31+
32+
return gameSetting.getRound();
33+
}
34+
35+
public GameStartData gameStart(Long roomId, Long quizId) {
36+
37+
Room room =
38+
roomRepository
39+
.findRoom(roomId)
40+
.orElseThrow(() -> new IllegalArgumentException("404 존재하지 않는 방입니다."));
41+
42+
if (!validateReadyStatus(room)) {
43+
throw new IllegalArgumentException("E403004 : 레디 상태가 아닙니다.");
44+
}
45+
46+
// 방의 gameSetting에 설정된 퀴즈랑 요청 퀴즈랑 같은지 체크 후 GameSetting에서 라운드 가져오기
47+
Integer round = checkGameSetting(room, quizId);
48+
49+
// 라운드 수만큼 랜덤 Question 추출
50+
GameStartResponse questions = quizService.getRandomQuestionsWithoutAnswer(quizId, round);
51+
52+
// 방 정보 게임 중으로 변경
53+
room.updateRoomState(RoomState.PLAYING);
54+
55+
return new GameStartData(getDestination(roomId), questions);
56+
}
57+
58+
private boolean validateReadyStatus(Room room) {
59+
60+
Map<String, Player> playerSessionMap = room.getPlayerSessionMap();
61+
62+
for (Player player : playerSessionMap.values()) {
63+
if (!player.isReady()) {
64+
return false;
65+
}
66+
}
67+
return true;
68+
}
69+
70+
private static String getDestination(Long roomId) {
71+
return "/sub/room/" + roomId;
72+
}
73+
74+
}

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

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -193,51 +193,4 @@ private static Player createPlayer() {
193193
return new Player(getCurrentUserId(), getCurrentUserNickname());
194194
}
195195

196-
private Integer checkGameSetting(Room room, Long quizId) {
197-
198-
GameSetting gameSetting = room.getGameSetting();
199-
200-
Long roomQuizId = gameSetting.getQuizId();
201-
202-
if (!roomQuizId.equals(quizId)) {
203-
throw new IllegalArgumentException("E409002 : 게임 설정이 다릅니다. (게임을 시작할 수 없습니다.)");
204-
}
205-
206-
return gameSetting.getRound();
207-
}
208-
209-
public GameStartData gameStart(Long roomId, Long quizId) {
210-
211-
Room room =
212-
roomRepository
213-
.findRoom(roomId)
214-
.orElseThrow(() -> new IllegalArgumentException("404 존재하지 않는 방입니다."));
215-
216-
if (!validateReadyStatus(room)) {
217-
throw new IllegalArgumentException("E403004 : 레디 상태가 아닙니다.");
218-
}
219-
220-
// 방의 gameSetting에 설정된 퀴즈랑 요청 퀴즈랑 같은지 체크 후 GameSetting에서 라운드 가져오기
221-
Integer round = checkGameSetting(room, quizId);
222-
223-
// 라운드 수만큼 랜덤 Question 추출
224-
GameStartResponse questions = quizService.getRandomQuestionsWithoutAnswer(quizId, round);
225-
226-
// 방 정보 게임 중으로 변경
227-
room.updateRoomState(RoomState.PLAYING);
228-
229-
return new GameStartData(getDestination(roomId), questions);
230-
}
231-
232-
private boolean validateReadyStatus(Room room) {
233-
234-
Map<String, Player> playerSessionMap = room.getPlayerSessionMap();
235-
236-
for (Player player : playerSessionMap.values()) {
237-
if (!player.isReady()) {
238-
return false;
239-
}
240-
}
241-
return true;
242-
}
243196
}

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

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

3+
import io.f1.backend.domain.game.app.GameService;
34
import io.f1.backend.domain.game.app.RoomService;
45
import io.f1.backend.domain.game.dto.GameStartData;
56
import io.f1.backend.domain.game.dto.MessageType;
@@ -22,7 +23,7 @@ public class GameSocketController {
2223

2324
private final MessageSender messageSender;
2425
private final RoomService roomService;
25-
private final QuizService quizService;
26+
private final GameService gameService;
2627

2728
@MessageMapping("/room/enter/{roomId}")
2829
public void roomEnter(@DestinationVariable Long roomId, Message<?> message) {
@@ -64,7 +65,7 @@ public void gameStart(@DestinationVariable Long roomId, Message<GameStartRequest
6465

6566
Long quizId = message.getPayload().quizId();
6667

67-
GameStartData gameStartData = roomService.gameStart(roomId, quizId);
68+
GameStartData gameStartData = gameService.gameStart(roomId, quizId);
6869

6970
String destination = gameStartData.destination();
7071

0 commit comments

Comments
 (0)