diff --git a/src/main/java/net/digihippo/bread/Account.java b/src/main/java/net/digihippo/bread/Account.java index 846a096..33b1523 100644 --- a/src/main/java/net/digihippo/bread/Account.java +++ b/src/main/java/net/digihippo/bread/Account.java @@ -7,20 +7,37 @@ public class Account { private int balance = 0; private final Map orders = new HashMap(); - 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); + } + } } diff --git a/src/main/java/net/digihippo/bread/AccountRepository.java b/src/main/java/net/digihippo/bread/AccountRepository.java index a1933c8..09ca697 100644 --- a/src/main/java/net/digihippo/bread/AccountRepository.java +++ b/src/main/java/net/digihippo/bread/AccountRepository.java @@ -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); } } \ No newline at end of file diff --git a/src/main/java/net/digihippo/bread/BreadShop.java b/src/main/java/net/digihippo/bread/BreadShop.java index 1e95d7a..5f294a2 100644 --- a/src/main/java/net/digihippo/bread/BreadShop.java +++ b/src/main/java/net/digihippo/bread/BreadShop.java @@ -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() {