#1317 Special Case Pattern (#1624)

* #1317 Add Special Case Pattern

To focus on pattern itself, I implement DB and
maintenance lock by the singleton instance.

* #1317 Add special cases unit tests

Assert the logger output
(ref: https://stackoverflow.com/a/52229629)

* #1317 Add README.md

Add Special Case Pattern README

* #1317 Format: add a new line to end of file

Co-authored-by: Subhrodip Mohanta <subhrodipmohanta@gmail.com>
This commit is contained in:
ignite1771
2021-01-13 15:36:21 +08:00
committed by GitHub
parent bbc4fdfc24
commit dea7ecfb7a
21 changed files with 1084 additions and 0 deletions
@@ -0,0 +1,46 @@
package com.iluwatar.specialcase;
public class DomainServicesImpl implements DomainServices {
/**
* Domain purchase with userName and itemName, with validation for userName.
*
* @param userName of the user
* @param itemName of the item
* @return instance of ReceiptViewModel
*/
public ReceiptViewModel purchase(String userName, String itemName) {
Db.User user = Db.getInstance().findUserByUserName(userName);
if (user == null) {
return new InvalidUser(userName);
}
Db.Account account = Db.getInstance().findAccountByUser(user);
return purchase(user, account, itemName);
}
/**
* Domain purchase with user, account and itemName,
* with validation for whether product is out of stock
* and whether user has insufficient funds in the account.
*
* @param user in Db
* @param account in Db
* @param itemName of the item
* @return instance of ReceiptViewModel
*/
private ReceiptViewModel purchase(Db.User user, Db.Account account, String itemName) {
Db.Product item = Db.getInstance().findProductByItemName(itemName);
if (item == null) {
return new OutOfStock(user.getUserName(), itemName);
}
ReceiptDto receipt = user.purchase(item);
MoneyTransaction transaction = account.withdraw(receipt.getPrice());
if (transaction == null) {
return new InsufficientFunds(user.getUserName(), account.getAmount(), itemName);
}
return receipt;
}
}