Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

finished sell stocks use case #31

Merged
merged 2 commits into from
Nov 13, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/interface_adapters/Sell/SellController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package interface_adapters.Sell;

import use_cases.Sell.SellInputBoundary;
import use_cases.Sell.SellInputData;

public class SellController {
final private SellInputBoundary sellInteractor;

public SellController(SellInputBoundary sellInteractor) {
this.sellInteractor = sellInteractor;
}

public void execute(Double amount, String ticker, String username) {
SellInputData sellInputData = new SellInputData(amount, ticker, username);
sellInteractor.execute(sellInputData);
}
}
8 changes: 8 additions & 0 deletions src/interface_adapters/Sell/SellOutputBoundary.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package interface_adapters.Sell;

import use_cases.Sell.SellOutputData;

public interface SellOutputBoundary {
void prepareSuccessView(SellOutputData result);
void prepareFailView(String error);
}
31 changes: 31 additions & 0 deletions src/interface_adapters/Sell/SellPresenter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package interface_adapters.Sell;

import interface_adapters.ViewManagerModel;
import use_cases.Sell.SellOutputData;

public class SellPresenter implements SellOutputBoundary {

private final SellViewModel sellViewModel;
private final PortfolioViewModel portfolioViewModel;
private final ViewManagerModel viewManagerModel;

public SellPresenter(ViewManagerModel viewManagerModel,
SellViewModel sellViewModel) {
this.viewManagerModel = viewManagerModel;
this.sellViewModel = sellViewModel;
}

@Override
public void prepareSuccessView(SellOutputData response) {
portfolioViewModel.firePropertyChanged();
awesominat marked this conversation as resolved.
Show resolved Hide resolved
viewManagerModel.setActiveView(portfolioViewModel.getViewName());
viewManagerModel.firePropertyChanged();
}

@Override
public void prepareFailView(String error) {
SellState sellState = sellViewModel.getState();
sellState.setAmountError(error);
sellViewModel.firePropertyChanged();
}
}
23 changes: 23 additions & 0 deletions src/interface_adapters/Sell/SellState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package interface_adapters.Sell;

public class SellState {
private String amountError = null;

public SellState(String amountError) {
this.amountError = amountError;
}

public String getAmountError() {
return amountError;
}

public void setAmountError(String amountError) {
this.amountError = amountError;
}

// Because of the previous copy constructor, the default constructor must be explicit. Hence overloading.
public SellState() {

}

}
38 changes: 38 additions & 0 deletions src/interface_adapters/Sell/SellViewModel.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package interface_adapters.Sell;

import interface_adapters.ViewModel;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class SellViewModel extends ViewModel {
// TODO: Ricky
awesominat marked this conversation as resolved.
Show resolved Hide resolved
public final String TITLE_LABEL = "Sell Stock";
public final String AMOUNT_LABEL = "Enter amount";
public final String PURCHASE_BUTTON_LABEL = "Sell";
public final String CANCEL_BUTTON_LABEL = "Cancel";

private SellState state = new SellState();

public SellViewModel() {
super("Sell Stock");
}

public void setState(SellState state) {
this.state = state;
}

private final PropertyChangeSupport support = new PropertyChangeSupport(this);

public void firePropertyChanged() {
support.firePropertyChange("state", null, this.state);
}

public void addPropertyChangeListener(PropertyChangeListener listener) {
support.addPropertyChangeListener(listener);
}

public SellState getState() {
return state;
}
}
7 changes: 7 additions & 0 deletions src/use_cases/Sell/SellDataAccessInterface.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package use_cases.Sell;
import entities.User;

public interface SellDataAccessInterface {
void save(User user);
User get(String username);
}
5 changes: 5 additions & 0 deletions src/use_cases/Sell/SellInputBoundary.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package use_cases.Sell;

public interface SellInputBoundary {
void execute(SellInputData sellInputData);
}
25 changes: 25 additions & 0 deletions src/use_cases/Sell/SellInputData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package use_cases.Sell;

public class SellInputData {
public Double amount;
public String ticker;
public String username;

public SellInputData(Double amount, String ticker, String username) {
this.amount = amount;
this.ticker = ticker;
this.username = username;
}

public Double getAmount() {
return amount;
}

public String getTicker() {
return ticker;
}

public String getUsername() {
return username;
}
}
51 changes: 51 additions & 0 deletions src/use_cases/Sell/SellInteractor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package use_cases.Sell;

import entities.*;
import interface_adapters.Sell.SellOutputBoundary;
import use_cases.APIAccessInterface;
import use_cases.BaseStockInteractor;

import java.time.LocalDate;
import java.util.HashMap;

public class SellInteractor extends BaseStockInteractor implements SellInputBoundary {
final SellDataAccessInterface userDataAccessObject;
SellOutputBoundary sellPresenter;
APIAccessInterface driverAPI;

public SellInteractor(SellDataAccessInterface userDataAccessInterface,
SellOutputBoundary sellPresenter, APIAccessInterface driverAPI) {
super(driverAPI);
this.userDataAccessObject = userDataAccessInterface;
this.sellPresenter = sellPresenter;
this.driverAPI = driverAPI;
}

@Override
public void execute(SellInputData sellInputData) {
String username = sellInputData.getUsername();
String ticker = sellInputData.getTicker();
Double amount = sellInputData.getAmount();

User user = userDataAccessObject.get(username);

if (!user.hasStock(ticker) || user.getStockOwned(ticker) < amount) {
sellPresenter.prepareFailView("You can't sell more than you have.");
return;
}
Double currentPrice = driverAPI.getCurrentPrice(ticker).getPrice();
Double currentlyOwned = user.getStockOwned(ticker);

user.addBalance(currentPrice * amount);
HashMap<String, TransactionHistory> userHistory = user.getHistory();

Transaction transaction = new SellTransaction(amount, new PricePoint(LocalDate.now(), currentPrice));

user.updatePortfolio(ticker, currentlyOwned - amount);
super.addToHistory(userHistory, ticker, user, amount, currentPrice, transaction);
userDataAccessObject.save(user);

SellOutputData result = new SellOutputData(sellInputData.getAmount(), sellInputData.getTicker());
sellPresenter.prepareSuccessView(result);
}
}
19 changes: 19 additions & 0 deletions src/use_cases/Sell/SellOutputData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package use_cases.Sell;

public class SellOutputData {
public Double amount;
public String ticker;

public SellOutputData(Double amount, String ticker) {
this.amount = amount;
this.ticker = ticker;
}

public Double getAmount() {
return amount;
}

public String getTicker() {
return ticker;
}
}
11 changes: 11 additions & 0 deletions stonks.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>