Эх сурвалжийг харах

add default range for stock history endpoint

Daniel Bohry 7 сар өмнө
parent
commit
2f961180fb

+ 3 - 2
src/main/java/com/danielbohry/stocks/api/stock/StockHistoryController.java

@@ -19,8 +19,9 @@ public class StockHistoryController {
     private final StockHistoryService service;
 
     @GetMapping("history")
-    public ResponseEntity<?> getStockHistory(@PathVariable String code) {
-        List<StockHistory> response = service.get(code);
+    public ResponseEntity<List<StockHistory>> getStockHistory(@PathVariable String code,
+                                                              @RequestParam(defaultValue = "5d") String range) {
+        List<StockHistory> response = service.get(code, range);
         return ResponseEntity.ok(response);
     }
 

+ 3 - 0
src/main/java/com/danielbohry/stocks/repository/stock/StockHistoryRepository.java

@@ -4,6 +4,7 @@ import com.danielbohry.stocks.domain.StockHistory;
 import org.springframework.data.mongodb.repository.MongoRepository;
 import org.springframework.stereotype.Repository;
 
+import java.time.Instant;
 import java.util.List;
 
 @Repository
@@ -11,4 +12,6 @@ public interface StockHistoryRepository extends MongoRepository<StockHistory, St
 
     List<StockHistory> findAllByCode(String code);
 
+    List<StockHistory> findByCodeAndCreatedAtBetween(String code, Instant start, Instant end);
+
 }

+ 16 - 3
src/main/java/com/danielbohry/stocks/service/stock/StockHistoryService.java

@@ -1,6 +1,7 @@
 package com.danielbohry.stocks.service.stock;
 
 import com.danielbohry.stocks.domain.StockHistory;
+import com.danielbohry.stocks.exception.BadRequestException;
 import com.danielbohry.stocks.repository.stock.StockHistoryRepository;
 import lombok.AllArgsConstructor;
 import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
@@ -8,9 +9,12 @@ import org.springframework.cache.annotation.Cacheable;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
+import java.time.Instant;
 import java.util.List;
 
 import static java.time.Instant.now;
+import static java.time.temporal.ChronoUnit.DAYS;
+import static java.time.temporal.ChronoUnit.MONTHS;
 
 @Service
 @AllArgsConstructor
@@ -31,9 +35,18 @@ public class StockHistoryService {
         repository.saveAll(stocks);
     }
 
-    @Cacheable(value = "stockHistory", key = "#code")
-    public List<StockHistory> get(String code) {
-        return repository.findAllByCode(code);
+    @Cacheable(value = "stockHistory", key = "#code + '-' + #range")
+    public List<StockHistory> get(String code, String range) {
+        Instant end = Instant.now();
+        Instant start = switch (range) {
+            case "5d" -> end.minus(5, DAYS);
+            case "30d" -> end.minus(30, DAYS);
+            case "6m" -> end.minus(6, MONTHS);
+            case "1y" -> end.minus(12, MONTHS);
+            default -> throw new BadRequestException("Unsupported range: " + range);
+        };
+
+        return repository.findByCodeAndCreatedAtBetween(code, start, end);
     }
 
 }

+ 8 - 8
src/test/java/service/StockHistoryServiceTest.java

@@ -10,6 +10,7 @@ import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
 import java.math.BigDecimal;
+import java.time.Instant;
 import java.util.List;
 
 import static java.time.Instant.now;
@@ -30,22 +31,21 @@ public class StockHistoryServiceTest {
     }
 
     @Test
-    void testGet_returnsStockHistoryFromRepository() {
-        //given
+    void testGet_with5dRange_callsRepositoryWithCorrectDateRange() {
         String code = "AAPL";
+        String range = "5d";
+
         List<StockHistory> expected = List.of(
             new StockHistory("AAPL", "USD", new BigDecimal("150.00"), now())
         );
 
-        //and
-        when(repository.findAllByCode(code)).thenReturn(expected);
+        when(repository.findByCodeAndCreatedAtBetween(eq(code), any(Instant.class), any(Instant.class)))
+            .thenReturn(expected);
 
-        //when
-        List<StockHistory> result = stockHistoryService.get(code);
+        List<StockHistory> result = stockHistoryService.get(code, range);
 
-        //then
         assertEquals(expected, result);
-        verify(repository, times(1)).findAllByCode(code);
+        verify(repository, times(1)).findByCodeAndCreatedAtBetween(eq(code), any(Instant.class), any(Instant.class));
     }
 
 }