Last active
May 9, 2022 01:14
-
-
Save xrrocha/8b0643ae2fc36a32fd1cdee28a8d50c0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 1) Domain entities: Bank and Account */ | |
typealias Amount = BigDecimal | |
| |
data class Bank(val accounts: MutableMap<String, Account> = HashMap()) | |
| |
data class Account(val id: String, val name: String) { | |
var balance: Amount by TxDelegate(initialValue = Amount.ZERO) { | |
// triggers rollback on validation failure | |
it >= Amount.ZERO | |
} | |
} | |
| |
/* 2) Commands: CreateAccount, Deposit, Withdrawal, Transfer */ | |
data class CreateAccount(val id: String, val name: String) : BankCommand { | |
override fun applyTo(bank: Bank) { | |
bank.accounts[id] = Account(id, name) | |
} | |
} | |
data class Deposit(override val accountId: | |
String, val amount: Amount) : AccountCommand { | |
override fun applyTo(account: Account) { | |
account.balance += amount | |
} | |
} | |
data class Withdrawal(override val accountId: | |
String,val amount: Amount) : AccountCommand { | |
override fun applyTo(account: Account) { | |
account.balance -= amount | |
} | |
} | |
data class Transfer(val fromAccountId: String, | |
val toAccountId: String, | |
val amount: Amount) : BankCommand { | |
override fun applyTo(bank: Bank) { | |
Deposit(toAccountId, amount).applyTo(bank) | |
Withdrawal(fromAccountId, amount).applyTo(bank) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment