Ver código fonte

validate stock code

Daniel Bohry 1 ano atrás
pai
commit
833838fb8e

+ 5 - 0
src/main/java/com/danielbohry/stocks/client/StockClient.java

@@ -2,10 +2,15 @@ package com.danielbohry.stocks.client;
 
 import com.danielbohry.stocks.service.StockService.StockInfoResponse;
 import com.danielbohry.stocks.service.StockService.StockQuoteResponse;
+import feign.FeignException;
+import org.springframework.cloud.openfeign.FallbackFactory;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.server.ResponseStatusException;
 
 import java.util.List;
 

+ 26 - 0
src/main/java/com/danielbohry/stocks/client/StockClientFallbackFactory.java

@@ -0,0 +1,26 @@
+package com.danielbohry.stocks.client;
+
+import com.danielbohry.stocks.service.StockService;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class StockClientFallbackFactory implements FallbackFactory<StockClient> {
+
+    @Override
+    public StockClient create(Throwable cause) {
+        return new StockClient() {
+            @Override
+            public List<StockService.StockQuoteResponse> getStockQuote(String symbol, String apiKey) {
+                return null;
+            }
+
+            @Override
+            public StockService.StockInfoResponse getStockInfo(String symbol, String apiKey) {
+                return null;
+            }
+        };
+    }
+}

+ 12 - 0
src/main/java/com/danielbohry/stocks/exception/BadRequestException.java

@@ -0,0 +1,12 @@
+package com.danielbohry.stocks.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(value = HttpStatus.BAD_REQUEST)
+public class BadRequestException extends RuntimeException {
+
+    public BadRequestException(String message) {
+        super(message);
+    }
+}

+ 13 - 0
src/main/java/com/danielbohry/stocks/service/PortfolioService.java

@@ -3,6 +3,7 @@ package com.danielbohry.stocks.service;
 import com.danielbohry.stocks.domain.Portfolio;
 import com.danielbohry.stocks.domain.Quote;
 import com.danielbohry.stocks.domain.Stock;
+import com.danielbohry.stocks.exception.BadRequestException;
 import com.danielbohry.stocks.exception.NotFoundException;
 import com.danielbohry.stocks.repository.PortfolioRepository;
 import lombok.AllArgsConstructor;
@@ -60,18 +61,30 @@ public class PortfolioService {
     }
 
     public Portfolio update(String id, List<Stock> stocks) {
+        log.info("Updating portfolio [{}]", id);
         Optional<Portfolio> portfolio = repository.findById(id);
 
         if (portfolio.isEmpty()) {
             throw new NotFoundException("Failed to update portfolio with id: " + id);
         }
 
+        validate(stocks);
+
         Portfolio toUpdate = portfolio.get();
         toUpdate.setUpdatedAt(now());
         toUpdate.setStocks(stocks);
         return repository.save(toUpdate);
     }
 
+    private void validate(List<Stock> stocks) {
+        boolean anyInvalid = stocks.stream()
+                .anyMatch(stock -> !stockService.isValid(stock.getCode()));
+
+        if (anyInvalid) {
+            throw new BadRequestException("Invalid stock found");
+        }
+    }
+
     public void delete(String id) {
         repository.deleteById(id);
     }

+ 15 - 1
src/main/java/com/danielbohry/stocks/service/StockService.java

@@ -5,6 +5,7 @@ import com.danielbohry.stocks.domain.Quote;
 import com.danielbohry.stocks.repository.QuoteRepository;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import feign.FeignException;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -32,6 +33,19 @@ public class StockService {
         this.key = key;
     }
 
+    public boolean isValid(String code) {
+        Quote quote = repository.findByCode(code).orElse(null);
+
+        if (quote != null) return true;
+
+        try {
+            client.getStockInfo(code, key);
+            return true;
+        } catch (FeignException.NotFound e) {
+            return false;
+        }
+    }
+
     public Quote getStockQuote(String code) {
         Quote quote = repository.findByCode(code).orElse(new Quote(code, null, null, null));
         quote.setPrice(getLastPrice(quote));
@@ -47,7 +61,7 @@ public class StockService {
         return quote;
     }
 
-    public StockInfoResponse updateStockInformation(String code) {
+    private StockInfoResponse updateStockInformation(String code) {
         log.info("Current stock's name is null. Requesting latest information...");
         return client.getStockInfo(code, key);
     }