Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 25 additions & 8 deletions src/main/java/net/digihippo/bread/Account.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,37 @@ public class Account {
private int balance = 0;
private final Map<Integer, Integer> orders = new HashMap<Integer, Integer>();

public int getBalance() {
return balance;
}

public int deposit(int creditAmount) {
public void deposit(int creditAmount, int accountId, OutboundEvents events) {
balance += creditAmount;
return balance;
events.newAccountBalance(accountId, balance);
}

public void addOrder(int orderId, int amount) {
orders.put(orderId, amount);
}

public Integer cancelOrder(int orderId) {
return orders.remove(orderId);
public void cancelOrder(int accountId, int orderId, OutboundEvents events) {

Integer cancelledQuantity = orders.remove(orderId);

if (cancelledQuantity == null) {
events.orderNotFound(accountId, orderId);
return;
}

this.deposit(cancelledQuantity * BreadShop.PRICE_OF_BREAD, accountId, events);
events.orderCancelled(accountId, orderId);
}

public void placeOrder(int accountId, int orderId, int amount, OutboundEvents events) {
int cost = amount * BreadShop.PRICE_OF_BREAD;
if (balance >= cost) {
this.addOrder(orderId, amount);
this.deposit(-cost, accountId, events);
events.orderPlaced(accountId, amount);
} else {
events.orderRejected(accountId);
}

}
}
27 changes: 25 additions & 2 deletions src/main/java/net/digihippo/bread/AccountRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,30 @@ void addAccount(int id, Account newAccount) {
accounts.put(id, newAccount);
}

Account getAccount(int accountId) {
return accounts.get(accountId);
public void deposit(int accountId, int creditAmount, OutboundEvents events) {
if (!accounts.containsKey(accountId)) {
events.accountNotFound(accountId);
return;
}
accounts.get(accountId).deposit(creditAmount, accountId, events);
}

public void placeOrder(int accountId, int orderId, int amount, OutboundEvents events) {
if (!accounts.containsKey(accountId)) {
events.accountNotFound(accountId);
return;
}
Account account = accounts.get(accountId);
account.placeOrder(accountId, orderId, amount, events);
}

public void cancelOrder(int accountId, int orderId, OutboundEvents events) {
if (!accounts.containsKey(accountId)) {
events.accountNotFound(accountId);
return;
}

Account account = accounts.get(accountId);
account.cancelOrder(accountId, orderId, events);
}
}
41 changes: 3 additions & 38 deletions src/main/java/net/digihippo/bread/BreadShop.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,50 +17,15 @@ public void createAccount(int id) {
}

public void deposit(int accountId, int creditAmount) {
Account account = accountRepository.getAccount(accountId);
if (account != null) {
final int newBalance = account.deposit(creditAmount);
events.newAccountBalance(accountId, newBalance);
} else {
events.accountNotFound(accountId);
}
accountRepository.deposit(accountId, creditAmount, events);
}

public void placeOrder(int accountId, int orderId, int amount) {
Account account = accountRepository.getAccount(accountId);
if (account != null) {
int cost = amount * PRICE_OF_BREAD;
if (account.getBalance() >= cost) {
account.addOrder(orderId, amount);
int newBalance = account.deposit(-cost);
events.orderPlaced(accountId, amount);
events.newAccountBalance(accountId, newBalance);
} else {
events.orderRejected(accountId);
}
} else {
events.accountNotFound(accountId);
}
accountRepository.placeOrder(accountId, orderId, amount, events);
}

public void cancelOrder(int accountId, int orderId) {
Account account = accountRepository.getAccount(accountId);
if (account == null)
{
events.accountNotFound(accountId);
return;
}

Integer cancelledQuantity = account.cancelOrder(orderId);
if (cancelledQuantity == null)
{
events.orderNotFound(accountId, orderId);
return;
}

int newBalance = account.deposit(cancelledQuantity * PRICE_OF_BREAD);
events.orderCancelled(accountId, orderId);
events.newAccountBalance(accountId, newBalance);
accountRepository.cancelOrder(accountId, orderId, events);
}

public void placeWholesaleOrder() {
Expand Down