|
|
@@ -6,7 +6,7 @@ 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;
|
|
|
+import com.danielbohry.stocks.service.ExchangeService.ExchangeRateResponse;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
@@ -16,15 +16,24 @@ import java.util.List;
|
|
|
import java.util.Optional;
|
|
|
import java.util.UUID;
|
|
|
|
|
|
+import static java.math.RoundingMode.HALF_UP;
|
|
|
import static java.time.LocalDateTime.now;
|
|
|
|
|
|
@Service
|
|
|
-@AllArgsConstructor
|
|
|
@Slf4j
|
|
|
public class PortfolioService {
|
|
|
|
|
|
private final PortfolioRepository repository;
|
|
|
private final StockService stockService;
|
|
|
+ private final ExchangeService exchangeService;
|
|
|
+
|
|
|
+ public PortfolioService(PortfolioRepository repository,
|
|
|
+ StockService stockService,
|
|
|
+ ExchangeService exchangeService) {
|
|
|
+ this.repository = repository;
|
|
|
+ this.stockService = stockService;
|
|
|
+ this.exchangeService = exchangeService;
|
|
|
+ }
|
|
|
|
|
|
public List<Portfolio> getAll() {
|
|
|
return repository.findAll();
|
|
|
@@ -34,14 +43,28 @@ public class PortfolioService {
|
|
|
Portfolio portfolio = repository.findById(id)
|
|
|
.orElseThrow(() -> new NotFoundException("No portfolio found with id: " + id));
|
|
|
|
|
|
+ ExchangeRateResponse exchangeRate = exchangeService.getCurrentRate("USD");
|
|
|
+
|
|
|
+ BigDecimal brlRatio = exchangeRate.getConversionRates().get("BRL");
|
|
|
+ BigDecimal eurRatio = exchangeRate.getConversionRates().get("EUR");
|
|
|
+
|
|
|
log.info("Getting portfolio [{}]", id);
|
|
|
List<Stock> updatedStocks = portfolio.getStocks().stream()
|
|
|
- .map(stock -> {
|
|
|
+ .peek(stock -> {
|
|
|
Quote quote = stockService.getStockQuote(stock.getCode());
|
|
|
stock.setName(quote.getName());
|
|
|
- stock.setPrice(quote.getPrice());
|
|
|
+
|
|
|
+ switch (quote.getCurrency()) {
|
|
|
+ case "BRL":
|
|
|
+ stock.setPrice(quote.getPrice().divide(brlRatio, HALF_UP));
|
|
|
+ break;
|
|
|
+ case "EUR":
|
|
|
+ stock.setPrice(quote.getPrice().divide(eurRatio, HALF_UP));
|
|
|
+ default:
|
|
|
+ stock.setPrice(quote.getPrice());
|
|
|
+ }
|
|
|
+
|
|
|
stock.setTotal(stock.getPrice().multiply(new BigDecimal(stock.getQuantity())));
|
|
|
- return stock;
|
|
|
}).toList();
|
|
|
|
|
|
portfolio.setStocks(updatedStocks);
|