Skip to content

Instantly share code, notes, and snippets.

@xrrocha
Last active May 9, 2022 01:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xrrocha/8b0643ae2fc36a32fd1cdee28a8d50c0 to your computer and use it in GitHub Desktop.
Save xrrocha/8b0643ae2fc36a32fd1cdee28a8d50c0 to your computer and use it in GitHub Desktop.
/* 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