Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

임시 업데이트 (이후에 삭제 필요) #57

Merged
merged 1 commit into from
Sep 16, 2024
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
Expand Up @@ -4,48 +4,51 @@
import com.soundbar91.retrospect_project.result.controller.dto.ResponseResult;
import com.soundbar91.retrospect_project.result.entity.keyInstance.Grade;
import com.soundbar91.retrospect_project.result.entity.keyInstance.Language;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "결과 API")
public interface ResultApi {

@Operation(summary = "코드 제출", description = "제출 언어의 경우 CPP, JAVA, PYTHON 중 하나의 값을 입력해야 합니다.")
@ApiResponse(responseCode = "200", description = "코드 제출 성공", content = @Content(mediaType = "application/json"))
@PostMapping("/problem/{problemId}/result")
ResponseEntity<ResponseResult> createResult(
@Valid @RequestBody RequestSubmit requestCreateResult,
@PathVariable(value = "problemId") Long problemId,
HttpServletRequest httpServletRequest
@Valid @RequestBody RequestSubmit requestCreateResult,
@PathVariable(value = "problemId") Long problemId,
HttpServletRequest httpServletRequest
);

@Operation(summary = "결과 조회", description = """
CORRECT: 정답, INCORRECT: 오답, COMPILER_ERROR: 컴파일 에러\s
RUNTIME_ERROR: 런타임 에러, TIME_ACCESS: 시간 초과, MEMORY_ACCESS: 메모리 초과\s
결과는 AND 연산입니다.
""")
CORRECT: 정답, INCORRECT: 오답, COMPILER_ERROR: 컴파일 에러\s
RUNTIME_ERROR: 런타임 에러, TIME_ACCESS: 시간 초과, MEMORY_ACCESS: 메모리 초과\s
결과는 AND 연산입니다.
""")
@ApiResponse(responseCode = "200", description = "결과 조회 성공", content = @Content(mediaType = "application/json"))
@GetMapping("/result/{resultId}")
ResponseEntity<ResponseResult> getResult(
@PathVariable(value = "resultId") Long resultId
@PathVariable(value = "resultId") Long resultId,
HttpServletRequest httpServletRequest
);

@Operation(summary = "결과 리스트 조회")
@ApiResponse(responseCode = "200", description = "결과 리스트 조회 성공", content = @Content(mediaType = "application/json"))
@GetMapping("/results")
ResponseEntity<List<ResponseResult>> getResults(
@RequestParam(value = "grade", required = false) Grade grade,
@RequestParam(value = "language", required = false) Language language,
@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "problemId", required = false) Long problemId
@RequestParam(value = "grade", required = false) Grade grade,
@RequestParam(value = "language", required = false) Language language,
@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "problemId", required = false) Long problemId
);

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import com.soundbar91.retrospect_project.result.entity.keyInstance.Grade;
import com.soundbar91.retrospect_project.result.entity.keyInstance.Language;
import com.soundbar91.retrospect_project.result.service.ResultService;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

Expand All @@ -21,28 +23,29 @@ public class ResultController implements ResultApi {

@PostMapping("/problem/{problemId}/result")
public ResponseEntity<ResponseResult> createResult(
@Valid @RequestBody RequestSubmit requestCreateResult,
@PathVariable(value = "problemId") Long problemId,
HttpServletRequest httpServletRequest
@Valid @RequestBody RequestSubmit requestCreateResult,
@PathVariable(value = "problemId") Long problemId,
HttpServletRequest httpServletRequest
) {
ResponseResult result = resultService.createResult(requestCreateResult, httpServletRequest, problemId);
return ResponseEntity.ok(result);
}

@GetMapping("/result/{resultId}")
public ResponseEntity<ResponseResult> getResult(
@PathVariable(value = "resultId") Long resultId
@PathVariable(value = "resultId") Long resultId,
HttpServletRequest httpServletRequest
) {
ResponseResult result = resultService.getResult(resultId);
ResponseResult result = resultService.getResult(resultId, httpServletRequest);
return ResponseEntity.ok(result);
}

@GetMapping("/results")
public ResponseEntity<List<ResponseResult>> getResults(
@RequestParam(value = "grade", required = false) Grade grade,
@RequestParam(value = "language", required = false) Language language,
@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "problemId", required = false) Long problemId
@RequestParam(value = "grade", required = false) Grade grade,
@RequestParam(value = "language", required = false) Language language,
@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "problemId", required = false) Long problemId
) {
List<ResponseResult> results = resultService.getResults(grade, language, username, problemId);
return ResponseEntity.ok(results);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,41 @@
package com.soundbar91.retrospect_project.result.service;

import static com.soundbar91.retrospect_project.global.exception.errorCode.ProblemErrorCode.NOT_FOUND_PROBLEM;
import static com.soundbar91.retrospect_project.global.exception.errorCode.ResultErrorCode.NOT_FOUND_RESULT;
import static com.soundbar91.retrospect_project.global.exception.errorCode.UserErrorCode.NOT_FOUND_USER;
import static com.soundbar91.retrospect_project.global.exception.errorCode.UserErrorCode.NOT_PERMISSION;
import static com.soundbar91.retrospect_project.result.entity.keyInstance.Grade.CORRECT;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

import com.soundbar91.retrospect_project.global.exception.ApplicationException;
import com.soundbar91.retrospect_project.problem.entity.Problem;
import com.soundbar91.retrospect_project.problem.repository.ProblemRepository;
import com.soundbar91.retrospect_project.result.controller.dto.RequestSubmit;
import com.soundbar91.retrospect_project.result.controller.dto.ResponseResult;
import com.soundbar91.retrospect_project.problem.entity.Problem;
import com.soundbar91.retrospect_project.result.entity.Result;
import com.soundbar91.retrospect_project.user.entity.User;
import com.soundbar91.retrospect_project.result.entity.keyInstance.Grade;
import com.soundbar91.retrospect_project.result.entity.keyInstance.Language;
import com.soundbar91.retrospect_project.global.exception.ApplicationException;
import com.soundbar91.retrospect_project.problem.repository.ProblemRepository;
import com.soundbar91.retrospect_project.result.repository.ResultRepository;
import com.soundbar91.retrospect_project.user.entity.User;
import com.soundbar91.retrospect_project.user.repository.UserRepository;

import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.soundbar91.retrospect_project.result.entity.keyInstance.Grade.CORRECT;
import static com.soundbar91.retrospect_project.global.exception.errorCode.ProblemErrorCode.NOT_FOUND_PROBLEM;
import static com.soundbar91.retrospect_project.global.exception.errorCode.ResultErrorCode.NOT_FOUND_RESULT;
import static com.soundbar91.retrospect_project.global.exception.errorCode.UserErrorCode.NOT_FOUND_USER;

@Service
@RequiredArgsConstructor
Expand All @@ -48,16 +51,16 @@ public class ResultService {

@Transactional
public ResponseResult createResult(
RequestSubmit requestCreateResult,
HttpServletRequest httpServletRequest,
Long problemId
RequestSubmit requestCreateResult,
HttpServletRequest httpServletRequest,
Long problemId
) {
Long userId = (Long) httpServletRequest.getSession().getAttribute("userId");
Long userId = (Long)httpServletRequest.getSession().getAttribute("userId");
User user = userRepository.findById(userId)
.orElseThrow(() -> new ApplicationException(NOT_FOUND_USER));
.orElseThrow(() -> new ApplicationException(NOT_FOUND_USER));

Problem problem = problemRepository.findById(problemId)
.orElseThrow(() -> new ApplicationException(NOT_FOUND_PROBLEM));
.orElseThrow(() -> new ApplicationException(NOT_FOUND_PROBLEM));

HttpEntity<Map<String, Object>> requestMessage = createRequestMessage(requestCreateResult, problem, userId);
ResponseEntity<Map> response = callApiToGrading(requestMessage);
Expand All @@ -68,21 +71,28 @@ public ResponseResult createResult(
return ResponseResult.from(resultRepository.save(result));
}

public ResponseResult getResult(Long resultId) {
public ResponseResult getResult(
Long resultId, HttpServletRequest httpServletRequest
) {
String username = (String)httpServletRequest.getSession().getAttribute("username");
if (!username.equals("choije0106"))
throw new ApplicationException(NOT_PERMISSION);

Result result = resultRepository.findById(resultId)
.orElseThrow(() -> new ApplicationException(NOT_FOUND_RESULT));
.orElseThrow(() -> new ApplicationException(NOT_FOUND_RESULT));

return ResponseResult.from(result);
}

public List<ResponseResult> getResults(
Grade grade, Language language,
String username, Long problemId
Grade grade, Language language,
String username, Long problemId
) {
User user = username != null ?
userRepository.findByUsername(username).orElseThrow(() -> new ApplicationException(NOT_FOUND_USER)) : null;
userRepository.findByUsername(username).orElseThrow(() -> new ApplicationException(NOT_FOUND_USER)) : null;

Problem problem = problemId != null ?
problemRepository.findById(problemId).orElseThrow(() -> new ApplicationException(NOT_FOUND_PROBLEM)) : null;
problemRepository.findById(problemId).orElseThrow(() -> new ApplicationException(NOT_FOUND_PROBLEM)) : null;

StringBuilder jpql = createJpql(grade, language, user, problem);
TypedQuery<Result> query = entityManager.createQuery(jpql.toString(), Result.class);
Expand All @@ -91,12 +101,14 @@ public List<ResponseResult> getResults(
return query.getResultList().stream().map(ResponseResult::from).toList();
}

private HttpEntity<Map<String, Object>> createRequestMessage(RequestSubmit requestCreateResult, Problem problem, Long userId) {
private HttpEntity<Map<String, Object>> createRequestMessage(RequestSubmit requestCreateResult, Problem problem,
Long userId) {
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("source_code", requestCreateResult.code());
requestBody.put("language", requestCreateResult.language());
requestBody.put("memory_limit", problem.getMemory());
requestBody.put("time_limit", problem.getRuntime().get(String.valueOf(requestCreateResult.language()).toLowerCase()));
requestBody.put("time_limit",
problem.getRuntime().get(String.valueOf(requestCreateResult.language()).toLowerCase()));
requestBody.put("problem_id", problem.getId());
requestBody.put("user_id", userId);
HttpHeaders headers = new HttpHeaders();
Expand All @@ -109,36 +121,47 @@ private ResponseEntity<Map> callApiToGrading(HttpEntity<Map<String, Object>> ent
RestTemplate restTemplate = new RestTemplate();

return restTemplate.exchange(
gradingServerUrl + "/judge",
HttpMethod.POST,
entity,
Map.class
gradingServerUrl + "/judge",
HttpMethod.POST,
entity,
Map.class
);
}

private StringBuilder createJpql(Grade grade, Language language, User user, Problem problem) {
StringBuilder jpql = new StringBuilder("select r from Result r");
List<String> criteria = new ArrayList<>();

if (grade != null) criteria.add(" r.grade = :grade");
if (language != null) criteria.add(" r.language = :language");
if (user != null) criteria.add(" r.user = :user");
if (problem != null) criteria.add(" r.problem = :problem");
if (!criteria.isEmpty()) jpql.append(" where ");
if (grade != null)
criteria.add(" r.grade = :grade");
if (language != null)
criteria.add(" r.language = :language");
if (user != null)
criteria.add(" r.user = :user");
if (problem != null)
criteria.add(" r.problem = :problem");
if (!criteria.isEmpty())
jpql.append(" where ");

for (int i = 0; i < criteria.size(); i++) {
if (i > 0) jpql.append(" and ");
if (i > 0)
jpql.append(" and ");
jpql.append(criteria.get(i));
}

return jpql;
}

private void queryParameterBinding(Grade grade, Language language, TypedQuery<Result> query, User user, Problem problem) {
if (grade != null) query.setParameter("grade", grade);
if (language != null) query.setParameter("language", language);
if (user != null) query.setParameter("user", user);
if (problem != null) query.setParameter("problem", problem);
private void queryParameterBinding(Grade grade, Language language, TypedQuery<Result> query, User user,
Problem problem) {
if (grade != null)
query.setParameter("grade", grade);
if (language != null)
query.setParameter("language", language);
if (user != null)
query.setParameter("user", user);
if (problem != null)
query.setParameter("problem", problem);
}

private void checkAnswerAndUpdateAssociateInfo(Result result, Problem problem, User user) {
Expand All @@ -148,7 +171,8 @@ private void checkAnswerAndUpdateAssociateInfo(Result result, Problem problem, U
problem.updateSubmitInfo(answer);
problemRepository.flush();

if (results.isEmpty()) user.solveProblem(problem.getLevel());
if (results.isEmpty())
user.solveProblem(problem.getLevel());
}

}
2 changes: 1 addition & 1 deletion src/main/resources/templates/submit.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ <h1 class="mb-4">코드 제출</h1>
<div class="form-group">
<label for="language">언어 선택</label>
<select id="language" name="language" class="form-control">
<option value="cpp">C++</option>
<option value="java">Java</option>
<option value="python">Python</option>
<option value="cpp">C++</option>
</select>
</div>
<div class="form-group">
Expand Down
Loading