From a85390ffb3f93b59cd8e0793e4ce2b50569990c7 Mon Sep 17 00:00:00 2001 From: Sambo Chea Date: Fri, 21 Aug 2020 10:59:20 +0700 Subject: [PATCH] Refactoring on classes and modelling --- .../com/cubetiqs/demo/axon/AxonApplication.kt | 101 +----------------- .../axon/aggregate/BankAccountAggregate.kt | 76 +++++++++++++ .../demo/axon/command/CreateAccountCommand.kt | 12 +++ .../cubetiqs/demo/axon/entity/BankAccount.kt | 22 ++++ 4 files changed, 111 insertions(+), 100 deletions(-) create mode 100644 src/main/kotlin/com/cubetiqs/demo/axon/aggregate/BankAccountAggregate.kt create mode 100644 src/main/kotlin/com/cubetiqs/demo/axon/command/CreateAccountCommand.kt create mode 100644 src/main/kotlin/com/cubetiqs/demo/axon/entity/BankAccount.kt diff --git a/src/main/kotlin/com/cubetiqs/demo/axon/AxonApplication.kt b/src/main/kotlin/com/cubetiqs/demo/axon/AxonApplication.kt index ed76b9a..e87f52b 100644 --- a/src/main/kotlin/com/cubetiqs/demo/axon/AxonApplication.kt +++ b/src/main/kotlin/com/cubetiqs/demo/axon/AxonApplication.kt @@ -1,31 +1,11 @@ package com.cubetiqs.demo.axon -import com.cubetiqs.demo.axon.command.CreditMoneyCommand -import com.cubetiqs.demo.axon.command.DebitMoneyCommand -import com.cubetiqs.demo.axon.event.AccountCreatedEvent -import com.cubetiqs.demo.axon.event.MoneyCreditedEvent -import com.cubetiqs.demo.axon.event.MoneyDebitedEvent -import com.cubetiqs.demo.axon.exception.InsufficientBalanceException -import org.axonframework.commandhandling.CommandHandler -import org.axonframework.eventsourcing.EventSourcingHandler -import org.axonframework.modelling.command.AggregateIdentifier -import org.axonframework.modelling.command.AggregateLifecycle -import org.axonframework.modelling.command.TargetAggregateIdentifier -import org.axonframework.spring.stereotype.Aggregate import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController -import java.io.Serializable -import java.math.BigDecimal -import java.util.UUID -import javax.persistence.Entity -import javax.persistence.GeneratedValue -import javax.persistence.GenerationType -import javax.persistence.Id -import javax.persistence.Table @SpringBootApplication class AxonApplication @@ -41,83 +21,4 @@ class DefaultController { fun index(): ResponseEntity { return ResponseEntity.ok("ok") } -} - -@Entity -@Table(name = "bank_accounts") -data class BankAccount( - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - var id: UUID? = null, - - var owner: String? = null, - - var balance: BigDecimal? = null -) : Serializable - -@Aggregate -class BankAccountAggregate( - @AggregateIdentifier - private var id: UUID? = null, - private var balance: BigDecimal? = null, - private var owner: String? = null -) { - @CommandHandler - constructor(command: CreateAccountCommand) { - AggregateLifecycle.apply( - AccountCreatedEvent( - command.accountId, - command.initialBalance, - command.owner - ) - ) - } - - @EventSourcingHandler - fun on(event: AccountCreatedEvent) { - id = event.id - owner = event.owner - balance = event.initialBalance - } - - @CommandHandler - fun handles(command: CreditMoneyCommand) { - AggregateLifecycle.apply( - MoneyCreditedEvent( - command.accountId, - command.creditAmount - ) - ) - } - - @EventSourcingHandler - fun on(event: MoneyCreditedEvent) { - balance = balance!!.add(event.creditAmount) - } - - @CommandHandler - fun handle(command: DebitMoneyCommand) { - AggregateLifecycle.apply( - MoneyDebitedEvent( - command.accountId, - command.debitAmount - ) - ) - } - - @EventSourcingHandler - @Throws(InsufficientBalanceException::class) - fun on(event: MoneyDebitedEvent) { - if (balance!! < event.debitAmount) { - throw InsufficientBalanceException(event.accountId!!, event.debitAmount!!) - } - balance = balance!!.subtract(event.debitAmount) - } -} - -data class CreateAccountCommand( - @TargetAggregateIdentifier - val accountId: UUID? = null, - val initialBalance: BigDecimal? = null, - val owner: String? = null -) \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/demo/axon/aggregate/BankAccountAggregate.kt b/src/main/kotlin/com/cubetiqs/demo/axon/aggregate/BankAccountAggregate.kt new file mode 100644 index 0000000..6bc49ee --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/demo/axon/aggregate/BankAccountAggregate.kt @@ -0,0 +1,76 @@ +package com.cubetiqs.demo.axon.aggregate + +import com.cubetiqs.demo.axon.command.CreateAccountCommand +import com.cubetiqs.demo.axon.command.CreditMoneyCommand +import com.cubetiqs.demo.axon.command.DebitMoneyCommand +import com.cubetiqs.demo.axon.event.AccountCreatedEvent +import com.cubetiqs.demo.axon.event.MoneyCreditedEvent +import com.cubetiqs.demo.axon.event.MoneyDebitedEvent +import com.cubetiqs.demo.axon.exception.InsufficientBalanceException +import org.axonframework.commandhandling.CommandHandler +import org.axonframework.eventsourcing.EventSourcingHandler +import org.axonframework.modelling.command.AggregateIdentifier +import org.axonframework.modelling.command.AggregateLifecycle +import org.axonframework.spring.stereotype.Aggregate +import java.math.BigDecimal +import java.util.UUID + +@Aggregate +class BankAccountAggregate( + @AggregateIdentifier + private var id: UUID? = null, + private var balance: BigDecimal? = null, + private var owner: String? = null +) { + @CommandHandler + constructor(command: CreateAccountCommand) { + AggregateLifecycle.apply( + AccountCreatedEvent( + command.accountId, + command.initialBalance, + command.owner + ) + ) + } + + @EventSourcingHandler + fun on(event: AccountCreatedEvent) { + id = event.id + owner = event.owner + balance = event.initialBalance + } + + @CommandHandler + fun handles(command: CreditMoneyCommand) { + AggregateLifecycle.apply( + MoneyCreditedEvent( + command.accountId, + command.creditAmount + ) + ) + } + + @EventSourcingHandler + fun on(event: MoneyCreditedEvent) { + balance = balance!!.add(event.creditAmount) + } + + @CommandHandler + fun handle(command: DebitMoneyCommand) { + AggregateLifecycle.apply( + MoneyDebitedEvent( + command.accountId, + command.debitAmount + ) + ) + } + + @EventSourcingHandler + @Throws(InsufficientBalanceException::class) + fun on(event: MoneyDebitedEvent) { + if (balance!! < event.debitAmount) { + throw InsufficientBalanceException(event.accountId!!, event.debitAmount!!) + } + balance = balance!!.subtract(event.debitAmount) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/demo/axon/command/CreateAccountCommand.kt b/src/main/kotlin/com/cubetiqs/demo/axon/command/CreateAccountCommand.kt new file mode 100644 index 0000000..eb616a6 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/demo/axon/command/CreateAccountCommand.kt @@ -0,0 +1,12 @@ +package com.cubetiqs.demo.axon.command + +import org.axonframework.modelling.command.TargetAggregateIdentifier +import java.math.BigDecimal +import java.util.UUID + +data class CreateAccountCommand( + @TargetAggregateIdentifier + val accountId: UUID? = null, + val initialBalance: BigDecimal? = null, + val owner: String? = null +) \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/demo/axon/entity/BankAccount.kt b/src/main/kotlin/com/cubetiqs/demo/axon/entity/BankAccount.kt new file mode 100644 index 0000000..5f7aed6 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/demo/axon/entity/BankAccount.kt @@ -0,0 +1,22 @@ +package com.cubetiqs.demo.axon.entity + +import java.io.Serializable +import java.math.BigDecimal +import java.util.UUID +import javax.persistence.Entity +import javax.persistence.GeneratedValue +import javax.persistence.GenerationType +import javax.persistence.Id +import javax.persistence.Table + +@Entity +@Table(name = "bank_accounts") +data class BankAccount( + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + var id: UUID? = null, + + var owner: String? = null, + + var balance: BigDecimal? = null +) : Serializable \ No newline at end of file