From 3999f13865f9a3353f10cd0e6678dd772a0a73bd Mon Sep 17 00:00:00 2001 From: chat26666 Date: Wed, 25 Jun 2025 15:27:24 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat=20:=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=EC=8B=9C=20=EC=BA=90=EB=A6=AD=ED=84=B0=20=EB=A0=88?= =?UTF-8?q?=EB=B2=A8=EC=97=85=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../submission/port/ProblemEventService.java | 4 +-- .../submission/service/SubmissionService.java | 6 ++--- .../submission/model/SubmissionResult.java | 27 +++++++++++++++++++ .../service/SubmissionDomainService.java | 14 +++++----- .../event/dto/GameLevelUpEvent.java | 2 +- .../event/listener/GameLevelUpListener.java | 7 +++-- .../publisher/ProblemEventPublisher.java | 14 +++++----- 7 files changed, 52 insertions(+), 22 deletions(-) create mode 100644 src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java diff --git a/src/main/java/org/ezcode/codetest/application/submission/port/ProblemEventService.java b/src/main/java/org/ezcode/codetest/application/submission/port/ProblemEventService.java index f2cb4fa3..9cf5828f 100644 --- a/src/main/java/org/ezcode/codetest/application/submission/port/ProblemEventService.java +++ b/src/main/java/org/ezcode/codetest/application/submission/port/ProblemEventService.java @@ -1,9 +1,9 @@ package org.ezcode.codetest.application.submission.port; -import org.ezcode.codetest.domain.submission.model.entity.UserProblemResult; +import org.ezcode.codetest.domain.submission.model.SubmissionResult; public interface ProblemEventService { - void publishProblemSolveEvent(UserProblemResult event); + void publishProblemSolveEvent(SubmissionResult event); } diff --git a/src/main/java/org/ezcode/codetest/application/submission/service/SubmissionService.java b/src/main/java/org/ezcode/codetest/application/submission/service/SubmissionService.java index de3fb60c..9047ed43 100644 --- a/src/main/java/org/ezcode/codetest/application/submission/service/SubmissionService.java +++ b/src/main/java/org/ezcode/codetest/application/submission/service/SubmissionService.java @@ -28,8 +28,8 @@ import org.ezcode.codetest.application.submission.port.SubmissionEventService; import org.ezcode.codetest.domain.submission.exception.SubmissionException; import org.ezcode.codetest.domain.submission.exception.code.SubmissionExceptionCode; +import org.ezcode.codetest.domain.submission.model.SubmissionResult; import org.ezcode.codetest.domain.submission.model.TestcaseEvaluationInput; -import org.ezcode.codetest.domain.submission.model.entity.UserProblemResult; import org.ezcode.codetest.infrastructure.event.dto.submission.SubmissionMessage; import org.ezcode.codetest.application.submission.port.ReviewClient; import org.ezcode.codetest.domain.problem.model.ProblemInfo; @@ -125,11 +125,11 @@ public void submitCodeStream(SubmissionMessage msg) { user, problemInfo, language, msg.sourceCode(), context.getCurrentMessage() ); - UserProblemResult userProblemResult = submissionDomainService.finalizeSubmission( + SubmissionResult submissionResult = submissionDomainService.finalizeSubmission( submissionData, context.aggregator(), context.getPassedCount() ); - problemEventService.publishProblemSolveEvent(userProblemResult); + problemEventService.publishProblemSolveEvent(submissionResult); } catch (Exception e) { submissionEventService.publishSubmissionError(new SubmissionErrorEvent(msg.sessionKey(), e)); exceptionNotificationHelper(e); diff --git a/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java b/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java new file mode 100644 index 00000000..671109d8 --- /dev/null +++ b/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java @@ -0,0 +1,27 @@ +package org.ezcode.codetest.domain.submission.model; + +import org.ezcode.codetest.domain.submission.model.entity.UserProblemResult; + +import lombok.Builder; + +@Builder +public record SubmissionResult( + + Long userId, + + String problemCategory, + + boolean isSolved, + + boolean hasBeenSolved + +) { + public static SubmissionResult from(UserProblemResult result, boolean hasBeenSolved) { + return SubmissionResult.builder() + .userId(result.getUser().getId()) + .problemCategory(result.getProblem().getCategory().getDescription()) + .isSolved(result.isCorrect()) + .hasBeenSolved(hasBeenSolved) + .build(); + } +} diff --git a/src/main/java/org/ezcode/codetest/domain/submission/service/SubmissionDomainService.java b/src/main/java/org/ezcode/codetest/domain/submission/service/SubmissionDomainService.java index ee85cf92..55b0f8d4 100644 --- a/src/main/java/org/ezcode/codetest/domain/submission/service/SubmissionDomainService.java +++ b/src/main/java/org/ezcode/codetest/domain/submission/service/SubmissionDomainService.java @@ -7,6 +7,7 @@ import org.ezcode.codetest.application.submission.model.SubmissionContext; import org.ezcode.codetest.domain.submission.dto.WeeklySolveCount; import org.ezcode.codetest.domain.problem.model.ProblemInfo; +import org.ezcode.codetest.domain.submission.model.SubmissionResult; import org.ezcode.codetest.domain.submission.model.TestcaseEvaluationInput; import org.ezcode.codetest.domain.submission.model.SubmissionAggregator; import org.ezcode.codetest.domain.submission.dto.AnswerEvaluation; @@ -28,7 +29,7 @@ public class SubmissionDomainService { private final UserProblemResultRepository userProblemResultRepository; @Transactional - public UserProblemResult finalizeSubmission( + public SubmissionResult finalizeSubmission( SubmissionData submissionData, SubmissionAggregator aggregator, int passedCount) { @@ -39,23 +40,24 @@ public UserProblemResult finalizeSubmission( ) ); - boolean allPassed = passedCount == submissionData.getTestCaseSize(); + boolean allPassed = (passedCount == submissionData.getTestCaseSize()); return getUserProblemResult(submissionData.getUserId(), submissionData.getProblemId()).map( result -> { if (!result.isCorrect() && allPassed) { modifyUserProblemResult(result, true); - return result; + return SubmissionResult.from(result, false); } - return result; + return SubmissionResult.from(result, true); }) - .orElseGet(() -> createUserProblemResult( + .orElseGet(() -> SubmissionResult.from(createUserProblemResult( UserProblemResult.builder() .user(submissionData.user()) .problem(submissionData.problem()) .isCorrect(allPassed) .build() - )); + ),false) + ); } public AnswerEvaluation handleEvaluationAndUpdateStats( diff --git a/src/main/java/org/ezcode/codetest/infrastructure/event/dto/GameLevelUpEvent.java b/src/main/java/org/ezcode/codetest/infrastructure/event/dto/GameLevelUpEvent.java index 9da27e48..d0093381 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/event/dto/GameLevelUpEvent.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/event/dto/GameLevelUpEvent.java @@ -4,7 +4,7 @@ public record GameLevelUpEvent( Long userId, - boolean isProblemSolved, + boolean isSolved, String problemCategory diff --git a/src/main/java/org/ezcode/codetest/infrastructure/event/listener/GameLevelUpListener.java b/src/main/java/org/ezcode/codetest/infrastructure/event/listener/GameLevelUpListener.java index 9500a045..69af5789 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/event/listener/GameLevelUpListener.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/event/listener/GameLevelUpListener.java @@ -3,11 +3,10 @@ import org.ezcode.codetest.domain.game.exception.GameException; import org.ezcode.codetest.domain.game.service.CharacterStatusDomainService; import org.ezcode.codetest.infrastructure.event.dto.GameLevelUpEvent; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.event.TransactionPhase; -import org.springframework.transaction.event.TransactionalEventListener; import org.springframework.transaction.interceptor.TransactionAspectSupport; import lombok.RequiredArgsConstructor; @@ -20,12 +19,12 @@ public class GameLevelUpListener { private final CharacterStatusDomainService characterDomainService; - @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + @EventListener @Transactional(propagation = Propagation.REQUIRES_NEW) public void handleGameCharacterLevelUp(GameLevelUpEvent event) { try { - characterDomainService.gameCharacterLevelUp(event.userId(), event.isProblemSolved(), + characterDomainService.gameCharacterLevelUp(event.userId(), event.isSolved(), event.problemCategory()); } catch (GameException ge) { log.info("현재 해당 사용자는 게임 캐릭터를 생성한 상태가 아닙니다. {}", ge.getMessage()); diff --git a/src/main/java/org/ezcode/codetest/infrastructure/event/publisher/ProblemEventPublisher.java b/src/main/java/org/ezcode/codetest/infrastructure/event/publisher/ProblemEventPublisher.java index dc313010..7a5568bc 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/event/publisher/ProblemEventPublisher.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/event/publisher/ProblemEventPublisher.java @@ -1,7 +1,7 @@ package org.ezcode.codetest.infrastructure.event.publisher; import org.ezcode.codetest.application.submission.port.ProblemEventService; -import org.ezcode.codetest.domain.submission.model.entity.UserProblemResult; +import org.ezcode.codetest.domain.submission.model.SubmissionResult; import org.ezcode.codetest.infrastructure.event.dto.GameLevelUpEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; @@ -14,12 +14,14 @@ public class ProblemEventPublisher implements ProblemEventService { private final ApplicationEventPublisher publisher; - public void publishProblemSolveEvent(UserProblemResult event) { + public void publishProblemSolveEvent(SubmissionResult event) { - Long userId = event.getUser().getId(); - boolean isCorrect = event.isCorrect(); - String problemCategory = event.getProblem().getCategory().getDescription(); + if(event.hasBeenSolved()) return; - publisher.publishEvent(new GameLevelUpEvent(userId, isCorrect, problemCategory)); + Long userId = event.userId(); + String problemCategory = event.problemCategory(); + boolean isSolved = event.isSolved(); + + publisher.publishEvent(new GameLevelUpEvent(userId, isSolved, problemCategory)); } } From 86092af87e71d1ca0bdb031dd80dff943d8b8fe1 Mon Sep 17 00:00:00 2001 From: chat26666 Date: Wed, 25 Jun 2025 15:50:48 +0900 Subject: [PATCH 2/3] chore : name change --- .../domain/submission/model/SubmissionResult.java | 4 ++-- .../submission/model/entity/UserProblemResult.java | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java b/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java index 671109d8..b6882a81 100644 --- a/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java +++ b/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java @@ -18,8 +18,8 @@ public record SubmissionResult( ) { public static SubmissionResult from(UserProblemResult result, boolean hasBeenSolved) { return SubmissionResult.builder() - .userId(result.getUser().getId()) - .problemCategory(result.getProblem().getCategory().getDescription()) + .userId(result.getUserId()) + .problemCategory(result.getProblemCategoryDescription()) .isSolved(result.isCorrect()) .hasBeenSolved(hasBeenSolved) .build(); diff --git a/src/main/java/org/ezcode/codetest/domain/submission/model/entity/UserProblemResult.java b/src/main/java/org/ezcode/codetest/domain/submission/model/entity/UserProblemResult.java index 4c514321..9d9bd9f2 100644 --- a/src/main/java/org/ezcode/codetest/domain/submission/model/entity/UserProblemResult.java +++ b/src/main/java/org/ezcode/codetest/domain/submission/model/entity/UserProblemResult.java @@ -2,6 +2,7 @@ import org.ezcode.codetest.common.base.entity.BaseEntity; import org.ezcode.codetest.domain.problem.model.entity.Problem; +import org.ezcode.codetest.domain.problem.model.enums.Category; import org.ezcode.codetest.domain.user.model.entity.User; import jakarta.persistence.Column; @@ -48,4 +49,14 @@ public UserProblemResult(User user, Problem problem, boolean isCorrect) { public void updateResult(boolean isCorrect) { this.isCorrect = isCorrect; } + + public String getProblemCategoryDescription() { + + return this.problem.getCategory().getDescription(); + } + + public Long getUserId() { + + return this.user.getId(); + } } From 50236564fc6dcae33a1a508cb966e742a0056846 Mon Sep 17 00:00:00 2001 From: chat26666 Date: Wed, 25 Jun 2025 15:54:58 +0900 Subject: [PATCH 3/3] fix: bug --- .../codetest/domain/submission/model/SubmissionResult.java | 2 +- .../domain/submission/model/entity/UserProblemResult.java | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java b/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java index b6882a81..51f3fa3e 100644 --- a/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java +++ b/src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java @@ -18,7 +18,7 @@ public record SubmissionResult( ) { public static SubmissionResult from(UserProblemResult result, boolean hasBeenSolved) { return SubmissionResult.builder() - .userId(result.getUserId()) + .userId(result.getUser().getId()) .problemCategory(result.getProblemCategoryDescription()) .isSolved(result.isCorrect()) .hasBeenSolved(hasBeenSolved) diff --git a/src/main/java/org/ezcode/codetest/domain/submission/model/entity/UserProblemResult.java b/src/main/java/org/ezcode/codetest/domain/submission/model/entity/UserProblemResult.java index 9d9bd9f2..a6fff671 100644 --- a/src/main/java/org/ezcode/codetest/domain/submission/model/entity/UserProblemResult.java +++ b/src/main/java/org/ezcode/codetest/domain/submission/model/entity/UserProblemResult.java @@ -55,8 +55,4 @@ public String getProblemCategoryDescription() { return this.problem.getCategory().getDescription(); } - public Long getUserId() { - - return this.user.getId(); - } }