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 868d456..f1639b3 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"); @@ -81,4 +81,12 @@ public class AccountInfoUpdateService { set("transactions." + transactionId + ".status", status), AccountInfo.class); } + + 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 528a9f8..e230892 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); } @@ -74,7 +76,6 @@ public class AccountQueryWorkflow { String accountId = de.getEntityId(); String transactionId = de.getEvent().getTransactionId(); - accountInfoUpdateService.updateTransactionStatus(accountId, transactionId, TransferState.DEBITED); saveChange(de, -1); } @@ -83,16 +84,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) { @@ -107,5 +129,4 @@ public class AccountQueryWorkflow { accountInfoUpdateService.updateBalance(accountId, changeId, balanceDelta, ci); } - } 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)); 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 850c8be..73e7ac5 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 @@ -59,12 +59,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; }