From 7c47d590dfff8bda19d6085b6a107ac365707a32 Mon Sep 17 00:00:00 2001 From: dartpopikyardo Date: Wed, 7 Sep 2016 19:50:17 +0300 Subject: [PATCH 1/3] private-event-sourcing-examples-26 solved comments on previous commit: - changed getting Content-Type header for GatewayController - updated transaction state change logic - renamed "date" field in AccountInfo --- .../queryside/accounts/AccountInfo.java | 12 ++++--- .../accounts/AccountInfoUpdateService.java | 14 +++++--- .../accounts/AccountQueryWorkflow.java | 35 +++++++++++++++---- .../controller/GatewayController.java | 6 ++-- 4 files changed, 47 insertions(+), 20 deletions(-) diff --git a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfo.java b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfo.java index cd134f1..8574f66 100644 --- a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfo.java +++ b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfo.java @@ -1,5 +1,6 @@ package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts; +import com.fasterxml.jackson.annotation.JsonProperty; import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.AccountChangeInfo; import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.AccountTransactionInfo; import net.chrisrichardson.eventstore.javaexamples.banking.common.transactions.TransferState; @@ -19,7 +20,8 @@ public class AccountInfo { private List changes; private Map transactions; private String version; - private Date date; + @JsonProperty("date") + private Date creationDate; private AccountInfo() { } @@ -28,7 +30,7 @@ public class AccountInfo { this(id, customerId, title, description, balance, changes, transactions, version, new Date()); } - public AccountInfo(String id, String customerId, String title, String description, long balance, List changes, Map transactions, String version, Date date) { + public AccountInfo(String id, String customerId, String title, String description, long balance, List changes, Map transactions, String version, Date creationDate) { this.id = id; this.customerId = customerId; @@ -38,7 +40,7 @@ public class AccountInfo { this.changes = changes; this.transactions = transactions; this.version = version; - this.date = date; + this.creationDate = creationDate; } public String getId() { @@ -73,7 +75,7 @@ public class AccountInfo { return version; } - public Date getDate() { - return date; + public Date getCreationDate() { + return creationDate; } } diff --git a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfoUpdateService.java b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfoUpdateService.java index 9fe105d..71751f3 100644 --- a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfoUpdateService.java +++ b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfoUpdateService.java @@ -40,7 +40,7 @@ public class AccountInfoUpdateService { .set("description", description) .set("balance", toIntegerRepr(initialBalance)) .push("changes", ci) - .set("date", new Date()) + .set("date", getFromEventId(version)) .set("version", version), AccountInfo.class); logger.info("Saved in mongo"); @@ -55,12 +55,10 @@ public class AccountInfoUpdateService { public void addTransaction(String accountId, AccountTransactionInfo ti) { - System.out.println("Start addTransaction for: "+ti.toString()); mongoTemplate.upsert(new Query(where("id").is(accountId)), new Update(). set("transactions." + ti.getTransactionId(), ti), AccountInfo.class); - System.out.println("End addTransaction for: "+ti.toString()); } @@ -74,11 +72,17 @@ public class AccountInfoUpdateService { } public void updateTransactionStatus(String accountId, String transactionId, TransferState status) { - System.out.println("Start updateTransactionStatus "+accountId +" "+transactionId+" "+status); mongoTemplate.upsert(new Query(where("id").is(accountId)), new Update(). set("transactions." + transactionId + ".status", status), AccountInfo.class); - System.out.println("End updateTransactionStatus "+accountId +" "+transactionId+" "+status); + } + + private Date getFromEventId(String eventId) { + String[] s = eventId.split("-"); + if (s.length != 2) { + return new Date(); + } + return new Date(Long.parseUnsignedLong(s[0], 16)); } } diff --git a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQueryWorkflow.java b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQueryWorkflow.java index a8f0780..e94be56 100644 --- a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQueryWorkflow.java +++ b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQueryWorkflow.java @@ -15,6 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigDecimal; +import java.util.Date; import static net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts.MoneyUtil.toIntegerRepr; @@ -40,6 +41,7 @@ public class AccountQueryWorkflow { String customerId = event.getCustomerId(); String title = event.getTitle(); String description = event.getDescription(); + accountInfoUpdateService.create(id, customerId, title, initialBalance, description, eventId); } @@ -68,7 +70,6 @@ public class AccountQueryWorkflow { String accountId = de.getEntityId(); String transactionId = de.getEvent().getTransactionId(); - accountInfoUpdateService.updateTransactionStatus(accountId, transactionId, TransferState.DEBITED); saveChange(de, -1); } @@ -77,16 +78,37 @@ public class AccountQueryWorkflow { String accountId = de.getEntityId(); String transactionId = de.getEvent().getTransactionId(); - accountInfoUpdateService.updateTransactionStatus(accountId, transactionId, TransferState.COMPLETED); saveChange(de, +1); } @EventHandlerMethod - public void recordFailed(DispatchedEvent de) { - String accountId = de.getEntityId(); - String transactionId = de.getEvent().getTransactionId(); + public void updateDebitTransactionState(DispatchedEvent de) { + String transactionId = de.getEntityId(); + String fromAccountId = de.getEvent().getDetails().getFromAccountId(); + String toAccountId = de.getEvent().getDetails().getToAccountId(); - accountInfoUpdateService.updateTransactionStatus(accountId, transactionId, TransferState.FAILED_DUE_TO_INSUFFICIENT_FUNDS); + accountInfoUpdateService.updateTransactionStatus(fromAccountId, transactionId, TransferState.DEBITED); + accountInfoUpdateService.updateTransactionStatus(toAccountId, transactionId, TransferState.DEBITED); + } + + @EventHandlerMethod + public void updateCreditTransactionState(DispatchedEvent de) { + String transactionId = de.getEntityId(); + String fromAccountId = de.getEvent().getDetails().getFromAccountId(); + String toAccountId = de.getEvent().getDetails().getToAccountId(); + + accountInfoUpdateService.updateTransactionStatus(fromAccountId, transactionId, TransferState.COMPLETED); + accountInfoUpdateService.updateTransactionStatus(toAccountId, transactionId, TransferState.COMPLETED); + } + + @EventHandlerMethod + public void recordFailed(DispatchedEvent de) { + String transactionId = de.getEntityId(); + String fromAccountId = de.getEvent().getDetails().getFromAccountId(); + String toAccountId = de.getEvent().getDetails().getToAccountId(); + + accountInfoUpdateService.updateTransactionStatus(fromAccountId, transactionId, TransferState.FAILED_DUE_TO_INSUFFICIENT_FUNDS); + accountInfoUpdateService.updateTransactionStatus(toAccountId, transactionId, TransferState.FAILED_DUE_TO_INSUFFICIENT_FUNDS); } public void saveChange(DispatchedEvent de, int delta) { @@ -101,5 +123,4 @@ public class AccountQueryWorkflow { accountInfoUpdateService.updateBalance(accountId, changeId, balanceDelta, ci); } - } diff --git a/java-spring/api-gateway-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/apigateway/controller/GatewayController.java b/java-spring/api-gateway-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/apigateway/controller/GatewayController.java index 347ba21..291a733 100755 --- a/java-spring/api-gateway-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/apigateway/controller/GatewayController.java +++ b/java-spring/api-gateway-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/apigateway/controller/GatewayController.java @@ -64,12 +64,12 @@ public class GatewayController { logger.info("request: {}", proxiedRequest); HttpResponse proxiedResponse = httpClient.execute(proxiedRequest); logger.info("Response {}", proxiedResponse.getStatusLine().getStatusCode()); - return new ResponseEntity<>(read(proxiedResponse.getEntity().getContent()), processHeaders(proxiedResponse.getAllHeaders()), HttpStatus.valueOf(proxiedResponse.getStatusLine().getStatusCode())); + return new ResponseEntity<>(read(proxiedResponse.getEntity().getContent()), processHeaders(proxiedResponse.getFirstHeader("Content-Type")), HttpStatus.valueOf(proxiedResponse.getStatusLine().getStatusCode())); } - private HttpHeaders processHeaders(Header[] headers) { + private HttpHeaders processHeaders(Header h) { HttpHeaders result = new HttpHeaders(); - Stream.of(headers).filter(h -> h.getName().equalsIgnoreCase("Content-Type")).forEach( h -> result.set(h.getName(), h.getValue())); + result.set(h.getName(), h.getValue()); return result; } From c916bc85eb218098cce0ffd5d5a476c4ac5c4c1b Mon Sep 17 00:00:00 2001 From: dartpopikyardo Date: Wed, 7 Sep 2016 20:08:36 +0300 Subject: [PATCH 2/3] fixed getDate() --- .../banking/web/queryside/accounts/AccountQueryController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java b/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java index 455ddf1..fd31810 100644 --- a/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java +++ b/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java @@ -52,7 +52,7 @@ public class AccountQueryController { public ResponseEntity getTransactionsHistory(@PathVariable String accountId) { AccountInfo accountInfo = accountInfoQueryService.findByAccountId(accountId); List historyEntries = new ArrayList<>(); - historyEntries.add(new AccountOpenInfo(accountInfo.getDate(), AccountHistoryEntry.EntryType.account, accountInfo.getChanges().get(0).getAmount())); + historyEntries.add(new AccountOpenInfo(accountInfo.getCreationDate(), AccountHistoryEntry.EntryType.account, accountInfo.getChanges().get(0).getAmount())); accountInfo.getTransactions().forEach(historyEntries::add); return ResponseEntity.ok().body(new AccountHistoryResponse(historyEntries)); From ab4026a0e940b4cf59821152d59cf2a941bf0883 Mon Sep 17 00:00:00 2001 From: dartpopikyardo Date: Tue, 20 Sep 2016 18:37:48 +0300 Subject: [PATCH 3/3] removed redundant EventHandler method from accounts-commandside-backend --- .../backend/commandside/accounts/AccountWorkflow.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountWorkflow.java b/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountWorkflow.java index 2654af1..cdc3fb8 100644 --- a/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountWorkflow.java +++ b/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountWorkflow.java @@ -35,12 +35,4 @@ public class AccountWorkflow { return ctx.update(Account.class, fromAccountId, new CreditAccountCommand(amount, transactionId)); } - - @EventHandlerMethod - public CompletableFuture> deleteAccount(EventHandlerContext ctx) { - CustomerToAccountDeleted event = ctx.getEvent(); - String accountId = event.getAccountId(); - - return ctx.update(Account.class, accountId, new DeleteAccountCommand()); - } }