Skip to content

Commit a1d6dc6

Browse files
committed
✨ feat : 정답없이 문제 조회
1 parent 0ba0181 commit a1d6dc6

File tree

8 files changed

+95
-0
lines changed

8 files changed

+95
-0
lines changed

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.Map;
4242
import java.util.Optional;
4343
import java.util.concurrent.atomic.AtomicLong;
44+
import org.springframework.transaction.annotation.Transactional;
4445

4546
@Service
4647
@RequiredArgsConstructor
@@ -190,4 +191,33 @@ private static String getDestination(Long roomId) {
190191
private static Player createPlayer() {
191192
return new Player(getCurrentUserId(), getCurrentUserNickname());
192193
}
194+
195+
@Transactional(readOnly = true)
196+
public Integer checkGameSetting(Long roomId, Long quizId) {
197+
Room room =
198+
roomRepository
199+
.findRoom(roomId)
200+
.orElseThrow(() -> new IllegalArgumentException("404 존재하지 않는 방입니다."));
201+
202+
GameSetting gameSetting = room.getGameSetting();
203+
204+
Long roomQuizId = gameSetting.getQuizId();
205+
206+
// TODO : 에러 코드 추가하기
207+
if(!roomQuizId.equals(quizId)) {
208+
throw new IllegalArgumentException("게임 설정이 다릅니다. (게임을 시작할 수 없습니다.)");
209+
}
210+
211+
return gameSetting.getRound();
212+
}
213+
214+
@Transactional
215+
public void gameStart(Long roomId) {
216+
Room room =
217+
roomRepository
218+
.findRoom(roomId)
219+
.orElseThrow(() -> new IllegalArgumentException("404 존재하지 않는 방입니다."));
220+
221+
room.gameStart();
222+
}
193223
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package io.f1.backend.domain.game.dto.request;
2+
3+
public record GameStartRequest(Long quizId) { }
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package io.f1.backend.domain.game.dto.response;
2+
3+
import io.f1.backend.domain.quiz.dto.GameQuestionResponse;
4+
import java.util.List;
5+
6+
public record GameStartResponse(List<GameQuestionResponse> questions) { }

backend/src/main/java/io/f1/backend/domain/game/model/Room.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,8 @@ public Room(Long id, RoomSetting roomSetting, GameSetting gameSetting, Player ho
3939
public void updateHost(Player nextHost) {
4040
this.host = nextHost;
4141
}
42+
43+
public void gameStart() {
44+
this.state = RoomState.PLAYING;
45+
}
4246
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import io.f1.backend.domain.game.dto.RoomExitData;
66
import io.f1.backend.domain.game.dto.RoomInitialData;
77

8+
import io.f1.backend.domain.game.dto.request.GameStartRequest;
9+
import io.f1.backend.domain.game.dto.response.GameStartResponse;
10+
import io.f1.backend.domain.quiz.app.QuizService;
811
import lombok.RequiredArgsConstructor;
912

1013
import org.springframework.messaging.Message;
@@ -19,6 +22,7 @@ public class GameSocketController {
1922

2023
private final MessageSender messageSender;
2124
private final RoomService roomService;
25+
private final QuizService quizService;
2226

2327
@MessageMapping("/room/enter/{roomId}")
2428
public void roomEnter(@DestinationVariable Long roomId, Message<?> message) {
@@ -55,6 +59,20 @@ public void exitRoom(@DestinationVariable Long roomId, Message<?> message) {
5559
}
5660
}
5761

62+
@MessageMapping("/room/start/{roomId}")
63+
public void gameStart(@DestinationVariable Long roomId, Message<GameStartRequest> message) {
64+
65+
Long quizId = message.getPayload().quizId();
66+
67+
Integer round = roomService.checkGameSetting(roomId, quizId);
68+
69+
// TODO : 라운드 수만큼 랜덤하게 문제 주기..!
70+
GameStartResponse questions = quizService.getQuestionsWithoutAnswer(quizId, round);
71+
72+
roomService.gameStart(roomId);
73+
74+
}
75+
5876
private static String getSessionId(Message<?> message) {
5977
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
6078
return accessor.getSessionId();

backend/src/main/java/io/f1/backend/domain/quiz/app/QuizService.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
import static java.nio.file.Files.deleteIfExists;
66

7+
import io.f1.backend.domain.game.dto.response.GameStartResponse;
78
import io.f1.backend.domain.question.app.QuestionService;
89
import io.f1.backend.domain.question.dto.QuestionRequest;
910
import io.f1.backend.domain.quiz.dao.QuizRepository;
11+
import io.f1.backend.domain.quiz.dto.GameQuestionResponse;
1012
import io.f1.backend.domain.quiz.dto.QuizCreateRequest;
1113
import io.f1.backend.domain.quiz.dto.QuizCreateResponse;
1214
import io.f1.backend.domain.quiz.dto.QuizListPageResponse;
@@ -205,6 +207,7 @@ public Long getQuizMinId() {
205207
return quizRepository.getQuizMinId();
206208
}
207209

210+
@Transactional(readOnly = true)
208211
public QuizQuestionListResponse getQuizWithQuestions(Long quizId) {
209212
Quiz quiz =
210213
quizRepository
@@ -213,4 +216,17 @@ public QuizQuestionListResponse getQuizWithQuestions(Long quizId) {
213216

214217
return quizToQuizQuestionListResponse(quiz);
215218
}
219+
220+
@Transactional(readOnly = true)
221+
public GameStartResponse getQuestionsWithoutAnswer(Long quizId, Integer round) {
222+
Quiz quiz =
223+
quizRepository
224+
.findById(quizId)
225+
.orElseThrow(() -> new NoSuchElementException("존재하지 않는 퀴즈입니다."));
226+
227+
228+
229+
return toGameStartResponse(quiz);
230+
}
231+
216232
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package io.f1.backend.domain.quiz.dto;
2+
3+
public record GameQuestionResponse(Long id, String question) { }

backend/src/main/java/io/f1/backend/domain/quiz/mapper/QuizMapper.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package io.f1.backend.domain.quiz.mapper;
22

3+
import io.f1.backend.domain.game.dto.response.GameStartResponse;
34
import io.f1.backend.domain.question.dto.QuestionResponse;
45
import io.f1.backend.domain.question.entity.Question;
6+
import io.f1.backend.domain.quiz.dto.GameQuestionResponse;
57
import io.f1.backend.domain.quiz.dto.QuizCreateRequest;
68
import io.f1.backend.domain.quiz.dto.QuizCreateResponse;
79
import io.f1.backend.domain.quiz.dto.QuizListPageResponse;
@@ -83,4 +85,17 @@ public static QuizQuestionListResponse quizToQuizQuestionListResponse(Quiz quiz)
8385
quiz.getQuestions().size(),
8486
questionsToQuestionResponses(quiz.getQuestions()));
8587
}
88+
89+
public static List<GameQuestionResponse> toGameQuestionResponseList(List<Question> questions) {
90+
return questions.stream()
91+
.map(QuizMapper::toGameQuestionResponse).toList();
92+
}
93+
94+
public static GameQuestionResponse toGameQuestionResponse(Question question) {
95+
return new GameQuestionResponse(question.getId(), question.getTextQuestion().getContent());
96+
}
97+
98+
public static GameStartResponse toGameStartResponse(Quiz quiz) {
99+
return new GameStartResponse(toGameQuestionResponseList(quiz.getQuestions()));
100+
}
86101
}

0 commit comments

Comments
 (0)