Skip to content

Commit 2dcb9ea

Browse files
committed
feat : add swagger-ui & fix auto eviction for /potd endpoint
1 parent 1e4aac1 commit 2dcb9ea

File tree

6 files changed

+62
-2
lines changed

6 files changed

+62
-2
lines changed

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,13 @@
121121
<groupId>org.springframework.boot</groupId>
122122
<artifactId>spring-boot-starter-aop</artifactId>
123123
</dependency>
124+
125+
<dependency>
126+
<groupId>org.springdoc</groupId>
127+
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
128+
<version>2.8.13</version>
129+
</dependency>
130+
124131
</dependencies>
125132

126133
<build>

src/main/java/com/rajat_singh/leetcode_api/controller/LeetCodeQuestionsController.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.rajat_singh.leetcode_api.repository.QuestionsRepository;
99
import com.rajat_singh.leetcode_api.service.LeetCodeQuestionsService;
1010
import lombok.RequiredArgsConstructor;
11+
import org.springdoc.core.annotations.ParameterObject;
1112
import org.springframework.data.domain.Page;
1213
import org.springframework.data.domain.Pageable;
1314
import org.springframework.http.ResponseEntity;
@@ -33,7 +34,7 @@ public class LeetCodeQuestionsController {
3334
* e.g., /api/v1/questions?page=0&size=20
3435
*/
3536
@GetMapping()
36-
public ResponseEntity<Page<QuestionResponseDTO>> getAllQuestions(Pageable pageable){
37+
public ResponseEntity<Page<QuestionResponseDTO>> getAllQuestions(@ParameterObject Pageable pageable){
3738
Logger.info("Fetching questions from database with pagination: {}", pageable);
3839

3940
Page<QuestionEntity> entityPage = questionsRepository.findAll(pageable);
@@ -54,6 +55,9 @@ public ResponseEntity<Page<QuestionResponseDTO>> getAllQuestions(Pageable pageab
5455
return ResponseEntity.ok(dtoPage);
5556
}
5657

58+
/**
59+
* Retrieves the current Problem of the Day (POTD) from the database
60+
*/
5761
@GetMapping("/potd")
5862
public ResponseEntity<QuestionResponseDTO> getPotd() {
5963
Logger.info("Fetching POTD from database");
@@ -66,5 +70,4 @@ public ResponseEntity<QuestionResponseDTO> getPotd() {
6670
return ResponseEntity.ok(dto);
6771
}
6872

69-
7073
}

src/main/java/com/rajat_singh/leetcode_api/repository/QuestionsRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.rajat_singh.leetcode_api.repository;
22

33
import com.rajat_singh.leetcode_api.entity.QuestionEntity;
4+
import jakarta.transaction.Transactional;
45
import org.springframework.data.jpa.repository.JpaRepository;
56
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
67
import org.springframework.stereotype.Repository;
@@ -12,4 +13,6 @@ public interface QuestionsRepository extends JpaRepository<QuestionEntity,Intege
1213
QuestionEntity findByTitleSlug(String title);
1314
QuestionEntity findByIsProblemOfTheDayTrue();
1415

16+
@Transactional
17+
void deleteByIsProblemOfTheDayTrue();
1518
}

src/main/java/com/rajat_singh/leetcode_api/scheduler/LeetCodeSyncScheduler.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.rajat_singh.leetcode_api.entity.TopicTag;
88
import com.rajat_singh.leetcode_api.mappers.QuestionMapper;
99
import com.rajat_singh.leetcode_api.repository.QuestionsRepository;
10+
import com.rajat_singh.leetcode_api.utility.DBUtilities;
1011
import jakarta.annotation.PostConstruct;
1112
import org.springframework.beans.factory.annotation.Autowired;
1213
import org.springframework.scheduling.annotation.Async;
@@ -33,6 +34,9 @@ public class LeetCodeSyncScheduler {
3334
@Autowired
3435
private QuestionMapper questionMapper;
3536

37+
@Autowired
38+
private DBUtilities dbUtilities;
39+
3640
// Runs every week for full data sync
3741
@Async
3842
@Scheduled(fixedRate = WEEK_IN_MILLISECONDS)
@@ -108,6 +112,20 @@ public void syncPOTD() {
108112
Logger.info("LeetCode [POTD] sync completed in {} seconds.", (endTime - startTime) / 1000);
109113
}
110114

115+
@Scheduled(cron = "0 30 5 * * ?", zone = "Asia/Kolkata") // Runs every day at 5:30 AM (IST) for POTD removal)
116+
@Async
117+
public void removePOTD() {
118+
Logger.info("Starting LeetCode [POTD] removal... at {}", DateFormat.getDateInstance().format(System.currentTimeMillis()));
119+
Long startTime = System.currentTimeMillis();
120+
QuestionEntity existingQuestion = questionRepository.findByIsProblemOfTheDayTrue();
121+
if(Objects.nonNull(existingQuestion)){
122+
existingQuestion.setIsProblemOfTheDay(false);
123+
questionRepository.save(existingQuestion);
124+
}
125+
Long endTime = System.currentTimeMillis();
126+
Logger.info("LeetCode [POTD] removal completed in {} seconds.", (endTime - startTime) / 1000);
127+
}
128+
111129
@PostConstruct
112130
public void initialSync() {
113131
syncPOTD();
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.rajat_singh.leetcode_api.utility;
2+
3+
import com.rajat_singh.leetcode_api.repository.QuestionsRepository;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.stereotype.Component;
6+
import org.tinylog.Logger;
7+
8+
@Component
9+
public class DBUtilities {
10+
11+
@Autowired
12+
private QuestionsRepository questionsRepository;
13+
14+
public void manualPOTDEviction(){
15+
Logger.info("Deleting POTD from database");
16+
questionsRepository.deleteByIsProblemOfTheDayTrue();
17+
}
18+
19+
}

src/main/resources/application.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,13 @@ resilience4j:
6767
limitRefreshPeriod: 1s # ...per 1 second.
6868
timeoutDuration: 2s # How long to wait for permission
6969
register-health-indicator: true
70+
71+
springdoc:
72+
api-docs:
73+
path: /v3/api-docs
74+
swagger-ui:
75+
path: /swagger-ui/index.html
76+
info:
77+
title: leetstats-api
78+
description: "The API for retrieving your LeetCode profile & Problems statistics"
79+
version: "0.0.1-SNAPSHOT"

0 commit comments

Comments
 (0)