Skip to content

Commit 9d34bfb

Browse files
authored
๐Ÿ”– release: v0.0.13
2 parents 8facafa + 15bb20c commit 9d34bfb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1125
-630
lines changed

โ€Ž.github/workflows/test.ymlโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ jobs:
1111
PROJECT_DIR: backend
1212
KAKAO_CLIENT: ${{ secrets.KAKAO_CLIENT }}
1313
KAKAO_SECRET: ${{ secrets.KAKAO_SECRET }}
14+
REDIS_HOST: ${{ secrets.REDIS_HOST }}
15+
REDIS_PORT: ${{ secrets.REDIS_PORT }}
1416
steps:
1517
- uses: actions/checkout@v4
1618

โ€Žbackend/build.gradleโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ dependencies {
2929
implementation 'org.springframework.boot:spring-boot-starter-web'
3030
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
3131
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
32+
implementation 'org.redisson:redisson-spring-boot-starter:3.50.0'
3233
implementation 'org.springframework.boot:spring-boot-starter-websocket'
3334
implementation 'org.springframework.boot:spring-boot-starter-security'
3435
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

โ€Žbackend/src/main/java/io/f1/backend/domain/admin/app/AdminDetailService.javaโ€Ž

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx
2727
() ->
2828
new UsernameNotFoundException(
2929
AdminErrorCode.ADMIN_NOT_FOUND.getMessage()));
30-
// ํ”„๋ก ํŠธ์—”๋“œ๋กœ ๋‚ด๋ ค๊ฐ€์ง€ ์•Š๋Š” ์˜ˆ์™ธ
3130
return new AdminPrincipal(admin);
3231
}
3332
}

โ€Žbackend/src/main/java/io/f1/backend/domain/admin/app/handler/AdminLoginFailureHandler.javaโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void onAuthenticationFailure(
2828
HttpServletResponse response,
2929
AuthenticationException exception)
3030
throws IOException {
31-
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401
31+
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
3232
response.setContentType("application/json;charset=UTF-8");
3333

3434
AdminLoginFailResponse errorResponse =

โ€Žbackend/src/main/java/io/f1/backend/domain/admin/app/handler/AdminLoginSuccessHandler.javaโ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.f1.backend.domain.admin.app.handler;
22

33
import static io.f1.backend.domain.user.constants.SessionKeys.ADMIN;
4-
import static io.f1.backend.global.util.SecurityUtils.getCurrentAdminPrincipal;
4+
import static io.f1.backend.global.security.util.SecurityUtils.getCurrentAdminPrincipal;
55

66
import io.f1.backend.domain.admin.dao.AdminRepository;
77
import io.f1.backend.domain.admin.dto.AdminPrincipal;
@@ -44,6 +44,6 @@ public void onAuthenticationSuccess(
4444
adminRepository.save(admin);
4545
httpSession.setAttribute(ADMIN, principal.getAuthenticationAdmin());
4646

47-
response.setStatus(HttpServletResponse.SC_OK); // 200
47+
response.setStatus(HttpServletResponse.SC_OK);
4848
}
4949
}

โ€Žbackend/src/main/java/io/f1/backend/domain/auth/api/AuthController.javaโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.f1.backend.domain.auth.api;
22

3-
import static io.f1.backend.global.util.SecurityUtils.getAuthentication;
3+
import static io.f1.backend.global.security.util.SecurityUtils.getAuthentication;
44

55
import io.f1.backend.domain.admin.dto.AdminPrincipal;
66
import io.f1.backend.domain.auth.dto.CurrentUserAndAdminResponse;

โ€Žbackend/src/main/java/io/f1/backend/domain/game/app/ChatService.javaโ€Ž

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.f1.backend.domain.game.model.Room;
99
import io.f1.backend.domain.game.websocket.MessageSender;
1010
import io.f1.backend.domain.question.entity.Question;
11+
import io.f1.backend.domain.user.dto.UserPrincipal;
1112

1213
import lombok.RequiredArgsConstructor;
1314

@@ -24,7 +25,7 @@ public class ChatService {
2425
private final ApplicationEventPublisher eventPublisher;
2526

2627
// todo ๋™์‹œ์„ฑ์ ์šฉ
27-
public void chat(Long roomId, String sessionId, ChatMessage chatMessage) {
28+
public void chat(Long roomId, UserPrincipal userPrincipal, ChatMessage chatMessage) {
2829

2930
Room room = roomService.findRoom(roomId);
3031

@@ -42,7 +43,8 @@ public void chat(Long roomId, String sessionId, ChatMessage chatMessage) {
4243

4344
if (answer.equals(chatMessage.message())) {
4445
eventPublisher.publishEvent(
45-
new GameCorrectAnswerEvent(room, sessionId, chatMessage, answer));
46+
new GameCorrectAnswerEvent(
47+
room, userPrincipal.getUserId(), chatMessage, answer));
4648
}
4749
}
4850
}

โ€Žbackend/src/main/java/io/f1/backend/domain/game/app/GameService.javaโ€Ž

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
import io.f1.backend.domain.game.dto.MessageType;
1616
import io.f1.backend.domain.game.dto.RoomEventType;
1717
import io.f1.backend.domain.game.dto.request.GameSettingChanger;
18-
import io.f1.backend.domain.game.dto.response.PlayerListResponse;
18+
import io.f1.backend.domain.game.dto.response.GameResultListResponse;
19+
import io.f1.backend.domain.game.dto.response.GameResultResponse;
1920
import io.f1.backend.domain.game.event.GameCorrectAnswerEvent;
2021
import io.f1.backend.domain.game.event.GameTimeoutEvent;
2122
import io.f1.backend.domain.game.event.RoomUpdatedEvent;
23+
import io.f1.backend.domain.game.model.ConnectionState;
2224
import io.f1.backend.domain.game.model.Player;
2325
import io.f1.backend.domain.game.model.Room;
2426
import io.f1.backend.domain.game.model.RoomState;
@@ -27,10 +29,12 @@
2729
import io.f1.backend.domain.question.entity.Question;
2830
import io.f1.backend.domain.quiz.app.QuizService;
2931
import io.f1.backend.domain.quiz.entity.Quiz;
32+
import io.f1.backend.domain.stat.app.StatService;
3033
import io.f1.backend.domain.user.dto.UserPrincipal;
3134
import io.f1.backend.global.exception.CustomException;
3235
import io.f1.backend.global.exception.errorcode.GameErrorCode;
3336
import io.f1.backend.global.exception.errorcode.RoomErrorCode;
37+
import io.f1.backend.global.lock.DistributedLock;
3438

3539
import lombok.RequiredArgsConstructor;
3640
import lombok.extern.slf4j.Slf4j;
@@ -52,13 +56,15 @@ public class GameService {
5256
private static final int CONTINUE_DELAY = 3;
5357
private static final String NONE_CORRECT_USER = "";
5458

59+
private final StatService statService;
5560
private final QuizService quizService;
5661
private final RoomService roomService;
5762
private final TimerService timerService;
5863
private final MessageSender messageSender;
5964
private final RoomRepository roomRepository;
6065
private final ApplicationEventPublisher eventPublisher;
6166

67+
@DistributedLock(prefix = "room", key = "#roomId")
6268
public void gameStart(Long roomId, UserPrincipal principal) {
6369

6470
String destination = getDestination(roomId);
@@ -97,13 +103,13 @@ public void onCorrectAnswer(GameCorrectAnswerEvent event) {
97103

98104
Room room = event.room();
99105
log.debug(room.getId() + "๋ฒˆ ๋ฐฉ ์ฑ„ํŒ…์œผ๋กœ ์ •๋‹ต! ํ˜„์žฌ ๋ผ์šด๋“œ : " + room.getCurrentRound());
100-
String sessionId = event.sessionId();
106+
Long userId = event.userId();
101107
ChatMessage chatMessage = event.chatMessage();
102108
String answer = event.answer();
103109

104110
String destination = getDestination(room.getId());
105111

106-
room.increasePlayerCorrectCount(sessionId);
112+
room.increasePlayerCorrectCount(userId);
107113

108114
messageSender.sendBroadcast(
109115
destination,
@@ -167,13 +173,14 @@ public void gameEnd(Room room) {
167173
Long roomId = room.getId();
168174
String destination = getDestination(roomId);
169175

170-
Map<String, Player> playerSessionMap = room.getPlayerSessionMap();
176+
Map<Long, Player> playerMap = room.getPlayerMap();
171177

172-
// TODO : ๋žญํ‚น ์ •๋ณด ์—…๋ฐ์ดํŠธ
173-
messageSender.sendBroadcast(
174-
destination,
175-
MessageType.GAME_RESULT,
176-
toGameResultListResponse(playerSessionMap, room.getGameSetting().getRound()));
178+
GameResultListResponse gameResultListResponse =
179+
toGameResultListResponse(playerMap, room.getGameSetting().getRound());
180+
181+
messageSender.sendBroadcast(destination, MessageType.GAME_RESULT, gameResultListResponse);
182+
183+
updateRank(room, gameResultListResponse);
177184

178185
room.initializeRound();
179186
room.initializePlayers();
@@ -199,19 +206,44 @@ public void gameEnd(Room room) {
199206
destination, MessageType.ROOM_SETTING, toRoomSettingResponse(room));
200207
}
201208

202-
public void handlePlayerReady(Long roomId, String sessionId) {
209+
private void updateRank(Room room, GameResultListResponse gameResultListResponse) {
210+
211+
List<GameResultResponse> result = gameResultListResponse.result();
212+
213+
for (GameResultResponse gameResultResponse : result) {
214+
Long playerId = gameResultResponse.id();
215+
int rank = gameResultResponse.rank();
216+
int score = gameResultResponse.score();
217+
218+
Player player = room.getPlayerByUserId(playerId);
219+
220+
if (room.isPlayerInState(playerId, ConnectionState.DISCONNECTED)) {
221+
statService.updateRank(playerId, false, 0);
222+
continue;
223+
}
224+
225+
if (rank == 1) {
226+
statService.updateRank(playerId, true, score);
227+
continue;
228+
}
229+
230+
statService.updateRank(playerId, false, score);
231+
}
232+
}
233+
234+
@DistributedLock(prefix = "room", key = "#roomId")
235+
public void handlePlayerReady(Long roomId, UserPrincipal userPrincipal) {
203236

204237
Room room = findRoom(roomId);
205238

206-
Player player = room.getPlayerBySessionId(sessionId);
239+
Player player = room.getPlayerByUserId(userPrincipal.getUserId());
207240

208241
toggleReadyIfPossible(room, player);
209242

210243
String destination = getDestination(roomId);
211244

212-
PlayerListResponse playerListResponse = toPlayerListResponse(room);
213-
log.info(playerListResponse.toString());
214-
messageSender.sendBroadcast(destination, MessageType.PLAYER_LIST, playerListResponse);
245+
messageSender.sendBroadcast(
246+
destination, MessageType.PLAYER_LIST, toPlayerListResponse(room));
215247
}
216248

217249
public void changeGameSetting(
@@ -244,7 +276,7 @@ private void validateRoomStart(Room room, UserPrincipal principal) {
244276
// ๋ผ์šด๋“œ ์ˆ˜๋งŒํผ ๋žœ๋ค Question ์ถ”์ถœ
245277
private List<Question> prepareQuestions(Room room, Quiz quiz) {
246278
Long quizId = quiz.getId();
247-
Integer round = room.getGameSetting().getRound();
279+
Integer round = room.getRound();
248280
return quizService.getRandomQuestionsWithoutAnswer(quizId, round);
249281
}
250282

0 commit comments

Comments
ย (0)