From 71b36a86a4d11cc9d13b412836c9f1bb1223fd6d Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 20 Jun 2026 20:45:16 +0300 Subject: [PATCH 01/15] add get problem controller method --- .../backend/MatchRoom/MatchController.java | 47 +++++++++++++++++++ .../judge/client/Artefactik0Client.java | 19 ++++++++ .../judge/problem/ProblemResponseDTO.java | 19 ++++++++ .../backend/judge/problem/ProblemService.java | 5 +- 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/codzilla/backend/MatchRoom/MatchController.java create mode 100644 src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java diff --git a/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java b/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java new file mode 100644 index 0000000..5e6f546 --- /dev/null +++ b/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java @@ -0,0 +1,47 @@ +package com.codzilla.backend.MatchRoom; + + +import com.codzilla.backend.User.User; +import com.codzilla.backend.judge.problem.ProblemService; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.UUID; + +@Controller +@RequestMapping("/match") +public class MatchController { + + private final MatchService matchService; + private final ProblemService problemService; + + public MatchController(MatchService matchService, ProblemService problemService) { + this.matchService = matchService; + this.problemService = problemService; + } + + @GetMapping("/{matchId}/problem") + ResponseEntity getMatchProblem( + @AuthenticationPrincipal User user, + @PathVariable UUID matchId) { + var match = matchService.getMatchById(matchId); + + if (match == null) { + return ResponseEntity.notFound().build(); + } + if (!(match.getFirstUserId().equals(user.getId()) || match.getSecondUserId().equals(user.getId()))) { + return ResponseEntity.status(HttpStatusCode.valueOf(404)).build(); + } + try { + var artefacts = problemService.getArtefactsOfProblem(match.getProblem().getId()); + return ResponseEntity.ok(artefacts); + } catch (RuntimeException e) { + return ResponseEntity.notFound().build(); + } + } +} diff --git a/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java b/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java index 4f48471..6cfc5ce 100644 --- a/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java +++ b/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java @@ -1,5 +1,7 @@ package com.codzilla.backend.judge.client; +import com.codzilla.backend.judge.problem.ProblemResponseDTO; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; @@ -46,6 +48,23 @@ public Long createProblem(CreateProblemRequest request) { } } + public ProblemResponseDTO getProblem(Long problemId) { + try { + String raw = restClient.post() + .uri("/api/problems/{}", problemId) + .contentType(MediaType.APPLICATION_JSON) + .retrieve() + .body(String.class); + + ProblemResponseDTO + response = objectMapper.readValue(raw, ProblemResponseDTO.class); + log.info("Artefactik0 get problem id={}", response.getId()); + return response; + } catch (Exception e) { + throw new RuntimeException("Failed to get problem from Artefactik0", e); + } + } + public List getTests(Long problemId) { try { diff --git a/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java b/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java new file mode 100644 index 0000000..11d7d89 --- /dev/null +++ b/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java @@ -0,0 +1,19 @@ +package com.codzilla.backend.judge.problem; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class ProblemResponseDTO { + + private Long id; + private String name; + private Integer timeLimit; + private Integer memoryLimit; + private boolean hasStatement; + private int testCount; + private LocalDateTime createdAt; + private String complexity; + private String taskType; +} diff --git a/src/main/java/com/codzilla/backend/judge/problem/ProblemService.java b/src/main/java/com/codzilla/backend/judge/problem/ProblemService.java index b2cd7f2..f5cb2cf 100644 --- a/src/main/java/com/codzilla/backend/judge/problem/ProblemService.java +++ b/src/main/java/com/codzilla/backend/judge/problem/ProblemService.java @@ -13,7 +13,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpClientErrorException; import java.util.*; @@ -205,4 +204,8 @@ public Problem getOrCreateRandomSqlProblem(String level) { } throw new RuntimeException("No SQL tasks found at any level (EASY, MEDIUM, HARD)"); } + + public ProblemResponseDTO getArtefactsOfProblem(Long problemId) { + return artefactik0Client.getProblem(problemId); + } } From 87c8b43e0d013e55ffa59ca79d57e0ad524ebe8b Mon Sep 17 00:00:00 2001 From: toximu Date: Fri, 26 Jun 2026 13:54:38 +0300 Subject: [PATCH 02/15] add getting statement from a0 and match options controller --- .../backend/MatchRoom/MatchController.java | 18 ++- .../backend/MatchRoom/MatchOptions.java | 10 ++ .../judge/client/Artefactik0Client.java | 145 ++++++++++++++---- .../backend/judge/problem/ProblemService.java | 4 + 4 files changed, 136 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/codzilla/backend/MatchRoom/MatchOptions.java diff --git a/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java b/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java index 5e6f546..a1662d5 100644 --- a/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java +++ b/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java @@ -1,6 +1,7 @@ package com.codzilla.backend.MatchRoom; +import com.codzilla.backend.PreMatch.model.Category; import com.codzilla.backend.User.User; import com.codzilla.backend.judge.problem.ProblemService; import org.springframework.http.HttpStatusCode; @@ -25,23 +26,24 @@ public MatchController(MatchService matchService, ProblemService problemService) this.problemService = problemService; } - @GetMapping("/{matchId}/problem") - ResponseEntity getMatchProblem( - @AuthenticationPrincipal User user, - @PathVariable UUID matchId) { + @GetMapping("/{matchId}/options") + ResponseEntity getMatchOptions(@AuthenticationPrincipal User user, UUID matchId) { var match = matchService.getMatchById(matchId); - if (match == null) { return ResponseEntity.notFound().build(); } - if (!(match.getFirstUserId().equals(user.getId()) || match.getSecondUserId().equals(user.getId()))) { + if (!(match.getFirstUserId().equals(user.getId()) || + match.getSecondUserId().equals(user.getId()))) { return ResponseEntity.status(HttpStatusCode.valueOf(404)).build(); } try { - var artefacts = problemService.getArtefactsOfProblem(match.getProblem().getId()); - return ResponseEntity.ok(artefacts); + var statement = problemService.getStatementOfProblem(match.getProblem().getId()); + var options = match.getOptions(); + var response = new MatchOptions(statement, options.get(Category.Language), options.get(Category.ProblemType), options.get(Category.ProblemLevel)); + return ResponseEntity.ok(response); } catch (RuntimeException e) { return ResponseEntity.notFound().build(); } + } } diff --git a/src/main/java/com/codzilla/backend/MatchRoom/MatchOptions.java b/src/main/java/com/codzilla/backend/MatchRoom/MatchOptions.java new file mode 100644 index 0000000..3595aac --- /dev/null +++ b/src/main/java/com/codzilla/backend/MatchRoom/MatchOptions.java @@ -0,0 +1,10 @@ +package com.codzilla.backend.MatchRoom; + + +public record MatchOptions( + String statement, + String language, + String problemType, + String problemLevel +) { +} diff --git a/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java b/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java index 6cfc5ce..670f6da 100644 --- a/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java +++ b/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java @@ -24,85 +24,164 @@ public class Artefactik0Client { public Artefactik0Client(@Value("${artefactik0.base-url}") String baseUrl) { this.restClient = RestClient.builder() - .baseUrl(baseUrl) - .defaultHeader("Accept", "application/json") - .defaultHeader("Content-Type", "application/json") - .build(); + .baseUrl(baseUrl) + .defaultHeader( + "Accept", + "application/json" + ) + .defaultHeader( + "Content-Type", + "application/json" + ) + .build(); } public Long createProblem(CreateProblemRequest request) { try { String body = objectMapper.writeValueAsString(request); String raw = restClient.post() - .uri("/api/problems") - .contentType(MediaType.APPLICATION_JSON) - .body(body) - .retrieve() - .body(String.class); - - ProblemResponse response = objectMapper.readValue(raw, ProblemResponse.class); - log.info("Artefactik0 created problem id={}", response.getId()); + .uri("/api/problems") + .contentType(MediaType.APPLICATION_JSON) + .body(body) + .retrieve() + .body(String.class); + + ProblemResponse response = objectMapper.readValue( + raw, + ProblemResponse.class + ); + log.info( + "Artefactik0 created problem id={}", + response.getId() + ); return response.getId(); } catch (Exception e) { - throw new RuntimeException("Failed to create problem in Artefactik0", e); + throw new RuntimeException( + "Failed to create problem in Artefactik0", + e + ); } } public ProblemResponseDTO getProblem(Long problemId) { try { String raw = restClient.post() - .uri("/api/problems/{}", problemId) + .uri( + "/api/problems/{}", + problemId + ) .contentType(MediaType.APPLICATION_JSON) .retrieve() .body(String.class); ProblemResponseDTO - response = objectMapper.readValue(raw, ProblemResponseDTO.class); - log.info("Artefactik0 get problem id={}", response.getId()); + response = objectMapper.readValue( + raw, + ProblemResponseDTO.class + ); + log.info( + "Artefactik0 get problem id={}", + response.getId() + ); + return response; + } catch (Exception e) { + throw new RuntimeException( + "Failed to get problem from Artefactik0", + e + ); + } + } + + public String getStatement(Long problemId) { + try { + String raw = restClient.post() + .uri( + "/api/problems/{}/statement", + problemId + ) + .contentType(MediaType.APPLICATION_JSON) + .retrieve() + .body(String.class); + + String + response = objectMapper.readValue( + raw, + String.class + ); + log.info( + "Artefactik0 get statement {}", + response + ); return response; } catch (Exception e) { - throw new RuntimeException("Failed to get problem from Artefactik0", e); + throw new RuntimeException( + "Failed to get statement from Artefactik0", + e + ); } } + public List getTests(Long problemId) { try { List tests = restClient.get() - .uri("/api/problems/" + problemId + "/tests") - .retrieve() - .body(new ParameterizedTypeReference>() {}); + .uri("/api/problems/" + problemId + "/tests") + .retrieve() + .body(new ParameterizedTypeReference>() { + }); if (tests == null) { - throw new RuntimeException("No tests returned from Artefactik0 for problem " + problemId); + throw new RuntimeException( + "No tests returned from Artefactik0 for problem " + problemId); } - log.info("Artefactik0 returned {} tests for problem {}", tests.size(), problemId); + log.info( + "Artefactik0 returned {} tests for problem {}", + tests.size(), + problemId + ); return tests; } catch (Exception e) { - throw new RuntimeException("Failed to fetch tests from Artefactik0 for problem " + problemId, e); + throw new RuntimeException( + "Failed to fetch tests from Artefactik0 for problem " + problemId, + e + ); } } /** * Получить случайную задачу из Artefactik0 по типу и сложности. - * @param type ALGORITHM, DATA_STRUCTURES, MATH (пока заглушка -> ALGORITHM) - * @param level EASY, MEDIUM, HARD + * + * @param type ALGORITHM, DATA_STRUCTURES, MATH (пока заглушка -> ALGORITHM) + * @param level EASY, MEDIUM, HARD */ public RandomProblemResponse getRandomProblem(String type, String level) { try { String uri = UriComponentsBuilder.fromPath("/api/problems/random") - .queryParam("type", type.toUpperCase()) - .queryParam("complexity", level.toUpperCase()) - .build().toString(); + .queryParam( + "type", + type.toUpperCase() + ) + .queryParam( + "complexity", + level.toUpperCase() + ) + .build().toString(); String raw = restClient.get() - .uri(uri) - .retrieve() - .body(String.class); - return objectMapper.readValue(raw, RandomProblemResponse.class); + .uri(uri) + .retrieve() + .body(String.class); + return objectMapper.readValue( + raw, + RandomProblemResponse.class + ); } catch (Exception e) { - throw new RuntimeException("Failed to fetch random problem from Artefactik0", e); + throw new RuntimeException( + "Failed to fetch random problem from Artefactik0", + e + ); } } diff --git a/src/main/java/com/codzilla/backend/judge/problem/ProblemService.java b/src/main/java/com/codzilla/backend/judge/problem/ProblemService.java index f5cb2cf..16a4c5a 100644 --- a/src/main/java/com/codzilla/backend/judge/problem/ProblemService.java +++ b/src/main/java/com/codzilla/backend/judge/problem/ProblemService.java @@ -208,4 +208,8 @@ public Problem getOrCreateRandomSqlProblem(String level) { public ProblemResponseDTO getArtefactsOfProblem(Long problemId) { return artefactik0Client.getProblem(problemId); } + + public String getStatementOfProblem(Long problemId) { + return artefactik0Client.getStatement(problemId); + } } From 7e2c007439baef3084b933685fd8f992a56d4676 Mon Sep 17 00:00:00 2001 From: toximu Date: Fri, 26 Jun 2026 23:42:37 +0300 Subject: [PATCH 03/15] fix get request --- .../backend/judge/client/Artefactik0Client.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java b/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java index 670f6da..56837de 100644 --- a/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java +++ b/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java @@ -65,12 +65,11 @@ public Long createProblem(CreateProblemRequest request) { public ProblemResponseDTO getProblem(Long problemId) { try { - String raw = restClient.post() + String raw = restClient.get() .uri( "/api/problems/{}", problemId ) - .contentType(MediaType.APPLICATION_JSON) .retrieve() .body(String.class); @@ -94,25 +93,19 @@ public ProblemResponseDTO getProblem(Long problemId) { public String getStatement(Long problemId) { try { - String raw = restClient.post() + String raw = restClient.get() .uri( "/api/problems/{}/statement", problemId ) - .contentType(MediaType.APPLICATION_JSON) .retrieve() .body(String.class); - String - response = objectMapper.readValue( - raw, - String.class - ); log.info( "Artefactik0 get statement {}", - response + raw ); - return response; + return raw; } catch (Exception e) { throw new RuntimeException( "Failed to get statement from Artefactik0", From 69d471a7986d9f8c8fc082e300e3633f1f054d7b Mon Sep 17 00:00:00 2001 From: toximu Date: Fri, 26 Jun 2026 23:46:42 +0300 Subject: [PATCH 04/15] fix controller --- .../java/com/codzilla/backend/MatchRoom/MatchController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java b/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java index a1662d5..26aa55f 100644 --- a/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java +++ b/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java @@ -27,7 +27,7 @@ public MatchController(MatchService matchService, ProblemService problemService) } @GetMapping("/{matchId}/options") - ResponseEntity getMatchOptions(@AuthenticationPrincipal User user, UUID matchId) { + ResponseEntity getMatchOptions(@AuthenticationPrincipal User user, @PathVariable UUID matchId) { var match = matchService.getMatchById(matchId); if (match == null) { return ResponseEntity.notFound().build(); From 3bd721adf57ea263328077c9ff0f8b593ee84e74 Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 00:35:38 +0300 Subject: [PATCH 05/15] fix client --- .../codzilla/backend/judge/client/Artefactik0Client.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java b/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java index 56837de..a2527b3 100644 --- a/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java +++ b/src/main/java/com/codzilla/backend/judge/client/Artefactik0Client.java @@ -67,8 +67,7 @@ public ProblemResponseDTO getProblem(Long problemId) { try { String raw = restClient.get() .uri( - "/api/problems/{}", - problemId + "/api/problems/" + problemId ) .retrieve() .body(String.class); @@ -95,8 +94,7 @@ public String getStatement(Long problemId) { try { String raw = restClient.get() .uri( - "/api/problems/{}/statement", - problemId + "/api/problems/" + problemId + "/statement" ) .retrieve() .body(String.class); From 990f1811e940721100426e597556028adf03eb32 Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 16:45:20 +0300 Subject: [PATCH 06/15] fix draft sesion order --- .../codzilla/backend/MatchRoom/MatchController.java | 3 ++- .../codzilla/backend/MatchRoom/MatchOptions.java | 1 + .../codzilla/backend/MatchRoom/MatchService.java | 2 +- .../PreMatch/DraftSession/DraftSessionConfig.java | 13 ++++++------- .../PreMatch/DraftSession/DraftSessionService.java | 2 +- .../codzilla/backend/PreMatch/model/Language.java | 1 - 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java b/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java index 26aa55f..591342e 100644 --- a/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java +++ b/src/main/java/com/codzilla/backend/MatchRoom/MatchController.java @@ -38,8 +38,9 @@ ResponseEntity getMatchOptions(@AuthenticationPrincipal User user, @PathVaria } try { var statement = problemService.getStatementOfProblem(match.getProblem().getId()); + var problem = problemService.getArtefactsOfProblem(match.getProblem().getId()); var options = match.getOptions(); - var response = new MatchOptions(statement, options.get(Category.Language), options.get(Category.ProblemType), options.get(Category.ProblemLevel)); + var response = new MatchOptions(problem.getName(), statement, options.get(Category.Language), options.get(Category.ProblemType), options.get(Category.ProblemLevel)); return ResponseEntity.ok(response); } catch (RuntimeException e) { return ResponseEntity.notFound().build(); diff --git a/src/main/java/com/codzilla/backend/MatchRoom/MatchOptions.java b/src/main/java/com/codzilla/backend/MatchRoom/MatchOptions.java index 3595aac..46b47f9 100644 --- a/src/main/java/com/codzilla/backend/MatchRoom/MatchOptions.java +++ b/src/main/java/com/codzilla/backend/MatchRoom/MatchOptions.java @@ -2,6 +2,7 @@ public record MatchOptions( + String title, String statement, String language, String problemType, diff --git a/src/main/java/com/codzilla/backend/MatchRoom/MatchService.java b/src/main/java/com/codzilla/backend/MatchRoom/MatchService.java index 59d7ee6..265f84b 100644 --- a/src/main/java/com/codzilla/backend/MatchRoom/MatchService.java +++ b/src/main/java/com/codzilla/backend/MatchRoom/MatchService.java @@ -95,7 +95,7 @@ public Problem pickProblemOfOptions(Map options) { log.info("Pick problem of options: language={}, type={}, level={}", language, problemType, problemLevel); - if (language != null && language.equalsIgnoreCase(Language.SQL.name())) { + if (language != null) { log.info("Choosing SQL problem"); Problem sqlProblem = problemService.getOrCreateRandomSqlProblem(problemLevel); log.info("Selected SQL problem: id={}, type={}", sqlProblem.getId(), sqlProblem.getType()); diff --git a/src/main/java/com/codzilla/backend/PreMatch/DraftSession/DraftSessionConfig.java b/src/main/java/com/codzilla/backend/PreMatch/DraftSession/DraftSessionConfig.java index 874b6a0..5872148 100644 --- a/src/main/java/com/codzilla/backend/PreMatch/DraftSession/DraftSessionConfig.java +++ b/src/main/java/com/codzilla/backend/PreMatch/DraftSession/DraftSessionConfig.java @@ -22,19 +22,18 @@ public ThreadPoolTaskScheduler threadPoolTaskScheduler() { public Map categorySequence() { return Map.of( Language.PY.name(), - Category.ProblemType, + Category.ProblemLevel, Language.CPP.name(), - Category.ProblemType, + Category.ProblemLevel, Language.JAVA.name(), - Category.ProblemType, - Language.SQL.name(), Category.ProblemLevel, - ProblemType.ALGORITHM.name(), - Category.ProblemLevel, + Category.Language, ProblemType.MATH.name(), - Category.ProblemLevel, + Category.Language, ProblemType.DATA_STRUCTURES.name(), + Category.Language, + ProblemType.SQL.name(), Category.ProblemLevel ); } diff --git a/src/main/java/com/codzilla/backend/PreMatch/DraftSession/DraftSessionService.java b/src/main/java/com/codzilla/backend/PreMatch/DraftSession/DraftSessionService.java index f97a538..d059bde 100644 --- a/src/main/java/com/codzilla/backend/PreMatch/DraftSession/DraftSessionService.java +++ b/src/main/java/com/codzilla/backend/PreMatch/DraftSession/DraftSessionService.java @@ -144,7 +144,7 @@ public DraftSession startDraftSession(UUID matchId, UUID firstUserId, UUID secon matchId, firstUserId, secondUserId, - Category.Language + Category.ProblemType ); draftSessionRepository.save(draftSession); startTimer(draftSession.getId()); diff --git a/src/main/java/com/codzilla/backend/PreMatch/model/Language.java b/src/main/java/com/codzilla/backend/PreMatch/model/Language.java index 258bd6d..804f62f 100644 --- a/src/main/java/com/codzilla/backend/PreMatch/model/Language.java +++ b/src/main/java/com/codzilla/backend/PreMatch/model/Language.java @@ -3,7 +3,6 @@ public enum Language implements Option { CPP(54), PY(71), - SQL(0), JAVA(63); private final int value; From 3151259811b9133a5aba6afcde850db79add8520 Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 16:53:06 +0300 Subject: [PATCH 07/15] fix picking problem --- src/main/java/com/codzilla/backend/MatchRoom/MatchService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/codzilla/backend/MatchRoom/MatchService.java b/src/main/java/com/codzilla/backend/MatchRoom/MatchService.java index 265f84b..0357cbb 100644 --- a/src/main/java/com/codzilla/backend/MatchRoom/MatchService.java +++ b/src/main/java/com/codzilla/backend/MatchRoom/MatchService.java @@ -95,7 +95,7 @@ public Problem pickProblemOfOptions(Map options) { log.info("Pick problem of options: language={}, type={}, level={}", language, problemType, problemLevel); - if (language != null) { + if (language == null) { log.info("Choosing SQL problem"); Problem sqlProblem = problemService.getOrCreateRandomSqlProblem(problemLevel); log.info("Selected SQL problem: id={}, type={}", sqlProblem.getId(), sqlProblem.getType()); From 21ba4d49d48215e5f50ef0604d59707e89ecf0a1 Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 17:12:40 +0300 Subject: [PATCH 08/15] fix dto --- .../judge/problem/ProblemResponseDTO.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java b/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java index 11d7d89..bccf134 100644 --- a/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java +++ b/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java @@ -1,19 +1,23 @@ package com.codzilla.backend.judge.problem; import lombok.Data; +import lombok.Getter; +import lombok.Setter; import java.time.LocalDateTime; @Data +@Getter +@Setter public class ProblemResponseDTO { - private Long id; - private String name; - private Integer timeLimit; - private Integer memoryLimit; - private boolean hasStatement; - private int testCount; - private LocalDateTime createdAt; - private String complexity; - private String taskType; + Long id; + String name; + Integer timeLimit; + Integer memoryLimit; + boolean hasStatement; + int testCount; + LocalDateTime createdAt; + String complexity; + String taskType; } From 475cc772347ad839da13f1e19e52e1b3fb5be226 Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 19:03:15 +0300 Subject: [PATCH 09/15] fix problem response dto --- .../com/codzilla/backend/judge/problem/ProblemResponseDTO.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java b/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java index bccf134..70dd2a2 100644 --- a/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java +++ b/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java @@ -7,8 +7,6 @@ import java.time.LocalDateTime; @Data -@Getter -@Setter public class ProblemResponseDTO { Long id; @@ -17,7 +15,6 @@ public class ProblemResponseDTO { Integer memoryLimit; boolean hasStatement; int testCount; - LocalDateTime createdAt; String complexity; String taskType; } From 1b2254697bfcd4c734185fa11a318b9221ebcf45 Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 21:07:54 +0300 Subject: [PATCH 10/15] fix dto --- .../codzilla/backend/judge/problem/ProblemResponseDTO.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java b/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java index 70dd2a2..aa36be8 100644 --- a/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java +++ b/src/main/java/com/codzilla/backend/judge/problem/ProblemResponseDTO.java @@ -1,12 +1,16 @@ package com.codzilla.backend.judge.problem; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.time.LocalDateTime; @Data +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) public class ProblemResponseDTO { Long id; From 119e5bfac1b44d0c3c90cc12611258ca1bd778a8 Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 21:29:41 +0300 Subject: [PATCH 11/15] fix icon urls --- src/main/java/com/codzilla/backend/User/UserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/codzilla/backend/User/UserController.java b/src/main/java/com/codzilla/backend/User/UserController.java index 78fa7a7..16ce725 100644 --- a/src/main/java/com/codzilla/backend/User/UserController.java +++ b/src/main/java/com/codzilla/backend/User/UserController.java @@ -83,7 +83,7 @@ public String getAvatarUrl(@AuthenticationPrincipal User user) { return createPresignedGetUrl( s3Settings.bucketName(), "icons/" + user.getEmail() - ); + ).replaceAll("minio", "localhost"); } @PostMapping("/upload-icon") From f867003480fac77b942a485f8659a6556d305a90 Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 21:37:18 +0300 Subject: [PATCH 12/15] fix icon urls --- src/main/java/com/codzilla/backend/User/UserController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/codzilla/backend/User/UserController.java b/src/main/java/com/codzilla/backend/User/UserController.java index 16ce725..e6f51fa 100644 --- a/src/main/java/com/codzilla/backend/User/UserController.java +++ b/src/main/java/com/codzilla/backend/User/UserController.java @@ -72,7 +72,7 @@ ResponseEntity getUserInfo(@PathVariable UUID userId) { createPresignedGetUrl( s3Settings.bucketName(), "icons/" + user.getEmail() - ), + ).replaceFirst("minio", "localhost"), user.getId() )); } @@ -83,7 +83,7 @@ public String getAvatarUrl(@AuthenticationPrincipal User user) { return createPresignedGetUrl( s3Settings.bucketName(), "icons/" + user.getEmail() - ).replaceAll("minio", "localhost"); + ).replaceFirst("minio", "localhost"); } @PostMapping("/upload-icon") From f7eb218bf8dd419094076aaf8662f79b5c4fed22 Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 21:44:40 +0300 Subject: [PATCH 13/15] fix icon urls --- src/main/java/com/codzilla/backend/User/UserController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/codzilla/backend/User/UserController.java b/src/main/java/com/codzilla/backend/User/UserController.java index e6f51fa..8cfa335 100644 --- a/src/main/java/com/codzilla/backend/User/UserController.java +++ b/src/main/java/com/codzilla/backend/User/UserController.java @@ -72,7 +72,7 @@ ResponseEntity getUserInfo(@PathVariable UUID userId) { createPresignedGetUrl( s3Settings.bucketName(), "icons/" + user.getEmail() - ).replaceFirst("minio", "localhost"), + ), user.getId() )); } @@ -83,7 +83,7 @@ public String getAvatarUrl(@AuthenticationPrincipal User user) { return createPresignedGetUrl( s3Settings.bucketName(), "icons/" + user.getEmail() - ).replaceFirst("minio", "localhost"); + ); } @PostMapping("/upload-icon") @@ -130,7 +130,7 @@ private String createPresignedGetUrl(String bucketName, String keyName) { presignedRequest.httpRequest().method() ); - return presignedRequest.url().toExternalForm(); + return presignedRequest.url().toExternalForm().replaceFirst("minio", "localhost"); } From 881f70e0a078d4042c1061698eec43be4572bfcb Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 21:48:53 +0300 Subject: [PATCH 14/15] fix icon urls --- src/main/java/com/codzilla/backend/User/UserController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/codzilla/backend/User/UserController.java b/src/main/java/com/codzilla/backend/User/UserController.java index 8cfa335..8228215 100644 --- a/src/main/java/com/codzilla/backend/User/UserController.java +++ b/src/main/java/com/codzilla/backend/User/UserController.java @@ -113,6 +113,7 @@ private String createPresignedGetUrl(String bucketName, String keyName) { GetObjectRequest objectRequest = GetObjectRequest.builder() .bucket(bucketName) .key(keyName) + .overrideConfiguration(cfg -> cfg.putHeader("Host", "localhost:9000")) .build(); GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() From c01827efb470c999d9d6121a796d3e5e6968120b Mon Sep 17 00:00:00 2001 From: toximu Date: Sat, 27 Jun 2026 21:59:34 +0300 Subject: [PATCH 15/15] fix icon urls --- .../Leaderboard/LeaderboardService.java | 66 ++++++++++++++----- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/codzilla/backend/Leaderboard/LeaderboardService.java b/src/main/java/com/codzilla/backend/Leaderboard/LeaderboardService.java index 5129a61..f588f1e 100644 --- a/src/main/java/com/codzilla/backend/Leaderboard/LeaderboardService.java +++ b/src/main/java/com/codzilla/backend/Leaderboard/LeaderboardService.java @@ -37,22 +37,39 @@ public LeaderboardResponseDTO getLeaderboard(String currentEmail) { int total = (int) userRepository.count(); List topUsers = - userRepository.findAllByOrderByRatingDescIdAsc(PageRequest.of(0, EDGE_SIZE)); + userRepository.findAllByOrderByRatingDescIdAsc(PageRequest.of( + 0, + EDGE_SIZE + )); List bottomUsers; if (total <= EDGE_SIZE) { bottomUsers = List.of(); } else { - int bottomCount = Math.min(EDGE_SIZE, total - EDGE_SIZE); + int bottomCount = Math.min( + EDGE_SIZE, + total - EDGE_SIZE + ); List bottomAsc = - userRepository.findAllByOrderByRatingAscIdDesc(PageRequest.of(0, bottomCount)); + userRepository.findAllByOrderByRatingAscIdDesc(PageRequest.of( + 0, + bottomCount + )); bottomUsers = new ArrayList<>(bottomAsc); Collections.reverse(bottomUsers); } - List top = mapWithRank(topUsers, 1, currentEmail); + List top = mapWithRank( + topUsers, + 1, + currentEmail + ); int bottomStartRank = total - bottomUsers.size() + 1; - List bottom = mapWithRank(bottomUsers, bottomStartRank, currentEmail); + List bottom = mapWithRank( + bottomUsers, + bottomStartRank, + currentEmail + ); User me = userRepository.findByEmail(currentEmail).orElse(null); LeaderboardEntryDTO currentUser = null; @@ -60,14 +77,24 @@ public LeaderboardResponseDTO getLeaderboard(String currentEmail) { long above = userRepository.countByRatingGreaterThan(me.getRating()); int myRank = (int) above + 1; currentUser = new LeaderboardEntryDTO( - myRank, me.getNickname(), me.getRating(), - avatarUrl(me.getEmail()), true); + myRank, + me.getNickname(), + me.getRating(), + avatarUrl(me.getEmail()), + true + ); } - return new LeaderboardResponseDTO(top, bottom, currentUser, total); + return new LeaderboardResponseDTO( + top, + bottom, + currentUser, + total + ); } - private List mapWithRank(List users, int startRank, String currentEmail) { + private List mapWithRank(List users, int startRank, + String currentEmail) { List result = new ArrayList<>(users.size()); int rank = startRank; for (User u : users) { @@ -84,13 +111,20 @@ private List mapWithRank(List users, int startRank, S private String avatarUrl(String email) { GetObjectRequest objectRequest = GetObjectRequest.builder() - .bucket(s3Settings.bucketName()) - .key("icons/" + email) - .build(); + .bucket(s3Settings.bucketName()) + .key("icons/" + email) + .overrideConfiguration(cfg -> cfg.putHeader( + "Host", + "localhost:9000" + )) + .build(); GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() - .signatureDuration(Duration.ofMinutes(10)) - .getObjectRequest(objectRequest) - .build(); - return presigner.presignGetObject(presignRequest).url().toExternalForm(); + .signatureDuration(Duration.ofMinutes(10)) + .getObjectRequest(objectRequest) + .build(); + return presigner.presignGetObject(presignRequest).url().toExternalForm().replaceFirst( + "minio", + "localhost" + ); } } \ No newline at end of file