diff --git a/src/main/java/org/patinanetwork/codebloom/common/submissions/SubmissionsHandler.java b/src/main/java/org/patinanetwork/codebloom/common/submissions/SubmissionsHandler.java index 27c7d60e7..c6593b91b 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/submissions/SubmissionsHandler.java +++ b/src/main/java/org/patinanetwork/codebloom/common/submissions/SubmissionsHandler.java @@ -106,6 +106,32 @@ public static Predicate distinctByKey(final Function keyExt return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; } + private QuestionBank refetchAndBackfillQuestion( + final String slug, final QuestionBank existingBankQuestion, final boolean fast) { + LeetcodeQuestion question = + fast ? leetcodeClient.findQuestionBySlugFast(slug) : leetcodeClient.findQuestionBySlug(slug); + + QuestionBank refetchedQuestion = QuestionBank.builder() + .questionSlug(question.getTitleSlug()) + .questionDifficulty(QuestionDifficulty.valueOf(question.getDifficulty())) + .questionTitle(question.getQuestionTitle()) + .questionNumber(question.getQuestionId()) + .questionLink("https://leetcode.com/problems/" + question.getTitleSlug()) + .description(Optional.ofNullable(question.getQuestion())) + .acceptanceRate(question.getAcceptanceRate()) + .topics(question.getTopics().stream() + .map(SubmissionsHandler::topicTagToQuestionTopic) + .toList()) + .build(); + + if (existingBankQuestion != null) { + refetchedQuestion.setId(existingBankQuestion.getId()); + questionBankRepository.updateQuestion(refetchedQuestion); + } + + return refetchedQuestion; + } + public ArrayList handleSubmissions( final List leetcodeSubmissions, final User user, boolean fast) { ArrayList acceptedSubmissions = new ArrayList<>(); @@ -116,26 +142,16 @@ public ArrayList handleSubmissions( .map(s -> { String slug = s.getTitleSlug(); - QuestionBank bankQuestion = questionBankRepository - .getQuestionBySlug(slug) - .orElseGet(() -> { - LeetcodeQuestion question = fast - ? leetcodeClient.findQuestionBySlugFast(slug) - : leetcodeClient.findQuestionBySlug(slug); - - return QuestionBank.builder() - .questionSlug(question.getTitleSlug()) - .questionDifficulty(QuestionDifficulty.valueOf(question.getDifficulty())) - .questionTitle(question.getQuestionTitle()) - .questionNumber(question.getQuestionId()) - .questionLink("https://leetcode.com/problems/" + question.getTitleSlug()) - .description(Optional.ofNullable(question.getQuestion())) - .acceptanceRate(question.getAcceptanceRate()) - .topics(question.getTopics().stream() - .map(SubmissionsHandler::topicTagToQuestionTopic) - .toList()) - .build(); - }); + Optional existingBankQuestion = questionBankRepository.getQuestionBySlug(slug); + + boolean hasDescription = existingBankQuestion + .flatMap(QuestionBank::getDescription) + .filter(description -> !description.isBlank()) + .isPresent(); + + QuestionBank bankQuestion = hasDescription + ? existingBankQuestion.get() + : refetchAndBackfillQuestion(slug, existingBankQuestion.orElse(null), fast); return Pair.of(slug, bankQuestion); }) diff --git a/src/test/java/org/patinanetwork/codebloom/common/submissions/SubmissionsHandlerTest.java b/src/test/java/org/patinanetwork/codebloom/common/submissions/SubmissionsHandlerTest.java index 910545a38..7eb022eb3 100644 --- a/src/test/java/org/patinanetwork/codebloom/common/submissions/SubmissionsHandlerTest.java +++ b/src/test/java/org/patinanetwork/codebloom/common/submissions/SubmissionsHandlerTest.java @@ -318,6 +318,43 @@ void testNoBank() { verify(leetcodeClient, never()).findQuestionBySlug(anyString()); } + @Test + @DisplayName("re-fetches and backfills the question bank entry when its description is missing") + void backfillsMissingDescription() { + LeetcodeSubmission sub = acceptedSubmission(603, "two-sum", LocalDateTime.of(2025, 6, 1, 12, 0)); + when(questionRepository.questionExistsBySubmissionId("603")).thenReturn(false); + when(questionRepository.getQuestionBySlugAndUserId("two-sum", USER_ID)).thenReturn(Optional.empty()); + + QuestionBank staleBankQuestion = QuestionBank.builder() + .id("bank-1") + .questionSlug("two-sum") + .questionDifficulty(QuestionDifficulty.Easy) + .questionTitle("two-sum") + .questionNumber(1) + .questionLink("https://leetcode.com/problems/two-sum") + .description(Optional.empty()) + .acceptanceRate(50f) + .topics(List.of()) + .build(); + + when(questionBankRepository.getQuestionBySlug("two-sum")).thenReturn(Optional.of(staleBankQuestion)); + when(leetcodeClient.findQuestionBySlug("two-sum")).thenReturn(leetcodeQuestion("two-sum", "Easy", 50f)); + + handler.handleSubmissions(List.of(sub), user, false); + + verify(leetcodeClient).findQuestionBySlug("two-sum"); + + ArgumentCaptor bankCaptor = ArgumentCaptor.forClass(QuestionBank.class); + verify(questionBankRepository).updateQuestion(bankCaptor.capture()); + assertEquals("bank-1", bankCaptor.getValue().getId()); + assertEquals( + Optional.of("Description of two-sum"), bankCaptor.getValue().getDescription()); + + ArgumentCaptor qCaptor = ArgumentCaptor.forClass(Question.class); + verify(questionRepository).createQuestion(qCaptor.capture()); + assertEquals(Optional.of("Description of two-sum"), qCaptor.getValue().getDescription()); + } + @Test @DisplayName("distinctByKey filters duplicates by the given key") void distinctByKeyWorks() {