22
33import static io .f1 .backend .domain .quiz .mapper .QuizMapper .toGameStartResponse ;
44
5- import io .f1 .backend .domain .game .dto .request .GameStartRequest ;
65import io .f1 .backend .domain .game .dto .response .GameStartResponse ;
76import io .f1 .backend .domain .game .event .RoomUpdatedEvent ;
8- import io .f1 .backend .domain .game .model .GameSetting ;
97import io .f1 .backend .domain .game .model .Player ;
108import io .f1 .backend .domain .game .model .Room ;
119import io .f1 .backend .domain .game .model .RoomState ;
1210import io .f1 .backend .domain .game .store .RoomRepository ;
1311import io .f1 .backend .domain .question .entity .Question ;
1412import io .f1 .backend .domain .quiz .app .QuizService ;
1513import io .f1 .backend .domain .quiz .entity .Quiz ;
14+ import io .f1 .backend .domain .user .dto .UserPrincipal ;
1615import io .f1 .backend .global .exception .CustomException ;
1716import io .f1 .backend .global .exception .errorcode .GameErrorCode ;
1817import io .f1 .backend .global .exception .errorcode .RoomErrorCode ;
2423
2524import java .util .List ;
2625import java .util .Map ;
26+ import java .util .Objects ;
2727
2828@ Service
2929@ RequiredArgsConstructor
@@ -33,53 +33,54 @@ public class GameService {
3333 private final RoomRepository roomRepository ;
3434 private final ApplicationEventPublisher eventPublisher ;
3535
36- public GameStartResponse gameStart (Long roomId , GameStartRequest gameStartRequest ) {
37-
38- Long quizId = gameStartRequest .quizId ();
36+ public GameStartResponse gameStart (Long roomId , UserPrincipal principal ) {
3937
4038 Room room =
4139 roomRepository
4240 .findRoom (roomId )
4341 .orElseThrow (() -> new CustomException (RoomErrorCode .ROOM_NOT_FOUND ));
4442
45- if (!validateReadyStatus (room )) {
46- throw new CustomException (RoomErrorCode .PLAYER_NOT_READY );
47- }
48-
49- // 방의 gameSetting에 설정된 퀴즈랑 요청 퀴즈랑 같은지 체크 후 GameSetting에서 라운드 가져오기
50- Integer round = checkGameSetting (room , quizId );
43+ validateRoomStart (room , principal );
5144
45+ Long quizId = room .getGameSetting ().getQuizId ();
5246 Quiz quiz = quizService .getQuizWithQuestionsById (quizId );
47+ List <Question > questions = prepareQuestions (room , quiz );
5348
54- // 라운드 수만큼 랜덤 Question 추출
55- List <Question > questions = quizService .getRandomQuestionsWithoutAnswer (quizId , round );
5649 room .updateQuestions (questions );
5750
58- GameStartResponse gameStartResponse = toGameStartResponse (questions );
59-
6051 // 방 정보 게임 중으로 변경
6152 room .updateRoomState (RoomState .PLAYING );
6253
6354 eventPublisher .publishEvent (new RoomUpdatedEvent (room , quiz ));
6455
65- return gameStartResponse ;
56+ return toGameStartResponse ( questions ) ;
6657 }
6758
68- private Integer checkGameSetting (Room room , Long quizId ) {
69-
70- GameSetting gameSetting = room .getGameSetting ();
59+ private boolean validateReadyStatus (Room room ) {
7160
72- if (!gameSetting .validateQuizId (quizId )) {
73- throw new CustomException (GameErrorCode .GAME_SETTING_CONFLICT );
74- }
61+ Map <String , Player > playerSessionMap = room .getPlayerSessionMap ();
7562
76- return gameSetting . getRound ( );
63+ return playerSessionMap . values (). stream (). allMatch ( Player :: isReady );
7764 }
7865
79- private boolean validateReadyStatus (Room room ) {
66+ private void validateRoomStart (Room room , UserPrincipal principal ) {
67+ if (!Objects .equals (principal .getUserId (), room .getHost ().getId ())) {
68+ throw new CustomException (RoomErrorCode .NOT_ROOM_OWNER );
69+ }
8070
81- Map <String , Player > playerSessionMap = room .getPlayerSessionMap ();
71+ if (!validateReadyStatus (room )) {
72+ throw new CustomException (GameErrorCode .PLAYER_NOT_READY );
73+ }
8274
83- return playerSessionMap .values ().stream ().allMatch (Player ::isReady );
75+ if (room .getState () == RoomState .PLAYING ) {
76+ throw new CustomException (RoomErrorCode .GAME_ALREADY_PLAYING );
77+ }
78+ }
79+
80+ // 라운드 수만큼 랜덤 Question 추출
81+ private List <Question > prepareQuestions (Room room , Quiz quiz ) {
82+ Long quizId = quiz .getId ();
83+ Integer round = room .getGameSetting ().getRound ();
84+ return quizService .getRandomQuestionsWithoutAnswer (quizId , round );
8485 }
8586}
0 commit comments