|
@@ -6,6 +6,8 @@ import com.danielbohry.stocks.domain.Quote;
|
|
|
import com.danielbohry.stocks.domain.Stock;
|
|
import com.danielbohry.stocks.domain.Stock;
|
|
|
import com.danielbohry.stocks.exception.BadRequestException;
|
|
import com.danielbohry.stocks.exception.BadRequestException;
|
|
|
import com.danielbohry.stocks.exception.NotFoundException;
|
|
import com.danielbohry.stocks.exception.NotFoundException;
|
|
|
|
|
+import com.danielbohry.stocks.repository.PortfolioEntity;
|
|
|
|
|
+import com.danielbohry.stocks.repository.PortfolioEntity.PortfolioStock;
|
|
|
import com.danielbohry.stocks.repository.PortfolioRepository;
|
|
import com.danielbohry.stocks.repository.PortfolioRepository;
|
|
|
import com.danielbohry.stocks.service.ExchangeService.ExchangeRateResponse;
|
|
import com.danielbohry.stocks.service.ExchangeService.ExchangeRateResponse;
|
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.AllArgsConstructor;
|
|
@@ -16,9 +18,9 @@ import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
-import java.util.Optional;
|
|
|
|
|
import java.util.UUID;
|
|
import java.util.UUID;
|
|
|
|
|
|
|
|
|
|
+import static com.danielbohry.stocks.domain.Portfolio.convert;
|
|
|
import static java.time.LocalDateTime.now;
|
|
import static java.time.LocalDateTime.now;
|
|
|
import static java.util.Collections.emptyList;
|
|
import static java.util.Collections.emptyList;
|
|
|
|
|
|
|
@@ -30,9 +32,12 @@ public class PortfolioService {
|
|
|
private final PortfolioRepository repository;
|
|
private final PortfolioRepository repository;
|
|
|
private final StockService stockService;
|
|
private final StockService stockService;
|
|
|
private final ExchangeService exchangeService;
|
|
private final ExchangeService exchangeService;
|
|
|
|
|
+ private final PortfolioEncryptService portfolioEncryptService;
|
|
|
|
|
|
|
|
public List<Portfolio> getAll() {
|
|
public List<Portfolio> getAll() {
|
|
|
- return repository.findAll();
|
|
|
|
|
|
|
+ return repository.findAll().stream()
|
|
|
|
|
+ .map(Portfolio::convert)
|
|
|
|
|
+ .toList();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public List<String> getAllIds() {
|
|
public List<String> getAllIds() {
|
|
@@ -40,17 +45,22 @@ public class PortfolioService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public List<Portfolio> getByUser(String username, String currency) {
|
|
public List<Portfolio> getByUser(String username, String currency) {
|
|
|
- List<Portfolio> portfolios = repository.findAllByUsername(username);
|
|
|
|
|
-
|
|
|
|
|
- return portfolios.stream()
|
|
|
|
|
- .map(portfolio -> get(portfolio.getId(), currency))
|
|
|
|
|
|
|
+ return repository.findAllByUsername(username).stream()
|
|
|
|
|
+ .map(entity -> get(entity.getId(), currency))
|
|
|
.toList();
|
|
.toList();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Portfolio get(String id, String currency) {
|
|
public Portfolio get(String id, String currency) {
|
|
|
- Portfolio portfolio = repository.findById(id)
|
|
|
|
|
|
|
+ PortfolioEntity entity = repository.findById(id)
|
|
|
.orElseThrow(() -> new NotFoundException("No portfolio found with id: " + id));
|
|
.orElseThrow(() -> new NotFoundException("No portfolio found with id: " + id));
|
|
|
|
|
|
|
|
|
|
+ String encrypted = entity.getEncryptedStocks();
|
|
|
|
|
+
|
|
|
|
|
+ if (portfolioEncryptService.isEncrypted(entity)) {
|
|
|
|
|
+ entity.setStocks(portfolioEncryptService.decryptStocks(encrypted));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Portfolio portfolio = convert(entity);
|
|
|
ExchangeRateResponse exchangeRate = exchangeService.getCurrentRate(currency);
|
|
ExchangeRateResponse exchangeRate = exchangeService.getCurrentRate(currency);
|
|
|
Map<String, BigDecimal> rates = exchangeRate.getConversionRates();
|
|
Map<String, BigDecimal> rates = exchangeRate.getConversionRates();
|
|
|
BigDecimal targetRate = rates.getOrDefault(currency, BigDecimal.ONE);
|
|
BigDecimal targetRate = rates.getOrDefault(currency, BigDecimal.ONE);
|
|
@@ -79,7 +89,7 @@ public class PortfolioService {
|
|
|
public Portfolio create() {
|
|
public Portfolio create() {
|
|
|
String id = UUID.randomUUID().toString();
|
|
String id = UUID.randomUUID().toString();
|
|
|
|
|
|
|
|
- Portfolio toSave = Portfolio.builder()
|
|
|
|
|
|
|
+ PortfolioEntity toSave = PortfolioEntity.builder()
|
|
|
.id(id)
|
|
.id(id)
|
|
|
.stocks(emptyList())
|
|
.stocks(emptyList())
|
|
|
.username(UserContextHolder.get().getUsername())
|
|
.username(UserContextHolder.get().getUsername())
|
|
@@ -87,23 +97,27 @@ public class PortfolioService {
|
|
|
.updatedAt(now())
|
|
.updatedAt(now())
|
|
|
.build();
|
|
.build();
|
|
|
|
|
|
|
|
- return repository.save(toSave);
|
|
|
|
|
|
|
+ return convert(repository.save(toSave));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Portfolio update(String id, List<Stock> stocks) {
|
|
public Portfolio update(String id, List<Stock> stocks) {
|
|
|
log.info("Updating portfolio [{}]", id);
|
|
log.info("Updating portfolio [{}]", id);
|
|
|
- Optional<Portfolio> portfolio = repository.findById(id);
|
|
|
|
|
-
|
|
|
|
|
- if (portfolio.isEmpty()) {
|
|
|
|
|
- throw new NotFoundException("Failed to update portfolio with id: " + id);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ PortfolioEntity toUpdate = repository.findById(id).orElseThrow(() -> new NotFoundException("Failed to update portfolio with id: " + id));
|
|
|
|
|
|
|
|
validate(stocks);
|
|
validate(stocks);
|
|
|
|
|
|
|
|
- Portfolio toUpdate = portfolio.get();
|
|
|
|
|
toUpdate.setUpdatedAt(now());
|
|
toUpdate.setUpdatedAt(now());
|
|
|
- toUpdate.setStocks(stocks);
|
|
|
|
|
- return repository.save(toUpdate);
|
|
|
|
|
|
|
+ toUpdate.setEncryptedStocks(portfolioEncryptService.encryptStocks(stocks.stream()
|
|
|
|
|
+ .map(stock -> new PortfolioStock(stock.getCode(), stock.getQuantity()))
|
|
|
|
|
+ .toList()));
|
|
|
|
|
+ toUpdate.setStocks(null);
|
|
|
|
|
+
|
|
|
|
|
+ PortfolioEntity updated = repository.save(toUpdate);
|
|
|
|
|
+
|
|
|
|
|
+ List<PortfolioStock> decryptStocks = portfolioEncryptService.decryptStocks(updated.getEncryptedStocks());
|
|
|
|
|
+ updated.setStocks(decryptStocks);
|
|
|
|
|
+
|
|
|
|
|
+ return convert(updated);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void delete(String id) {
|
|
public void delete(String id) {
|