|
|
@@ -1,47 +1,57 @@
|
|
|
package com.danielbohry.stocks.service;
|
|
|
|
|
|
+import com.danielbohry.stocks.context.UserContextHolder;
|
|
|
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.exception.UnauthorizedException;
|
|
|
import com.danielbohry.stocks.repository.PortfolioRepository;
|
|
|
import com.danielbohry.stocks.service.ExchangeService.ExchangeRateResponse;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
import java.util.Optional;
|
|
|
import java.util.UUID;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
import static java.math.RoundingMode.HALF_UP;
|
|
|
import static java.time.LocalDateTime.now;
|
|
|
+import static java.util.Collections.emptyList;
|
|
|
|
|
|
-@Service
|
|
|
@Slf4j
|
|
|
+@Service
|
|
|
+@AllArgsConstructor
|
|
|
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();
|
|
|
}
|
|
|
|
|
|
+ public List<Portfolio> getByUser(String username) {
|
|
|
+ List<Portfolio> portfolios = repository.findAllByUsername(username);
|
|
|
+
|
|
|
+ return portfolios.stream()
|
|
|
+ .map(portfolio -> get(portfolio.getId()))
|
|
|
+ .toList();
|
|
|
+ }
|
|
|
+
|
|
|
public Portfolio get(String id) {
|
|
|
Portfolio portfolio = repository.findById(id)
|
|
|
- .orElseThrow(() -> new NotFoundException("No portfolio found with id: " + id));
|
|
|
+ .orElseThrow(() -> new NotFoundException("No portfolio found with id: " + id));
|
|
|
+
|
|
|
+ if (portfolio.getUsername() != null && !Objects.equals(portfolio.getUsername(), UserContextHolder.get().getUsername())) {
|
|
|
+ throw new UnauthorizedException("You do not have permission to access this portfolio");
|
|
|
+ }
|
|
|
|
|
|
ExchangeRateResponse exchangeRate = exchangeService.getCurrentRate("USD");
|
|
|
|
|
|
@@ -50,22 +60,22 @@ public class PortfolioService {
|
|
|
|
|
|
log.info("Getting portfolio [{}]", id);
|
|
|
List<Stock> updatedStocks = portfolio.getStocks().stream()
|
|
|
- .peek(stock -> {
|
|
|
- Quote quote = stockService.getStockQuote(stock.getCode());
|
|
|
- stock.setName(quote.getName());
|
|
|
-
|
|
|
- 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())));
|
|
|
- }).toList();
|
|
|
+ .peek(stock -> {
|
|
|
+ Quote quote = stockService.getStockQuote(stock.getCode());
|
|
|
+ stock.setName(quote.getName());
|
|
|
+
|
|
|
+ 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())));
|
|
|
+ }).toList();
|
|
|
|
|
|
portfolio.setStocks(updatedStocks);
|
|
|
|
|
|
@@ -76,11 +86,12 @@ public class PortfolioService {
|
|
|
String id = UUID.randomUUID().toString();
|
|
|
|
|
|
Portfolio toSave = Portfolio.builder()
|
|
|
- .id(id)
|
|
|
- .stocks(Collections.emptyList())
|
|
|
- .createdAt(now())
|
|
|
- .updatedAt(now())
|
|
|
- .build();
|
|
|
+ .id(id)
|
|
|
+ .stocks(emptyList())
|
|
|
+ .username(UserContextHolder.get().getUsername())
|
|
|
+ .createdAt(now())
|
|
|
+ .updatedAt(now())
|
|
|
+ .build();
|
|
|
|
|
|
return repository.save(toSave);
|
|
|
}
|
|
|
@@ -117,7 +128,7 @@ public class PortfolioService {
|
|
|
|
|
|
private void validate(List<Stock> stocks) {
|
|
|
boolean anyInvalid = stocks.stream()
|
|
|
- .anyMatch(stock -> !stockService.isValid(stock.getCode()));
|
|
|
+ .anyMatch(stock -> !stockService.isValid(stock.getCode()));
|
|
|
|
|
|
if (anyInvalid) {
|
|
|
throw new BadRequestException("Invalid stock found");
|