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,23 +1,26 @@
package org.ezcode.codetest.application.submission.dto.event;

import org.ezcode.codetest.application.submission.model.SubmissionContext;
import org.ezcode.codetest.infrastructure.github.model.PushStatus;

public record GitPushStatusEvent(

String sessionKey,

String principalName,

PushStatus pushStatus

) {
public static GitPushStatusEvent started(String sessionKey) {
return new GitPushStatusEvent(sessionKey, PushStatus.STARTED);
public static GitPushStatusEvent started(SubmissionContext ctx) {
return new GitPushStatusEvent(ctx.getSessionKey(), ctx.getUserEmail(), PushStatus.STARTED);
}

public static GitPushStatusEvent succeeded(String sessionKey) {
return new GitPushStatusEvent(sessionKey, PushStatus.SUCCESS);
public static GitPushStatusEvent succeeded(SubmissionContext ctx) {
return new GitPushStatusEvent(ctx.getSessionKey(), ctx.getUserEmail(), PushStatus.SUCCESS);
}

public static GitPushStatusEvent failed(String sessionKey) {
return new GitPushStatusEvent(sessionKey, PushStatus.FAILED);
public static GitPushStatusEvent failed(SubmissionContext ctx) {
return new GitPushStatusEvent(ctx.getSessionKey(), ctx.getUserEmail(), PushStatus.FAILED);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ public SubmissionErrorEvent(String sessionKey, Throwable t) {
this(sessionKey, resolveCode(t));
}

private static SubmissionExceptionCode resolveCode(Throwable t) {
private static SubmissionExceptionCode resolveCode(Throwable t) {
if (t instanceof SubmissionException se) {
return (SubmissionExceptionCode) se.getResponseCode();
return (SubmissionExceptionCode)se.getResponseCode();
}
return SubmissionExceptionCode.UNKNOWN_ERROR;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
package org.ezcode.codetest.application.submission.dto.event;

import org.ezcode.codetest.application.submission.dto.event.payload.SubmissionFinalResultPayload;
import org.ezcode.codetest.application.submission.model.SubmissionContext;

public record SubmissionJudgingFinishedEvent(

String sessionKey,

String principalName,

SubmissionFinalResultPayload payload

) {
public static SubmissionJudgingFinishedEvent from(SubmissionContext ctx) {
return new SubmissionJudgingFinishedEvent(
ctx.getSessionKey(),
ctx.getUserEmail(),
ctx.toFinalResult()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
package org.ezcode.codetest.application.submission.dto.event;

import org.ezcode.codetest.application.submission.dto.event.payload.TestcaseResultPayload;
import org.ezcode.codetest.application.submission.model.SubmissionContext;

public record TestcaseEvaluatedEvent(

String sessionKey,

String principalName,

TestcaseResultPayload payload

) {
public static TestcaseEvaluatedEvent of(String sessionKey, TestcaseResultPayload payload) {
public static TestcaseEvaluatedEvent of(SubmissionContext ctx, TestcaseResultPayload payload) {
return new TestcaseEvaluatedEvent(
sessionKey,
ctx.getSessionKey(),
ctx.getUserEmail(),
payload
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@
import java.util.List;

import org.ezcode.codetest.application.submission.dto.event.payload.InitTestcaseListPayload;
import org.ezcode.codetest.application.submission.model.SubmissionContext;

public record TestcaseListInitializedEvent(

String sessionKey,

String principalName,

List<InitTestcaseListPayload> payload

) {
public static TestcaseListInitializedEvent from(String sessionKey, List<InitTestcaseListPayload> payload) {
return new TestcaseListInitializedEvent(sessionKey, payload);
public static TestcaseListInitializedEvent of(SubmissionContext ctx, List<InitTestcaseListPayload> payload) {
return new TestcaseListInitializedEvent(ctx.getSessionKey(), ctx.getUserEmail(), payload);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -157,4 +157,8 @@ public String getLanguageName() {
public String getLanguageVersion() {
return language.getVersion();
}

public String getUserEmail() {
return user.getEmail();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,16 @@ public void pushSolutionToRepo(SubmissionContext ctx) {
return;
}

eventService.publishGitPushStatus(GitPushStatusEvent.started(ctx.getSessionKey()));
eventService.publishGitPushStatus(GitPushStatusEvent.started(ctx));
UserGithubInfo info = userGithubService.getUserGithubInfoById(ctx.getUserId());

try {
String decryptedToken = aesUtil.decrypt(info.getGithubAccessToken());
gitHubClient.commitAndPushToRepo(GitHubPushRequest.of(ctx, info, decryptedToken));
eventService.publishGitPushStatus(GitPushStatusEvent.succeeded(ctx.getSessionKey()));
eventService.publishGitPushStatus(GitPushStatusEvent.succeeded(ctx));
} catch (Exception e) {
exceptionNotifier.notifyException("commitAndPush", e);
eventService.publishGitPushStatus(GitPushStatusEvent.failed(ctx.getSessionKey()));
eventService.publishGitPushStatus(GitPushStatusEvent.failed(ctx));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class JudgementService {

public void publishInitTestcases(SubmissionContext ctx) {
submissionEventService.publishInitTestcases(
new TestcaseListInitializedEvent(ctx.getSessionKey(), InitTestcaseListPayload.from(ctx))
TestcaseListInitializedEvent.of(ctx, InitTestcaseListPayload.from(ctx))
);
}

Expand Down Expand Up @@ -90,15 +90,13 @@ private void runTestcaseAsync(int seqId, SubmissionContext ctx) {
}

private void publishTestcaseUpdate(int seqId, SubmissionContext ctx, boolean isPassed, JudgeResult result) {
submissionEventService.publishTestcaseUpdate(new TestcaseEvaluatedEvent(
ctx.getSessionKey(), TestcaseResultPayload.fromEvaluation(seqId, isPassed, result))
submissionEventService.publishTestcaseUpdate(TestcaseEvaluatedEvent.of(
ctx, TestcaseResultPayload.fromEvaluation(seqId, isPassed, result))
);
}

private void publishFinalResult(SubmissionContext ctx){
submissionEventService.publishFinalResult(
new SubmissionJudgingFinishedEvent(ctx.getSessionKey(), ctx.toFinalResult())
);
submissionEventService.publishFinalResult(SubmissionJudgingFinishedEvent.from(ctx));
}

private void publishProblemSolve(SubmissionResult submissionResult) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package org.ezcode.codetest.application.submission.service;

import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

import org.ezcode.codetest.application.submission.aop.CodeReviewLock;
import org.ezcode.codetest.application.submission.dto.event.TestcaseListInitializedEvent;
import org.ezcode.codetest.application.submission.dto.event.payload.InitTestcaseListPayload;
import org.ezcode.codetest.application.submission.dto.request.review.CodeReviewRequest;
import org.ezcode.codetest.application.submission.dto.request.review.ReviewPayload;
import org.ezcode.codetest.application.submission.dto.response.review.CodeReviewResponse;
Expand All @@ -13,6 +17,7 @@
import org.ezcode.codetest.application.submission.port.ExceptionNotifier;
import org.ezcode.codetest.application.submission.port.LockManager;
import org.ezcode.codetest.application.submission.port.QueueProducer;
import org.ezcode.codetest.domain.problem.model.entity.Testcase;
import org.ezcode.codetest.domain.submission.exception.SubmissionException;
import org.ezcode.codetest.domain.submission.exception.code.SubmissionExceptionCode;
import org.ezcode.codetest.infrastructure.event.dto.submission.SubmissionMessage;
Expand All @@ -28,6 +33,7 @@
import org.ezcode.codetest.domain.user.model.entity.AuthUser;
import org.ezcode.codetest.domain.user.model.entity.User;
import org.ezcode.codetest.domain.user.service.UserDomainService;
import org.ezcode.codetest.infrastructure.event.dto.submission.response.InitTestcaseListResponse;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand Down Expand Up @@ -86,14 +92,6 @@ public void processSubmissionAsync(SubmissionMessage msg) {
}
}

private SubmissionContext createSubmissionContext(SubmissionMessage msg) {
User user = userDomainService.getUserById(msg.userId());
Language language = languageDomainService.getLanguage(msg.languageId());
ProblemInfo problemInfo = problemDomainService.getProblemInfo(msg.problemId());

return SubmissionContext.initialize(user, language, problemInfo, msg);
}

@Transactional(readOnly = true)
public List<GroupedSubmissionResponse> getSubmissions(AuthUser authUser) {

Expand All @@ -116,4 +114,12 @@ public CodeReviewResponse getCodeReview(Long problemId, CodeReviewRequest reques

return new CodeReviewResponse(reviewResult.reviewContent());
}

private SubmissionContext createSubmissionContext(SubmissionMessage msg) {
User user = userDomainService.getUserById(msg.userId());
Language language = languageDomainService.getLanguage(msg.languageId());
ProblemInfo problemInfo = problemDomainService.getProblemInfo(msg.problemId());

return SubmissionContext.initialize(user, language, problemInfo, msg);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public void configureMessageBroker(MessageBrokerRegistry registry) {
.setUserDestinationBroadcast("/topic/simp-user-registry")
.setUserRegistryBroadcast("/topic/simp-user-registry");

registry.setApplicationDestinationPrefixes("/chat");
registry.setApplicationDestinationPrefixes("/chat", "/app");
registry.setUserDestinationPrefix("/user");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,19 @@ public class SubmissionEventListener {
@EventListener
public void onTestcaseInit(TestcaseListInitializedEvent event) {
List<InitTestcaseListResponse> wsDtos = InitTestcaseListResponse.mapToList(event.payload());
messageService.sendInitTestcases(event.sessionKey(), wsDtos);
messageService.sendInitTestcases(event.sessionKey(), event.principalName(), wsDtos);
}

@EventListener
public void onTestcaseUpdate(TestcaseEvaluatedEvent event) {
JudgeResultResponse wsDto = JudgeResultResponse.from(event.payload());
messageService.sendTestcaseResultUpdate(event.sessionKey(), wsDto);
messageService.sendTestcaseResultUpdate(event.sessionKey(), event.principalName(), wsDto);
}

@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void onSubmissionFinished(SubmissionJudgingFinishedEvent event) {
SubmissionFinalResultResponse wsDto = SubmissionFinalResultResponse.from(event.payload());
messageService.sendFinalResult(event.sessionKey(), wsDto);
messageService.sendFinalResult(event.sessionKey(), event.principalName(), wsDto);
}

@EventListener
Expand All @@ -53,6 +53,6 @@ public void onSubmissionError(SubmissionErrorEvent event) {
@EventListener
public void onGitPushStatus(GitPushStatusEvent event) {
GitPushStatusResponse wsDto = new GitPushStatusResponse(event.pushStatus());
messageService.sendGitStatus(event.sessionKey(), wsDto);
messageService.sendGitStatus(event.sessionKey(), event.principalName(), wsDto);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@
import org.springframework.messaging.simp.SimpMessageType;

import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;

import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;
Expand All @@ -21,7 +26,7 @@ public class StompMessageService {

private final SimpMessagingTemplate messagingTemplate;

private static final String SUBMISSION_DEST_PREFIX = "/topic/submission/%s";
private static final String SUBMISSION_DEST_PREFIX = "/queue/submission/%s";

public <T> void handleChatRoomListLoad(T roomData, String principalName, String sessionId) {

Expand Down Expand Up @@ -55,41 +60,59 @@ public <T> void handleChatRoomHistoryLoad(T chatData, String principalName, Stri
);
}

public void sendInitTestcases(String sessionKey, List<InitTestcaseListResponse> dataList) {

messagingTemplate.convertAndSend(
public void sendInitTestcases(
String sessionKey,
String principalName,
List<InitTestcaseListResponse> dataList
) {
messagingTemplate.convertAndSendToUser(
principalName,
SUBMISSION_DEST_PREFIX.formatted(sessionKey) + "/init",
dataList
);
}

public void sendTestcaseResultUpdate(String sessionKey, JudgeResultResponse data) {

messagingTemplate.convertAndSend(
public void sendTestcaseResultUpdate(
String sessionKey,
String principalName,
JudgeResultResponse data
) {
messagingTemplate.convertAndSendToUser(
principalName,
SUBMISSION_DEST_PREFIX.formatted(sessionKey) + "/case",
data
);
}

public void sendFinalResult(String sessionKey, SubmissionFinalResultResponse data) {

messagingTemplate.convertAndSend(
public void sendFinalResult(
String sessionKey,
String principalName,
SubmissionFinalResultResponse data
) {
messagingTemplate.convertAndSendToUser(
principalName,
SUBMISSION_DEST_PREFIX.formatted(sessionKey) + "/final",
data
);
}

public void sendError(String sessionKey, ErrorWsResponse data) {

public void sendError(
String sessionKey,
ErrorWsResponse data
) {
messagingTemplate.convertAndSend(
SUBMISSION_DEST_PREFIX.formatted(sessionKey) + "/error",
data
);
}

public void sendGitStatus(String sessionKey, GitPushStatusResponse data) {

messagingTemplate.convertAndSend(
public void sendGitStatus(
String sessionKey,
String principalName,
GitPushStatusResponse data
) {
messagingTemplate.convertAndSendToUser(
principalName,
SUBMISSION_DEST_PREFIX.formatted(sessionKey) + "/git-status",
data
);
Expand All @@ -109,5 +132,4 @@ public <T> void handleChatRoomParticipantCountChange(T roomData) {

messagingTemplate.convertAndSend("/topic/chatrooms", roomData);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,15 @@ public class SubmissionController {

반환된 sessionKey를 사용해 다음 경로로 구독하세요.

• /topic/submission/{sessionKey}/init
• /user/queue/submission/{sessionKey}/init

• /topic/submission/{sessionKey}/case
• /user/queue/submission/{sessionKey}/case

• /topic/submission/{sessionKey}/final
• /user/queue/submission/{sessionKey}/final

• /topic/submission/{sessionKey}/error

• /topic/submission/{sessionKey}/git-status
• /user/queue/submission/{sessionKey}/git-status
"""
)
@ApiResponses({
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/templates/submit-test.html
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@
}

// (B) sessionKey별 채널 구독
const base = `/topic/submission/${sessionKey}`;
const base = `/user/queue/submission/${sessionKey}`;
stompClient.subscribe(`${base}/init`, msg => handleInit(JSON.parse(msg.body)));
stompClient.subscribe(`${base}/case`, msg => handleCase(JSON.parse(msg.body)));
stompClient.subscribe(`${base}/final`, msg => handleFinal(JSON.parse(msg.body)));
Expand Down
Loading