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..51f3fa3e --- /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.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..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 @@ -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,10 @@ public UserProblemResult(User user, Problem problem, boolean isCorrect) { public void updateResult(boolean isCorrect) { this.isCorrect = isCorrect; } + + public String getProblemCategoryDescription() { + + return this.problem.getCategory().getDescription(); + } + } 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)); } }