From ecd0c0603a4da0b5529fc7870a51e8a1c08cff9d Mon Sep 17 00:00:00 2001 From: gikhoon Date: Wed, 14 Aug 2024 02:22:39 +0900 Subject: [PATCH 1/6] =?UTF-8?q?refactor:=20=EC=9B=B9=EC=86=8C=EC=BC=93=20?= =?UTF-8?q?=ED=95=B8=EB=93=9C=EC=89=90=EC=9D=B4=ED=81=AC=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/cotato/csquiz/common/config/WebSocketConfig.java | 2 +- .../common/{interceptor => websocket}/HandshakeInterceptor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/org/cotato/csquiz/common/{interceptor => websocket}/HandshakeInterceptor.java (98%) diff --git a/src/main/java/org/cotato/csquiz/common/config/WebSocketConfig.java b/src/main/java/org/cotato/csquiz/common/config/WebSocketConfig.java index f7e33981..54d798e4 100644 --- a/src/main/java/org/cotato/csquiz/common/config/WebSocketConfig.java +++ b/src/main/java/org/cotato/csquiz/common/config/WebSocketConfig.java @@ -2,7 +2,7 @@ import org.cotato.csquiz.common.config.jwt.JwtTokenProvider; import lombok.RequiredArgsConstructor; -import org.cotato.csquiz.common.interceptor.HandshakeInterceptor; +import org.cotato.csquiz.common.websocket.HandshakeInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.config.annotation.EnableWebSocket; diff --git a/src/main/java/org/cotato/csquiz/common/interceptor/HandshakeInterceptor.java b/src/main/java/org/cotato/csquiz/common/websocket/HandshakeInterceptor.java similarity index 98% rename from src/main/java/org/cotato/csquiz/common/interceptor/HandshakeInterceptor.java rename to src/main/java/org/cotato/csquiz/common/websocket/HandshakeInterceptor.java index 0221ce98..5f6f362e 100644 --- a/src/main/java/org/cotato/csquiz/common/interceptor/HandshakeInterceptor.java +++ b/src/main/java/org/cotato/csquiz/common/websocket/HandshakeInterceptor.java @@ -1,4 +1,4 @@ -package org.cotato.csquiz.common.interceptor; +package org.cotato.csquiz.common.websocket; import org.cotato.csquiz.common.config.jwt.JwtTokenProvider; import org.cotato.csquiz.domain.auth.enums.MemberRole; From e276a64852cfd01031be04c002d819d0b77543d3 Mon Sep 17 00:00:00 2001 From: gikhoon Date: Wed, 14 Aug 2024 03:16:38 +0900 Subject: [PATCH 2/6] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 사용하지 않는 코드 삭제 - 퀴즈 상태 전체 끄기 메소드 위치 이동 및 쿼리 최적화 - Transactional 삭제 --- .../socket/controller/SocketController.java | 19 +-- .../csquiz/common/SchedulerService.java | 6 +- .../common/websocket/WebSocketHandler.java | 6 +- .../education/repository/QuizRepository.java | 6 +- .../education/service/EducationService.java | 45 ++++++ .../education/service/QuizSolveService.java | 101 +++++++++++++ .../education/service/SocketService.java | 138 +----------------- 7 files changed, 172 insertions(+), 149 deletions(-) create mode 100644 src/main/java/org/cotato/csquiz/domain/education/service/QuizSolveService.java diff --git a/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java b/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java index 45b634a7..ece29e4e 100644 --- a/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java +++ b/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java @@ -7,8 +7,7 @@ import org.cotato.csquiz.api.socket.dto.QuizOpenRequest; import org.cotato.csquiz.api.socket.dto.QuizSocketRequest; import org.cotato.csquiz.api.socket.dto.SocketTokenDto; -import org.cotato.csquiz.domain.education.service.RecordService; -import org.cotato.csquiz.domain.education.service.SocketService; +import org.cotato.csquiz.domain.education.service.*; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -25,43 +24,45 @@ public class SocketController { private final SocketService socketService; + private final EducationService educationService; private final RecordService recordService; + private final QuizSolveService quizSolveService; @PatchMapping("/start/csquiz") public ResponseEntity openCSQuiz(@RequestBody @Valid QuizOpenRequest request) { - socketService.openCSQuiz(request); + educationService.openCSQuiz(request); recordService.saveAnswersToCache(request); return ResponseEntity.noContent().build(); } @PatchMapping("/access") public ResponseEntity accessQuiz(@RequestBody @Valid QuizSocketRequest request) { - socketService.accessQuiz(request); + quizSolveService.accessQuiz(request); recordService.saveAnswer(request); return ResponseEntity.noContent().build(); } @PatchMapping("/start") public ResponseEntity startQuizSolve(@RequestBody @Valid QuizSocketRequest request) { - socketService.startQuizSolve(request); + quizSolveService.startQuizSolve(request); return ResponseEntity.noContent().build(); } @PatchMapping("/deny") public ResponseEntity denyQuiz(@RequestBody @Valid QuizSocketRequest request) { - socketService.denyQuiz(request); + quizSolveService.denyQuiz(request); return ResponseEntity.noContent().build(); } @PatchMapping("/stop") public ResponseEntity stopQuizSolve(@RequestBody @Valid QuizSocketRequest request) { - socketService.stopQuizSolve(request); + quizSolveService.stopQuizSolve(request); return ResponseEntity.noContent().build(); } @PatchMapping("/close/csquiz") - public ResponseEntity stopAllQuiz(@RequestBody @Valid EducationCloseRequest request) { - socketService.stopAllQuiz(request); + public ResponseEntity closeEducation(@RequestBody @Valid EducationCloseRequest request) { + educationService.closeEducation(request); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/org/cotato/csquiz/common/SchedulerService.java b/src/main/java/org/cotato/csquiz/common/SchedulerService.java index fed7bb5a..ddf97bf6 100644 --- a/src/main/java/org/cotato/csquiz/common/SchedulerService.java +++ b/src/main/java/org/cotato/csquiz/common/SchedulerService.java @@ -5,6 +5,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.cotato.csquiz.domain.auth.entity.RefusedMember; +import org.cotato.csquiz.domain.education.service.EducationService; +import org.cotato.csquiz.domain.education.service.QuizService; import org.cotato.csquiz.domain.education.service.SocketService; import org.cotato.csquiz.domain.auth.enums.MemberRole; import org.cotato.csquiz.domain.auth.repository.MemberRepository; @@ -21,7 +23,7 @@ public class SchedulerService { private final RefusedMemberRepository refusedMemberRepository; private final MemberRepository memberRepository; - private final SocketService socketService; + private final EducationService educationService; @Transactional @Scheduled(cron = "0 0 0 * * *") @@ -42,7 +44,7 @@ public void updateRefusedMember() { @Transactional @Scheduled(cron = "0 0 2 * * SAT") public void closeAllCsQuiz() { - socketService.closeAllFlags(); + educationService.closeAllFlags(); log.info("[ CS 퀴즈 모두 닫기 Scheduler 완료 ]"); } } diff --git a/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java b/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java index 00f65333..88b545f9 100644 --- a/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java +++ b/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java @@ -132,8 +132,8 @@ public void startQuiz(Long quizId) { log.info("[풀이 신호 전송 후 사용자 : {}]", CLIENTS.keySet()); } - public void stopQuiz(Quiz quiz) { - QuizStopResponse response = QuizStopResponse.from(quiz.getId()); + public void stopQuiz(Long quizId) { + QuizStopResponse response = QuizStopResponse.from(quizId); for (WebSocketSession clientSession : CLIENTS.values()) { sendMessage(clientSession, response); } @@ -155,7 +155,7 @@ public void sendWinnerCommand(Long educationId) { } } - public void stopAllQuiz(Long educationId) { + public void stopEducation(Long educationId) { CsQuizStopResponse response = CsQuizStopResponse.from(EXIT_COMMAND, educationId); for (WebSocketSession clientSession : CLIENTS.values()) { sendMessage(clientSession, response); diff --git a/src/main/java/org/cotato/csquiz/domain/education/repository/QuizRepository.java b/src/main/java/org/cotato/csquiz/domain/education/repository/QuizRepository.java index dee1e5ed..c7451d0c 100644 --- a/src/main/java/org/cotato/csquiz/domain/education/repository/QuizRepository.java +++ b/src/main/java/org/cotato/csquiz/domain/education/repository/QuizRepository.java @@ -20,18 +20,14 @@ public interface QuizRepository extends JpaRepository { List findAllByEducationId(Long educationId); - List findAllByStatus(QuizStatus status); - Optional findByStatusAndEducationId(QuizStatus status, Long educationId); - List findAllByStart(QuizStatus quizStatus); + List findAllByStatusOrStart(QuizStatus status, QuizStatus start); @Transactional @Modifying @Query("select q from Quiz q where q.education.id in :educationIds") List findAllByEducationIdsInQuery(@Param("educationIds") List educationIds); - Optional findByEducationIdAndNumber(Long educationId, Integer i); - Optional findFirstByEducationOrderByNumberDesc(Education education); } diff --git a/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java b/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java index 3d6f2be1..72214014 100644 --- a/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java +++ b/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java @@ -11,8 +11,12 @@ import org.cotato.csquiz.api.education.dto.EducationIdOfQuizResponse; import org.cotato.csquiz.api.education.dto.FindEducationStatusResponse; import org.cotato.csquiz.api.education.dto.UpdateEducationRequest; +import org.cotato.csquiz.api.socket.dto.EducationCloseRequest; +import org.cotato.csquiz.api.socket.dto.QuizOpenRequest; import org.cotato.csquiz.domain.education.entity.Education; import org.cotato.csquiz.domain.education.entity.Quiz; +import org.cotato.csquiz.domain.education.enums.EducationStatus; +import org.cotato.csquiz.domain.education.enums.QuizStatus; import org.cotato.csquiz.domain.education.repository.EducationRepository; import org.cotato.csquiz.domain.education.repository.QuizRepository; import org.cotato.csquiz.domain.generation.entity.Session; @@ -31,6 +35,8 @@ public class EducationService { private final EducationRepository educationRepository; private final QuizRepository quizRepository; private final SessionRepository sessionRepository; + private final SocketService socketService; + @Transactional public CreateEducationResponse createEducation(CreateEducationRequest request) { @@ -80,12 +86,51 @@ private void validateNotEmpty(String newSubject) { .orElseThrow(() -> new AppException(ErrorCode.SUBJECT_INVALID)); } + @Transactional + public void openCSQuiz(QuizOpenRequest request) { + Education education = findEducationById(request.educationId()); + + checkEducationBefore(education); + + education.updateStatus(EducationStatus.ONGOING); + } + + private void checkEducationBefore(Education education) { + if (EducationStatus.BEFORE != education.getStatus()) { + throw new AppException(ErrorCode.EDUCATION_STATUS_NOT_BEFORE); + } + } + + @Transactional + public void closeAllFlags() { + quizRepository.findAllByStatusOrStart(QuizStatus.QUIZ_ON, QuizStatus.QUIZ_ON) + .forEach(quiz -> { + quiz.updateStatus(QuizStatus.QUIZ_OFF); + quiz.updateStart(QuizStatus.QUIZ_OFF); + }); + } + + @Transactional + public void closeEducation(EducationCloseRequest request) { + closeAllFlags(); + + Education education = findEducationById(request.educationId()); + + education.updateStatus(EducationStatus.FINISHED); + socketService.stopEducation(education.getId()); + } + public List findEducationListByGeneration(Long generationId) { return findAllEducationByGenerationId(generationId).stream() .map(AllEducationResponse::from) .toList(); } + private Education findEducationById(Long educationId) { + return educationRepository.findById(educationId) + .orElseThrow(() -> new EntityNotFoundException("해당 교육을 찾을 수 없습니다.")); + } + public EducationIdOfQuizResponse findEducationIdOfQuizId(Long quizId) { Quiz quiz = quizRepository.findById(quizId) .orElseThrow(() -> new EntityNotFoundException("해당 문제를 찾을 수 없습니다.")); diff --git a/src/main/java/org/cotato/csquiz/domain/education/service/QuizSolveService.java b/src/main/java/org/cotato/csquiz/domain/education/service/QuizSolveService.java new file mode 100644 index 00000000..2472e3ff --- /dev/null +++ b/src/main/java/org/cotato/csquiz/domain/education/service/QuizSolveService.java @@ -0,0 +1,101 @@ +package org.cotato.csquiz.domain.education.service; + +import jakarta.persistence.EntityNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.cotato.csquiz.api.socket.dto.QuizSocketRequest; +import org.cotato.csquiz.common.error.ErrorCode; +import org.cotato.csquiz.common.error.exception.AppException; +import org.cotato.csquiz.domain.education.entity.Education; +import org.cotato.csquiz.domain.education.entity.Quiz; +import org.cotato.csquiz.domain.education.enums.EducationStatus; +import org.cotato.csquiz.domain.education.enums.QuizStatus; +import org.cotato.csquiz.domain.education.repository.EducationRepository; +import org.cotato.csquiz.domain.education.repository.QuizRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Service +@RequiredArgsConstructor +public class QuizSolveService { + + private final SocketService socketService; + private final EducationRepository educationRepository; + private final QuizRepository quizRepository; + private final EducationService educationService; + + @Transactional + public void accessQuiz(QuizSocketRequest request) { + Quiz quiz = findQuizById(request.quizId()); + + checkEducationOpen(quiz.getEducation()); + + educationService.closeAllFlags(); + + quiz.updateStatus(QuizStatus.QUIZ_ON); + socketService.accessQuiz(quiz.getId()); + } + + @Transactional + public void denyQuiz(QuizSocketRequest request) { + Quiz quiz = findQuizById(request.quizId()); + + checkEducationOpen(quiz.getEducation()); + + quiz.updateStatus(QuizStatus.QUIZ_OFF); + quiz.updateStart(QuizStatus.QUIZ_OFF); + } + + @Transactional + public void startQuizSolve(QuizSocketRequest request) { + Quiz quiz = findQuizById(request.quizId()); + + checkEducationOpen(quiz.getEducation()); + checkQuizIsStarted(quiz); + + sleepRandomTime(quiz); + quiz.updateStart(QuizStatus.QUIZ_ON); + + socketService.startQuizSolve(quiz.getId()); + } + + private void checkQuizIsStarted(Quiz quiz) { + if (quiz.getStatus().equals(QuizStatus.QUIZ_OFF)) { + throw new AppException(ErrorCode.QUIZ_ACCESS_DENIED); + } + } + + private void sleepRandomTime(Quiz quiz) { + try { + Thread.sleep(1000L * quiz.getAppearSecond()); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + @Transactional + public void stopQuizSolve(QuizSocketRequest request) { + Quiz quiz = findQuizById(request.quizId()); + checkEducationOpen(quiz.getEducation()); + + quiz.updateStart(QuizStatus.QUIZ_OFF); + socketService.stopQuizSolve(quiz.getId()); + } + + private void checkEducationOpen(Education education) { + if (EducationStatus.ONGOING != education.getStatus()) { + throw new AppException(ErrorCode.EDUCATION_CLOSED); + } + } + + private Quiz findQuizById(Long quizId) { + return quizRepository.findById(quizId) + .orElseThrow(() -> new EntityNotFoundException("해당 퀴즈를 찾을 수 없습니다.")); + } + + private Education findEducationById(Long educationId) { + return educationRepository.findById(educationId) + .orElseThrow(() -> new EntityNotFoundException("해당 교육을 찾을 수 없습니다.")); + } +} diff --git a/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java b/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java index 08cf36d1..1addf938 100644 --- a/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java +++ b/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java @@ -1,132 +1,36 @@ package org.cotato.csquiz.domain.education.service; -import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.cotato.csquiz.api.socket.dto.EducationCloseRequest; -import org.cotato.csquiz.api.socket.dto.QuizOpenRequest; -import org.cotato.csquiz.api.socket.dto.QuizSocketRequest; import org.cotato.csquiz.api.socket.dto.SocketTokenDto; import org.cotato.csquiz.common.config.jwt.JwtTokenProvider; -import org.cotato.csquiz.domain.education.entity.Education; -import org.cotato.csquiz.domain.education.entity.Quiz; -import org.cotato.csquiz.domain.education.enums.QuizStatus; -import org.cotato.csquiz.domain.education.repository.EducationRepository; -import org.cotato.csquiz.domain.education.repository.QuizRepository; -import org.cotato.csquiz.domain.education.enums.EducationStatus; -import org.cotato.csquiz.common.error.exception.AppException; -import org.cotato.csquiz.common.error.ErrorCode; import org.cotato.csquiz.common.websocket.WebSocketHandler; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; @Service @RequiredArgsConstructor -@Transactional(readOnly = true) @Slf4j public class SocketService { private final WebSocketHandler webSocketHandler; - private final QuizRepository quizRepository; - private final EducationRepository educationRepository; private final JwtTokenProvider jwtTokenProvider; - @Transactional - public void openCSQuiz(QuizOpenRequest request) { - Education education = findEducationById(request.educationId()); - - checkEducationBefore(education); - - education.updateStatus(EducationStatus.ONGOING); - } - - private void checkEducationBefore(Education education) { - if (EducationStatus.BEFORE != education.getStatus()) { - throw new AppException(ErrorCode.EDUCATION_STATUS_NOT_BEFORE); - } - } - - @Transactional - public void accessQuiz(QuizSocketRequest request) { - Quiz quiz = findQuizById(request.quizId()); - - checkEducationOpen(quiz.getEducation()); - - makeAllStartFalse(); - makeAllStatusFalse(); - - quiz.updateStatus(QuizStatus.QUIZ_ON); - webSocketHandler.accessQuiz(quiz.getId()); - } - - @Transactional - public void startQuizSolve(QuizSocketRequest request) { - Quiz quiz = findQuizById(request.quizId()); - - checkEducationOpen(quiz.getEducation()); - checkQuizIsStarted(quiz); - - sleepRandomTime(quiz); - quiz.updateStart(QuizStatus.QUIZ_ON); - - webSocketHandler.startQuiz(quiz.getId()); - } - - private void checkQuizIsStarted(Quiz quiz) { - if (quiz.getStatus().equals(QuizStatus.QUIZ_OFF)) { - throw new AppException(ErrorCode.QUIZ_ACCESS_DENIED); - } - } - - private void sleepRandomTime(Quiz quiz) { - try { - Thread.sleep(1000L * quiz.getAppearSecond()); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } + public void accessQuiz(Long quizId) { + webSocketHandler.accessQuiz(quizId); } - @Transactional - public void denyQuiz(QuizSocketRequest request) { - Quiz quiz = findQuizById(request.quizId()); - - checkEducationOpen(quiz.getEducation()); - - quiz.updateStatus(QuizStatus.QUIZ_OFF); - quiz.updateStart(QuizStatus.QUIZ_OFF); + public void startQuizSolve(Long quizId) { + webSocketHandler.startQuiz(quizId); } - @Transactional - public void stopQuizSolve(QuizSocketRequest request) { - Quiz quiz = findQuizById(request.quizId()); - checkEducationOpen(quiz.getEducation()); - - quiz.updateStart(QuizStatus.QUIZ_OFF); - - webSocketHandler.stopQuiz(quiz); + public void stopQuizSolve(Long quizId) { + webSocketHandler.stopQuiz(quizId); } - @Transactional - public void stopAllQuiz(EducationCloseRequest request) { - closeAllFlags(); - - Education education = findEducationById(request.educationId()); - - education.updateStatus(EducationStatus.FINISHED); - webSocketHandler.stopAllQuiz(education.getId()); - } - - @Transactional - public void closeAllFlags() { - makeAllStatusFalse(); - makeAllStartFalse(); + public void stopEducation(Long educationId) { + webSocketHandler.stopEducation(educationId); } - @Transactional public SocketTokenDto createSocketToken(String authorizationHeader) { String token = jwtTokenProvider.resolveAccessToken(authorizationHeader); String role = jwtTokenProvider.getRole(token); @@ -138,32 +42,6 @@ public SocketTokenDto createSocketToken(String authorizationHeader) { return SocketTokenDto.from(socketToken); } - private void makeAllStatusFalse() { - quizRepository.findAllByStatus(QuizStatus.QUIZ_ON) - .forEach(quiz -> quiz.updateStatus(QuizStatus.QUIZ_OFF)); - } - - private void makeAllStartFalse() { - quizRepository.findAllByStart(QuizStatus.QUIZ_ON) - .forEach(quiz -> quiz.updateStart(QuizStatus.QUIZ_OFF)); - } - - private void checkEducationOpen(Education education) { - if (EducationStatus.ONGOING != education.getStatus()) { - throw new AppException(ErrorCode.EDUCATION_CLOSED); - } - } - - private Quiz findQuizById(Long quizId) { - return quizRepository.findById(quizId) - .orElseThrow(() -> new EntityNotFoundException("해당 퀴즈를 찾을 수 없습니다.")); - } - - private Education findEducationById(Long educationId) { - return educationRepository.findById(educationId) - .orElseThrow(() -> new EntityNotFoundException("해당 교육을 찾을 수 없습니다.")); - } - public void sendKingCommand(Long educationId) { webSocketHandler.sendKingMemberCommand(educationId); } From 8cfc50374e278d0e4223276aca2bd447027efd16 Mon Sep 17 00:00:00 2001 From: youth Date: Wed, 14 Aug 2024 09:34:17 +0900 Subject: [PATCH 3/6] =?UTF-8?q?refactor:=20=EC=86=8C=EC=BC=93=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EB=B0=9C=EA=B8=89=20=EC=8B=9C=20AuthenticationPrin?= =?UTF-8?q?cipal=20=ED=99=9C=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/socket/controller/SocketController.java | 11 +++++++---- .../domain/education/service/SocketService.java | 13 +++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java b/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java index ece29e4e..6d2a49d6 100644 --- a/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java +++ b/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java @@ -7,12 +7,15 @@ import org.cotato.csquiz.api.socket.dto.QuizOpenRequest; import org.cotato.csquiz.api.socket.dto.QuizSocketRequest; import org.cotato.csquiz.api.socket.dto.SocketTokenDto; -import org.cotato.csquiz.domain.education.service.*; +import org.cotato.csquiz.domain.education.service.EducationService; +import org.cotato.csquiz.domain.education.service.QuizSolveService; +import org.cotato.csquiz.domain.education.service.RecordService; +import org.cotato.csquiz.domain.education.service.SocketService; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -67,8 +70,8 @@ public ResponseEntity closeEducation(@RequestBody @Valid EducationCloseReq } @PostMapping("/token") - public ResponseEntity makeSocketToken(@RequestHeader("Authorization") String authorizationHeader) { - return ResponseEntity.ok(socketService.createSocketToken(authorizationHeader)); + public ResponseEntity makeSocketToken(@AuthenticationPrincipal Long memberId) { + return ResponseEntity.ok(socketService.createSocketToken(memberId)); } diff --git a/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java b/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java index 1addf938..cbf8e694 100644 --- a/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java +++ b/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java @@ -4,6 +4,8 @@ import lombok.extern.slf4j.Slf4j; import org.cotato.csquiz.api.socket.dto.SocketTokenDto; import org.cotato.csquiz.common.config.jwt.JwtTokenProvider; +import org.cotato.csquiz.domain.auth.entity.Member; +import org.cotato.csquiz.domain.auth.service.MemberService; import org.cotato.csquiz.common.websocket.WebSocketHandler; import org.springframework.stereotype.Service; @@ -12,6 +14,7 @@ @Slf4j public class SocketService { + private final MemberService memberService; private final WebSocketHandler webSocketHandler; private final JwtTokenProvider jwtTokenProvider; @@ -31,13 +34,11 @@ public void stopEducation(Long educationId) { webSocketHandler.stopEducation(educationId); } - public SocketTokenDto createSocketToken(String authorizationHeader) { - String token = jwtTokenProvider.resolveAccessToken(authorizationHeader); - String role = jwtTokenProvider.getRole(token); - Long memberId = jwtTokenProvider.getMemberId(token); - jwtTokenProvider.checkMemberExist(memberId); - String socketToken = jwtTokenProvider.createSocketToken(memberId, role); + public SocketTokenDto createSocketToken(final Long memberId) { + Member member = memberService.findById(memberId); + + String socketToken = jwtTokenProvider.createSocketToken(member.getId(), member.getRole().getKey()); log.info("[ 소켓 전용 토큰 발급 완료 ]"); return SocketTokenDto.from(socketToken); } From 0aab6696579beec673f7017351768664f9442ba2 Mon Sep 17 00:00:00 2001 From: youth Date: Wed, 14 Aug 2024 13:02:28 +0900 Subject: [PATCH 4/6] =?UTF-8?q?refactor:=20=EA=B5=90=EC=9C=A1=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EC=8B=9C=20=EC=BA=90=EC=8B=9C=EC=97=90=20=EC=A0=95?= =?UTF-8?q?=EB=8B=B5=20=EC=A0=80=EC=9E=A5=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../csquiz/api/socket/controller/SocketController.java | 1 - .../csquiz/domain/education/service/EducationService.java | 2 ++ .../csquiz/domain/education/service/RecordService.java | 5 ++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java b/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java index 6d2a49d6..a7b7f96d 100644 --- a/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java +++ b/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java @@ -34,7 +34,6 @@ public class SocketController { @PatchMapping("/start/csquiz") public ResponseEntity openCSQuiz(@RequestBody @Valid QuizOpenRequest request) { educationService.openCSQuiz(request); - recordService.saveAnswersToCache(request); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java b/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java index 72214014..3fc13df9 100644 --- a/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java +++ b/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java @@ -32,6 +32,7 @@ @Slf4j public class EducationService { + private final RecordService recordService; private final EducationRepository educationRepository; private final QuizRepository quizRepository; private final SessionRepository sessionRepository; @@ -93,6 +94,7 @@ public void openCSQuiz(QuizOpenRequest request) { checkEducationBefore(education); education.updateStatus(EducationStatus.ONGOING); + recordService.saveAnswersToCache(education.getId()); } private void checkEducationBefore(Education education) { diff --git a/src/main/java/org/cotato/csquiz/domain/education/service/RecordService.java b/src/main/java/org/cotato/csquiz/domain/education/service/RecordService.java index 89cac76c..28c23f94 100644 --- a/src/main/java/org/cotato/csquiz/domain/education/service/RecordService.java +++ b/src/main/java/org/cotato/csquiz/domain/education/service/RecordService.java @@ -12,7 +12,6 @@ import org.cotato.csquiz.api.record.dto.ReplyRequest; import org.cotato.csquiz.api.record.dto.ReplyResponse; import org.cotato.csquiz.api.record.dto.ScorerResponse; -import org.cotato.csquiz.api.socket.dto.QuizOpenRequest; import org.cotato.csquiz.api.socket.dto.QuizSocketRequest; import org.cotato.csquiz.common.error.ErrorCode; import org.cotato.csquiz.common.error.exception.AppException; @@ -96,8 +95,8 @@ private Quiz findQuizById(Long quizId) { .orElseThrow(() -> new EntityNotFoundException("해당 문제를 찾을 수 없습니다.")); } - public void saveAnswersToCache(QuizOpenRequest request) { - List quizzes = quizRepository.findAllByEducationId(request.educationId()); + public void saveAnswersToCache(final Long educationId) { + List quizzes = quizRepository.findAllByEducationId(educationId); quizAnswerRedisRepository.saveAllQuizAnswers(quizzes); } From 1f5a831b0ab168f2bf9f44371d6e648897a2ae24 Mon Sep 17 00:00:00 2001 From: gikhoon Date: Wed, 14 Aug 2024 13:24:00 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor:=20=EA=B5=90=EC=9C=A1=20=EC=97=B4?= =?UTF-8?q?=EA=B8=B0=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../csquiz/api/socket/controller/SocketController.java | 6 +++--- .../dto/{QuizOpenRequest.java => EducationOpenRequest.java} | 2 +- .../csquiz/domain/education/service/EducationService.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) rename src/main/java/org/cotato/csquiz/api/socket/dto/{QuizOpenRequest.java => EducationOpenRequest.java} (79%) diff --git a/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java b/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java index a7b7f96d..8fe52032 100644 --- a/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java +++ b/src/main/java/org/cotato/csquiz/api/socket/controller/SocketController.java @@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.cotato.csquiz.api.socket.dto.EducationCloseRequest; -import org.cotato.csquiz.api.socket.dto.QuizOpenRequest; +import org.cotato.csquiz.api.socket.dto.EducationOpenRequest; import org.cotato.csquiz.api.socket.dto.QuizSocketRequest; import org.cotato.csquiz.api.socket.dto.SocketTokenDto; import org.cotato.csquiz.domain.education.service.EducationService; @@ -32,8 +32,8 @@ public class SocketController { private final QuizSolveService quizSolveService; @PatchMapping("/start/csquiz") - public ResponseEntity openCSQuiz(@RequestBody @Valid QuizOpenRequest request) { - educationService.openCSQuiz(request); + public ResponseEntity openEducation(@RequestBody @Valid EducationOpenRequest request) { + educationService.openEducation(request); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/org/cotato/csquiz/api/socket/dto/QuizOpenRequest.java b/src/main/java/org/cotato/csquiz/api/socket/dto/EducationOpenRequest.java similarity index 79% rename from src/main/java/org/cotato/csquiz/api/socket/dto/QuizOpenRequest.java rename to src/main/java/org/cotato/csquiz/api/socket/dto/EducationOpenRequest.java index 5a5f2528..3aa06982 100644 --- a/src/main/java/org/cotato/csquiz/api/socket/dto/QuizOpenRequest.java +++ b/src/main/java/org/cotato/csquiz/api/socket/dto/EducationOpenRequest.java @@ -2,7 +2,7 @@ import jakarta.validation.constraints.NotNull; -public record QuizOpenRequest( +public record EducationOpenRequest( @NotNull Long educationId ) { diff --git a/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java b/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java index 3fc13df9..abe5744a 100644 --- a/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java +++ b/src/main/java/org/cotato/csquiz/domain/education/service/EducationService.java @@ -12,7 +12,7 @@ import org.cotato.csquiz.api.education.dto.FindEducationStatusResponse; import org.cotato.csquiz.api.education.dto.UpdateEducationRequest; import org.cotato.csquiz.api.socket.dto.EducationCloseRequest; -import org.cotato.csquiz.api.socket.dto.QuizOpenRequest; +import org.cotato.csquiz.api.socket.dto.EducationOpenRequest; import org.cotato.csquiz.domain.education.entity.Education; import org.cotato.csquiz.domain.education.entity.Quiz; import org.cotato.csquiz.domain.education.enums.EducationStatus; @@ -88,7 +88,7 @@ private void validateNotEmpty(String newSubject) { } @Transactional - public void openCSQuiz(QuizOpenRequest request) { + public void openEducation(EducationOpenRequest request) { Education education = findEducationById(request.educationId()); checkEducationBefore(education); From 1875f0eb7e789aa5490ce610bf3a56b071d32a63 Mon Sep 17 00:00:00 2001 From: gikhoon Date: Wed, 14 Aug 2024 13:26:43 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C,?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../csquiz/domain/education/service/QuizSolveService.java | 7 ------- .../csquiz/domain/education/service/SocketService.java | 1 - 2 files changed, 8 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/domain/education/service/QuizSolveService.java b/src/main/java/org/cotato/csquiz/domain/education/service/QuizSolveService.java index 2472e3ff..cc2b707d 100644 --- a/src/main/java/org/cotato/csquiz/domain/education/service/QuizSolveService.java +++ b/src/main/java/org/cotato/csquiz/domain/education/service/QuizSolveService.java @@ -10,7 +10,6 @@ import org.cotato.csquiz.domain.education.entity.Quiz; import org.cotato.csquiz.domain.education.enums.EducationStatus; import org.cotato.csquiz.domain.education.enums.QuizStatus; -import org.cotato.csquiz.domain.education.repository.EducationRepository; import org.cotato.csquiz.domain.education.repository.QuizRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,7 +20,6 @@ public class QuizSolveService { private final SocketService socketService; - private final EducationRepository educationRepository; private final QuizRepository quizRepository; private final EducationService educationService; @@ -93,9 +91,4 @@ private Quiz findQuizById(Long quizId) { return quizRepository.findById(quizId) .orElseThrow(() -> new EntityNotFoundException("해당 퀴즈를 찾을 수 없습니다.")); } - - private Education findEducationById(Long educationId) { - return educationRepository.findById(educationId) - .orElseThrow(() -> new EntityNotFoundException("해당 교육을 찾을 수 없습니다.")); - } } diff --git a/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java b/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java index cbf8e694..3cad249b 100644 --- a/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java +++ b/src/main/java/org/cotato/csquiz/domain/education/service/SocketService.java @@ -34,7 +34,6 @@ public void stopEducation(Long educationId) { webSocketHandler.stopEducation(educationId); } - public SocketTokenDto createSocketToken(final Long memberId) { Member member = memberService.findById(memberId);