|
|
@@ -4,6 +4,7 @@ import com.danielbohry.stocks.domain.Portfolio;
|
|
|
import com.danielbohry.stocks.domain.PortfolioHistory;
|
|
|
import com.danielbohry.stocks.repository.portfolio.PortfolioHistoryEntity;
|
|
|
import com.danielbohry.stocks.repository.portfolio.PortfolioHistoryRepository;
|
|
|
+import com.danielbohry.stocks.service.ExchangeService;
|
|
|
import com.danielbohry.stocks.service.stock.StockEncryptService;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -11,8 +12,12 @@ import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
|
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
+import static java.math.BigDecimal.ONE;
|
|
|
+import static java.math.RoundingMode.HALF_UP;
|
|
|
import static java.time.Instant.now;
|
|
|
|
|
|
@Slf4j
|
|
|
@@ -23,6 +28,7 @@ public class PortfolioHistoryService {
|
|
|
private final PortfolioService service;
|
|
|
private final PortfolioHistoryRepository repository;
|
|
|
private final StockEncryptService encryptService;
|
|
|
+ private final ExchangeService exchangeService;
|
|
|
|
|
|
public static final String ONCE_PER_MONTH = "0 0 0 1 * *";
|
|
|
public static final String DEFAULT_CURRENCY = "USD";
|
|
|
@@ -37,14 +43,39 @@ public class PortfolioHistoryService {
|
|
|
saveSnapshots(portfolios);
|
|
|
}
|
|
|
|
|
|
- public List<PortfolioHistory> getSnapshots(String portfolioId) {
|
|
|
- return repository.findAllByPortfolioId(portfolioId).stream()
|
|
|
+ public List<PortfolioHistory> getSnapshots(String portfolioId, String currency) {
|
|
|
+ List<PortfolioHistory> history = repository.findAllByPortfolioId(portfolioId).stream()
|
|
|
.map(entity -> PortfolioHistory.builder()
|
|
|
.portfolioId(entity.getPortfolioId())
|
|
|
.stocks(encryptService.decryptStocks(entity.getEncryptedStocks()))
|
|
|
.createdAt(entity.getCreatedAt())
|
|
|
.build()
|
|
|
).toList();
|
|
|
+
|
|
|
+ ExchangeService.ExchangeRateResponse exchangeRate = exchangeService.getCurrentRate(currency);
|
|
|
+ Map<String, BigDecimal> rates = exchangeRate.getConversionRates();
|
|
|
+ BigDecimal targetRate = rates.getOrDefault(currency, ONE);
|
|
|
+
|
|
|
+ history.forEach(h -> {
|
|
|
+ BigDecimal quoteRate = rates.getOrDefault(DEFAULT_CURRENCY, ONE);
|
|
|
+ BigDecimal convertedPriceTotalValue = h.getTotalValueInUSD()
|
|
|
+ .divide(quoteRate, 2, HALF_UP)
|
|
|
+ .multiply(targetRate);
|
|
|
+
|
|
|
+ h.setTotalValue(convertedPriceTotalValue);
|
|
|
+
|
|
|
+ h.getStocks().forEach(s -> {
|
|
|
+ BigDecimal convertedStockPrice = s.getPrice()
|
|
|
+ .divide(quoteRate, 2, HALF_UP)
|
|
|
+ .multiply(targetRate);
|
|
|
+
|
|
|
+ s.setPrice(convertedStockPrice);
|
|
|
+ s.setTotal(convertedStockPrice.multiply(BigDecimal.valueOf(s.getQuantity())));
|
|
|
+ });
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ return history;
|
|
|
}
|
|
|
|
|
|
public void createSnapshot(String portfolioId) {
|