Skip to content

Commit

Permalink
Merge pull request #63 from onesimus-wiafe/SCRUM-62-portfolio-control…
Browse files Browse the repository at this point in the history
…-and-access

can create and delete portfolio
  • Loading branch information
djangbahevans authored Aug 7, 2024
2 parents 8de8c07 + d366289 commit 0ca3535
Show file tree
Hide file tree
Showing 8 changed files with 207 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@SpringBootApplication(scanBasePackages = "com.joe.trading")
public class OrderProcessingServiceApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.joe.trading.order_processing.controllers;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.joe.trading.order_processing.entities.dto.PortfolioRequestDTO;
import com.joe.trading.order_processing.entities.dto.PortfolioResponseDTO;
import com.joe.trading.order_processing.services.PortfolioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/v1/portfolio")
public class PortfolioController {

private final PortfolioService portfolioService;

@Autowired
public PortfolioController(PortfolioService portfolioService) {
this.portfolioService = portfolioService;
}

@PostMapping
public ResponseEntity<PortfolioResponseDTO> createPortfolio(@RequestBody PortfolioRequestDTO request) throws JsonProcessingException {

return ResponseEntity.status(HttpStatus.CREATED).body(portfolioService.saveNewPortfolio(request.getUserId(), request.getPortfolioName()));
}

@DeleteMapping
public ResponseEntity<Boolean> deletePortfolio(PortfolioRequestDTO request){

return ResponseEntity.ok(portfolioService.deletePortfolio(request));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.joe.trading.order_processing.entities;

import com.joe.trading.order_processing.entities.dto.PortfolioResponseDTO;
import com.joe.trading.order_processing.entities.enums.PortfolioState;
import jakarta.persistence.*;
import lombok.Getter;
Expand Down Expand Up @@ -77,6 +78,10 @@ public String toString() {
'}';
}

public PortfolioResponseDTO toPortfolioResponseDTO(){
return new PortfolioResponseDTO(this.id, this.portfolioName, this.portfolioValue, this.stocks);
}

@Override
public int hashCode() {
return Objects.hash(id, portfolioValue, portfolioName, state, user);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.joe.trading.order_processing.entities.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class PortfolioRequestDTO {
private Long userId;
private String portfolioName;
private Long portfolioId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.joe.trading.order_processing.entities.dto;

import com.joe.trading.order_processing.entities.Stock;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class PortfolioResponseDTO {
private Long portfolioId;
private String portfolioName;
private Double portfolioValue;
private List<Stock> stocks;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.joe.trading.order_processing.services;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.joe.trading.order_processing.entities.Portfolio;
import com.joe.trading.order_processing.entities.dto.PortfolioRequestDTO;
import com.joe.trading.order_processing.entities.dto.PortfolioResponseDTO;

import java.util.List;

public interface PortfolioService {
PortfolioResponseDTO saveNewPortfolio(Long userId, String name) throws JsonProcessingException;

Boolean deletePortfolio(PortfolioRequestDTO request);

Portfolio getDefaultPortfolio(Long id);
List<Portfolio> getAllPortfolioByUserId(Long userId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package com.joe.trading.order_processing.services.impl;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.joe.trading.order_processing.entities.Order;
import com.joe.trading.order_processing.entities.Portfolio;
import com.joe.trading.order_processing.entities.Stock;
import com.joe.trading.order_processing.entities.User;
import com.joe.trading.order_processing.entities.dto.PortfolioRequestDTO;
import com.joe.trading.order_processing.entities.dto.PortfolioResponseDTO;
import com.joe.trading.order_processing.entities.enums.PortfolioState;
import com.joe.trading.order_processing.repositories.jpa.PortfolioRepository;
import com.joe.trading.order_processing.repositories.jpa.UserRepository;
import com.joe.trading.order_processing.services.PortfolioService;
import com.joe.trading.shared.events.Event;
import com.joe.trading.shared.nats.NatsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PortfolioServiceImpl implements PortfolioService {

private final UserRepository userRepo;
private final PortfolioRepository portRepo;
private final NatsService natsService;

@Autowired
public PortfolioServiceImpl(UserRepository userRepo, PortfolioRepository portRepo, NatsService natsService) {
this.userRepo = userRepo;
this.portRepo = portRepo;
this.natsService = natsService;
}

@Override
public PortfolioResponseDTO saveNewPortfolio(Long userId, String name) throws JsonProcessingException {
User user = userRepo.findById(userId).get();

Portfolio newPortfolio = new Portfolio(name);

newPortfolio.setUser(user);



PortfolioResponseDTO response = portRepo.save(newPortfolio).toPortfolioResponseDTO();
natsService.publish(Event.PORTFOLIO_CREATED, response);

return response;
}

@Override
public Boolean deletePortfolio(PortfolioRequestDTO request) {
User user = userRepo.findById(request.getUserId()).get();

List<Portfolio> userPortfolio = user.getPortfolios();

Portfolio portfolioToDelete = portRepo.findById(request.getPortfolioId()).get();

userPortfolio.remove(portfolioToDelete);

Portfolio userDefaultPortfolio = this.getDefaultPortfolio(request.getUserId());

userPortfolio.remove(userDefaultPortfolio);

List<Stock> defaultStocks = userDefaultPortfolio.getStocks();

portfolioToDelete.getStocks().forEach(stock -> {
stock.setPortfolio(userDefaultPortfolio);

Stock similarStock = defaultStocks.stream().filter(stock1 -> stock1.getTicker().equals(stock.getTicker())).findFirst().orElse(null);

if (similarStock == null){
defaultStocks.add(stock);
}
else {
defaultStocks.remove(similarStock);

similarStock.setQuantity(similarStock.getQuantity() + stock.getQuantity());
similarStock.setStockValue(similarStock.getStockValue() + stock.getStockValue());
List<Order> orders = similarStock.getOrders();
orders.addAll(stock.getOrders());
similarStock.setOrders(orders);

defaultStocks.add(similarStock);
}
});

userDefaultPortfolio.setStocks(defaultStocks);

userPortfolio.add(userDefaultPortfolio);

portRepo.saveAll(userPortfolio);

portRepo.delete(portfolioToDelete);

return portRepo.findById(request.getUserId()).isEmpty();
}

@Override
public Portfolio getDefaultPortfolio(Long id) {
User user = userRepo.findById(id).get();

List<Portfolio> userPortfolios = user.getPortfolios();

return userPortfolios.stream().filter(portfolio -> portfolio.getState().equals(PortfolioState.DEFAULT)).toList().get(0);
}

@Override
public List<Portfolio> getAllPortfolioByUserId(Long userId) {
return List.of();
}
}
2 changes: 2 additions & 0 deletions shared/src/main/java/com/joe/trading/shared/events/Event.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ public enum Event {
NEW_ORDER_EX1("order.exchange1"),
NEW_ORDER_EX2("order.exchange2"),

PORTFOLIO_CREATED("order.portfolio.created"),

MARKET_DATA_UPDATE("market.data.update"),

MSFT_ORDER_BOOK("orderbook.msft"),
Expand Down

0 comments on commit 0ca3535

Please sign in to comment.