Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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);

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -28,7 +29,7 @@ public class SubmissionDomainService {
private final UserProblemResultRepository userProblemResultRepository;

@Transactional
public UserProblemResult finalizeSubmission(
public SubmissionResult finalizeSubmission(
SubmissionData submissionData,
SubmissionAggregator aggregator,
int passedCount) {
Expand All @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ public record GameLevelUpEvent(

Long userId,

boolean isProblemSolved,
boolean isSolved,

String problemCategory

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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());
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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));
}
}