Browse Source

grant uniqueness when searching for a name or code

Daniel Bohry 1 year ago
parent
commit
f39503fe9a

+ 5 - 4
src/main/java/com/danielbohry/stocks/controller/stock/StockController.java

@@ -14,10 +14,11 @@ import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.regex.Pattern;
 
 import static java.time.LocalDateTime.now;
-import static java.util.Collections.emptyList;
+import static java.util.Collections.emptySet;
 
 @Slf4j
 @RestController
@@ -31,12 +32,12 @@ public class StockController {
     private static final String ACCEPT = "^[a-zA-Z]+$";
 
     @GetMapping
-    public ResponseEntity<List<Quote>> find(@RequestParam(value = "q") String query) {
+    public ResponseEntity<Set<Quote>> find(@RequestParam(value = "q") String query) {
         if (query != null && !Pattern.matches(ACCEPT, query)) {
-            return ResponseEntity.ok(emptyList());
+            return ResponseEntity.ok(emptySet());
         }
 
-        List<Quote> response = service.get(query);
+        Set<Quote> response = service.get(query);
         return ResponseEntity.ok(response);
     }
 

+ 4 - 2
src/main/java/com/danielbohry/stocks/repository/QuoteRepository.java

@@ -6,14 +6,16 @@ import org.springframework.data.mongodb.repository.MongoRepository;
 import org.springframework.data.mongodb.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 
 @Repository
 public interface QuoteRepository extends MongoRepository<Quote, String> {
 
-    @Query("{ $or: [ { 'name': { $regex: ?0, $options: 'i' } }, { 'code': { $regex: ?0, $options: 'i' } } ] }")
-    List<Quote> findByNameContaining(String query);
+    @Query("{ $and: [ { $or: [ { 'name': { $regex: ?0, $options: 'i' } }, { 'code': { $regex: ?0, $options: 'i' } } ] }, { 'updatedAt': { $gt: ?1 } } ] }")
+    Set<Quote> findByNameContaining(String query, LocalDateTime date);
 
     @Query(value = "{ 'code': ?0 }", sort = "{ 'updatedAt': -1 }")
     List<Quote> findLatestByCode(String code);

+ 11 - 3
src/main/java/com/danielbohry/stocks/repository/StockRepository.java

@@ -14,8 +14,11 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Repository;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.HashSet;
 import java.util.List;
-import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import static java.time.LocalDateTime.now;
 
@@ -23,6 +26,7 @@ import static java.time.LocalDateTime.now;
 @Repository
 public class StockRepository {
 
+    public static final LocalDateTime LAST_FIVE_DAYS = LocalDateTime.now().minusDays(5);
     private final QuoteRepository repository;
     private final StockClient client;
     private final String key;
@@ -33,8 +37,12 @@ public class StockRepository {
         this.key = key;
     }
 
-    public List<Quote> findLike(String query) {
-        return repository.findByNameContaining(query);
+    public Set<Quote> findLike(String query) {
+        Set<Quote> quotes = repository.findByNameContaining(query, LAST_FIVE_DAYS);
+        Set<String> addedCodes = new HashSet<>();
+        return quotes.stream()
+                .filter(quote -> addedCodes.add(quote.getCode()))
+                .collect(Collectors.toSet());
     }
 
     public Quote findByCode(String code) {

+ 4 - 3
src/main/java/com/danielbohry/stocks/service/StockService.java

@@ -8,8 +8,9 @@ import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 
-import static java.util.Collections.emptyList;
+import static java.util.Collections.emptySet;
 
 @Slf4j
 @Service
@@ -18,9 +19,9 @@ public class StockService {
 
     private StockRepository repository;
 
-    public List<Quote> get(String query) {
+    public Set<Quote> get(String query) {
         if (Objects.equals(query, "")) {
-            return emptyList();
+            return emptySet();
         }
 
         return repository.findLike(query);

+ 2 - 1
src/test/java/service/StockServiceTest.java

@@ -12,6 +12,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
+import java.util.Set;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -49,7 +50,7 @@ public class StockServiceTest {
         String name = "West";
 
         //when
-        List<Quote> result = service.get(name);
+        Set<Quote> result = service.get(name);
 
         //then
         assertEquals(19, result.size());