diff --git a/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/Account.java b/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/Account.java index a8bbad3..090df31 100644 --- a/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/Account.java +++ b/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/Account.java @@ -16,7 +16,7 @@ public class Account extends ReflectiveMutableCommandProcessingAggregate process(OpenAccountCommand cmd) { - return EventUtil.events(new AccountOpenedEvent(cmd.getCustomerId(), cmd.getInitialBalance())); + return EventUtil.events(new AccountOpenedEvent(cmd.getCustomerId(), cmd.getTitle(), cmd.getInitialBalance())); } public List process(DebitAccountCommand cmd) { diff --git a/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountService.java b/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountService.java index 3c52964..c0ae752 100644 --- a/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountService.java +++ b/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountService.java @@ -14,8 +14,8 @@ public class AccountService { this.accountRepository = accountRepository; } - public rx.Observable> openAccount(String customerId, BigDecimal initialBalance) { - return accountRepository.save(new OpenAccountCommand(customerId, initialBalance)); + public rx.Observable> openAccount(String customerId, String title, BigDecimal initialBalance) { + return accountRepository.save(new OpenAccountCommand(customerId, title, initialBalance)); } } diff --git a/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/OpenAccountCommand.java b/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/OpenAccountCommand.java index 428bf55..4bd4216 100644 --- a/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/OpenAccountCommand.java +++ b/java-spring/accounts-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/OpenAccountCommand.java @@ -6,9 +6,12 @@ import java.math.BigDecimal; public class OpenAccountCommand implements AccountCommand { private String customerId; + private String title; private BigDecimal initialBalance; - public OpenAccountCommand(String customerId, BigDecimal initialBalance) { + public OpenAccountCommand(String customerId, String title, BigDecimal initialBalance) { + this.customerId = customerId; + this.title = title; this.initialBalance = initialBalance; } @@ -19,4 +22,8 @@ public class OpenAccountCommand implements AccountCommand { public String getCustomerId() { return customerId; } + + public String getTitle() { + return title; + } } diff --git a/java-spring/accounts-command-side-backend/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountTest.java b/java-spring/accounts-command-side-backend/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountTest.java index 7696265..15a139d 100644 --- a/java-spring/accounts-command-side-backend/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountTest.java +++ b/java-spring/accounts-command-side-backend/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/accounts/AccountTest.java @@ -14,9 +14,10 @@ public class AccountTest { @Test public void testSomething() { Account account = new Account(); + String title = "My Account"; String customerId = "00000000-00000000"; BigDecimal initialBalance = new BigDecimal(512); - List events = CommandProcessingAggregates.processToList(account, (AccountCommand)new OpenAccountCommand(customerId, initialBalance)); + List events = CommandProcessingAggregates.processToList(account, (AccountCommand)new OpenAccountCommand(customerId, title, initialBalance)); Assert.assertEquals(1, events.size()); Assert.assertEquals(AccountOpenedEvent.class, events.get(0).getClass()); diff --git a/java-spring/accounts-command-side-service/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/web/AccountsCommandSideServiceIntegrationTest.java b/java-spring/accounts-command-side-service/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/web/AccountsCommandSideServiceIntegrationTest.java index c635ed4..fc0e60e 100644 --- a/java-spring/accounts-command-side-service/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/web/AccountsCommandSideServiceIntegrationTest.java +++ b/java-spring/accounts-command-side-service/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/web/AccountsCommandSideServiceIntegrationTest.java @@ -38,11 +38,12 @@ public class AccountsCommandSideServiceIntegrationTest { BigDecimal initialToAccountBalance = new BigDecimal(100); BigDecimal amountToTransfer = new BigDecimal(150); String customerId = "00000000-00000000"; + String title = "My Account"; - final CreateAccountResponse fromAccount = restTemplate.postForEntity(baseUrl("/accounts"), new CreateAccountRequest(customerId, initialFromAccountBalance), CreateAccountResponse.class).getBody(); + final CreateAccountResponse fromAccount = restTemplate.postForEntity(baseUrl("/accounts"), new CreateAccountRequest(customerId, title, initialFromAccountBalance), CreateAccountResponse.class).getBody(); final String fromAccountId = fromAccount.getAccountId(); - CreateAccountResponse toAccount = restTemplate.postForEntity(baseUrl("/accounts"), new CreateAccountRequest(customerId, initialToAccountBalance), CreateAccountResponse.class).getBody(); + CreateAccountResponse toAccount = restTemplate.postForEntity(baseUrl("/accounts"), new CreateAccountRequest(customerId, title, initialToAccountBalance), CreateAccountResponse.class).getBody(); String toAccountId = toAccount.getAccountId(); Assert.assertNotNull(fromAccountId); diff --git a/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/AccountController.java b/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/AccountController.java index 0236b2a..29c2b57 100644 --- a/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/AccountController.java +++ b/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/AccountController.java @@ -22,7 +22,7 @@ public class AccountController { @RequestMapping(method = RequestMethod.POST) public Observable createAccount(@Validated @RequestBody CreateAccountRequest request) { - return accountService.openAccount(request.getCustomerId(), request.getInitialBalance()) + return accountService.openAccount(request.getCustomerId(), request.getTitle(), request.getInitialBalance()) .map(entityAndEventInfo -> new CreateAccountResponse(entityAndEventInfo.getEntityIdentifier().getId())); } } diff --git a/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/CreateAccountRequest.java b/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/CreateAccountRequest.java index 2e43d05..202e62f 100644 --- a/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/CreateAccountRequest.java +++ b/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/CreateAccountRequest.java @@ -10,6 +10,8 @@ public class CreateAccountRequest { @NotNull private String customerId; + private String title; + @NotNull @DecimalMin("0") private BigDecimal initialBalance; @@ -17,8 +19,9 @@ public class CreateAccountRequest { public CreateAccountRequest() { } - public CreateAccountRequest(String customerId, BigDecimal initialBalance) { - + public CreateAccountRequest(String customerId, String title, BigDecimal initialBalance) { + this.customerId = customerId; + this.title = title; this.initialBalance = initialBalance; } @@ -37,4 +40,12 @@ public class CreateAccountRequest { public void setInitialBalance(BigDecimal initialBalance) { this.initialBalance = initialBalance; } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } } 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 6c53270..49ec50a 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 @@ -9,6 +9,7 @@ public class AccountInfo { private String id; private String customerId; + private String title; private long balance; private List changes; private List transactions; @@ -17,10 +18,11 @@ public class AccountInfo { private AccountInfo() { } - public AccountInfo(String id, String customerId, long balance, List changes, List transactions, String version) { + public AccountInfo(String id, String customerId, String title, long balance, List changes, List transactions, String version) { this.id = id; this.customerId = customerId; + this.title = title; this.balance = balance; this.changes = changes; this.transactions = transactions; @@ -35,6 +37,10 @@ public class AccountInfo { return customerId; } + public String getTitle() { + return title; + } + public long getBalance() { return balance; } 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 b5ad651..02cb584 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 @@ -26,11 +26,12 @@ public class AccountInfoUpdateService { - public void create(String accountId, String customerId, BigDecimal initialBalance, String version) { + public void create(String accountId, String customerId, String title, BigDecimal initialBalance, String version) { try { accountInfoRepository.save(new AccountInfo( accountId, customerId, + title, toIntegerRepr(initialBalance), Collections.emptyList(), Collections.emptyList(), 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 2ec9039..934de55 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 @@ -38,7 +38,8 @@ public class AccountQueryWorkflow implements CompoundEventHandler { logger.info("**************** account version=" + id + ", " + eventId); BigDecimal initialBalance = event.getInitialBalance(); String customerId = event.getCustomerId(); - accountInfoUpdateService.create(id, customerId, initialBalance, eventId); + String title = event.getTitle(); + accountInfoUpdateService.create(id, customerId, title, initialBalance, eventId); return Observable.just(null); } diff --git a/java-spring/backend-integration-tests/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/MoneyTransferIntegrationTest.java b/java-spring/backend-integration-tests/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/MoneyTransferIntegrationTest.java index 9c9c54c..11c192e 100644 --- a/java-spring/backend-integration-tests/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/MoneyTransferIntegrationTest.java +++ b/java-spring/backend-integration-tests/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/MoneyTransferIntegrationTest.java @@ -43,9 +43,9 @@ public class MoneyTransferIntegrationTest { @Test public void shouldTransferMoney() { - final EntityWithIdAndVersion fromAccount= await(accountService.openAccount("00000000-00000000", new BigDecimal(150))); + final EntityWithIdAndVersion fromAccount= await(accountService.openAccount("00000000-00000000", "My Account", new BigDecimal(150))); - final EntityWithIdAndVersion toAccount = await(accountService.openAccount("00000000-00000000", new BigDecimal(300))); + final EntityWithIdAndVersion toAccount = await(accountService.openAccount("00000000-00000000", "My Account", new BigDecimal(300))); final EntityWithIdAndVersion transaction = await( moneyTransferService.transferMoney(new TransferDetails(fromAccount.getEntityIdentifier(), @@ -98,9 +98,9 @@ public class MoneyTransferIntegrationTest { @Test public void shouldFailDueToInsufficientFunds() { - final EntityWithIdAndVersion fromAccount= await(accountService.openAccount("00000000-00000000", new BigDecimal(150))); + final EntityWithIdAndVersion fromAccount= await(accountService.openAccount("00000000-00000000", "My Account", new BigDecimal(150))); - final EntityWithIdAndVersion toAccount = await(accountService.openAccount("00000000-00000000", new BigDecimal(300))); + final EntityWithIdAndVersion toAccount = await(accountService.openAccount("00000000-00000000", "My Account", new BigDecimal(300))); final EntityWithIdAndVersion transaction = await( moneyTransferService.transferMoney(new TransferDetails(fromAccount.getEntityIdentifier(), diff --git a/java-spring/backend-integration-tests/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQuerySideIntegrationTest.java b/java-spring/backend-integration-tests/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQuerySideIntegrationTest.java index 6979bf7..647aadf 100644 --- a/java-spring/backend-integration-tests/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQuerySideIntegrationTest.java +++ b/java-spring/backend-integration-tests/src/test/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQuerySideIntegrationTest.java @@ -45,9 +45,9 @@ public class AccountQuerySideIntegrationTest { @Test public void shouldUpdateQuerySide() throws Exception { - final EntityWithIdAndVersion fromAccount = await(accountService.openAccount("00000000-00000000", new BigDecimal(150))); + final EntityWithIdAndVersion fromAccount = await(accountService.openAccount("00000000-00000000", "My Account", new BigDecimal(150))); - final EntityWithIdAndVersion toAccount = await(accountService.openAccount("00000000-00000000", new BigDecimal(300))); + final EntityWithIdAndVersion toAccount = await(accountService.openAccount("00000000-00000000", "My Account", new BigDecimal(300))); final EntityWithIdAndVersion transaction = await( moneyTransferService.transferMoney(new TransferDetails(fromAccount.getEntityIdentifier(), diff --git a/java-spring/common-auth-controller/build.gradle b/java-spring/common-auth-controller/build.gradle new file mode 100644 index 0000000..fe0d772 --- /dev/null +++ b/java-spring/common-auth-controller/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'java' + +dependencies { + compile project(":common-auth") + + compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion" + + compile "org.springframework.security:spring-security-config:4.0.2.RELEASE" + compile "org.springframework.security:spring-security-web:4.0.2.RELEASE" + + + testCompile "junit:junit:4.11" +} diff --git a/java-spring/common-auth-controller/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/controller/AuthController.java b/java-spring/common-auth-controller/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/controller/AuthController.java new file mode 100644 index 0000000..9af29fd --- /dev/null +++ b/java-spring/common-auth-controller/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/controller/AuthController.java @@ -0,0 +1,45 @@ +package net.chrisrichardson.eventstore.javaexamples.banking.commonauth.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.model.AuthRequest; +import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.model.AuthResponse; +import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.model.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.token.Token; +import org.springframework.security.core.token.TokenService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.io.IOException; + +import static org.springframework.web.bind.annotation.RequestMethod.POST; + +/** + * Created by popikyardo on 21.09.15. + */ +@RestController +@Validated +public class AuthController { + + @Autowired + private TokenService tokenService; + + private static ObjectMapper objectMapper = new ObjectMapper(); + + @RequestMapping(value = "/login", method = POST) + public ResponseEntity doAuth(@RequestBody @Valid AuthRequest request) throws IOException { + User user = new User(); + user.setEmail(request.getEmail()); + + Token token = tokenService.allocateToken(objectMapper.writeValueAsString(user)); + return ResponseEntity.status(HttpStatus.OK) + .body(new AuthResponse(token.getKey())); + } + + +} diff --git a/java-spring/common-auth-controller/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/model/AuthRequest.java b/java-spring/common-auth-controller/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/model/AuthRequest.java new file mode 100644 index 0000000..0b0f3a6 --- /dev/null +++ b/java-spring/common-auth-controller/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/model/AuthRequest.java @@ -0,0 +1,29 @@ +package net.chrisrichardson.eventstore.javaexamples.banking.commonauth.model; + +import org.hibernate.validator.constraints.Email; +import org.hibernate.validator.constraints.NotBlank; + +/** + * Created by popikyardo on 19.10.15. + */ +public class AuthRequest { + + @NotBlank + @Email + private String email; + + public AuthRequest() { + } + + public AuthRequest(String email) { + this.email = email; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/java-spring/common-auth-controller/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/model/AuthResponse.java b/java-spring/common-auth-controller/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/model/AuthResponse.java new file mode 100644 index 0000000..0ef4336 --- /dev/null +++ b/java-spring/common-auth-controller/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/model/AuthResponse.java @@ -0,0 +1,23 @@ +package net.chrisrichardson.eventstore.javaexamples.banking.commonauth.model; + +/** + * Created by popikyardo on 21.09.15. + */ +public class AuthResponse { + private String token; + + public AuthResponse() { + } + + public AuthResponse(String token) { + this.token = token; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } +} diff --git a/java-spring/common-auth/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/AuthConfiguration.java b/java-spring/common-auth/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/AuthConfiguration.java index 2a12c35..6a0808c 100755 --- a/java-spring/common-auth/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/AuthConfiguration.java +++ b/java-spring/common-auth/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/commonauth/AuthConfiguration.java @@ -55,7 +55,9 @@ public class AuthConfiguration extends WebSecurityConfigurerAdapter { .antMatchers("/js/**").permitAll() .antMatchers("/styles/**").permitAll() .antMatchers("/views/**").permitAll() - .antMatchers(HttpMethod.POST, "/authenticate").permitAll() + .antMatchers(HttpMethod.POST, "/register/step_1").permitAll() + .antMatchers(HttpMethod.POST, "/register/step_2").permitAll() + .antMatchers(HttpMethod.POST, "/login").permitAll() .anyRequest().authenticated().and() .addFilterBefore(new StatelessAuthenticationFilter(tokenAuthenticationService), UsernamePasswordAuthenticationFilter.class); } diff --git a/java-spring/common-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/common/accounts/AccountOpenedEvent.java b/java-spring/common-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/common/accounts/AccountOpenedEvent.java index 1d05768..af89e5b 100644 --- a/java-spring/common-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/common/accounts/AccountOpenedEvent.java +++ b/java-spring/common-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/common/accounts/AccountOpenedEvent.java @@ -8,13 +8,15 @@ import java.math.BigDecimal; public class AccountOpenedEvent implements Event { private String customerId; + private String title; private BigDecimal initialBalance; private AccountOpenedEvent() { } - public AccountOpenedEvent(String customerId, BigDecimal initialBalance) { + public AccountOpenedEvent(String customerId, String title, BigDecimal initialBalance) { this.customerId = customerId; + this.title = title; this.initialBalance = initialBalance; } @@ -22,6 +24,10 @@ public class AccountOpenedEvent implements Event { return customerId; } + public String getTitle() { + return title; + } + public BigDecimal getInitialBalance() { return initialBalance; } diff --git a/java-spring/common-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/common/customers/CustomerAddedToAccount.java b/java-spring/common-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/common/customers/CustomerAddedToAccount.java new file mode 100644 index 0000000..d1a17b5 --- /dev/null +++ b/java-spring/common-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/common/customers/CustomerAddedToAccount.java @@ -0,0 +1,46 @@ +package net.chrisrichardson.eventstore.javaexamples.banking.backend.common.customers; + +import net.chrisrichardson.eventstore.Event; + +/** + * Created by Main on 08.02.2016. + */ +public class CustomerAddedToAccount implements Event { + + private String accountId; + private String accountOwner; + private String title; + + public CustomerAddedToAccount() { + } + + public CustomerAddedToAccount(String accountId, String accountOwner, String title) { + this.accountId = accountId; + this.accountOwner = accountOwner; + this.title = title; + } + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getAccountOwner() { + return accountOwner; + } + + public void setAccountOwner(String accountOwner) { + this.accountOwner = accountOwner; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/java-spring/customers-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/customers/AddToAccountCommand.java b/java-spring/customers-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/customers/AddToAccountCommand.java new file mode 100644 index 0000000..7cb06c9 --- /dev/null +++ b/java-spring/customers-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/customers/AddToAccountCommand.java @@ -0,0 +1,29 @@ +package net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.customers; + +/** + * Created by Main on 08.02.2016. + */ +public class AddToAccountCommand implements CustomerCommand { + + private String accountId; + private String accountOwner; + private String title; + + public AddToAccountCommand(String accountId, String accountOwner, String title) { + this.accountId = accountId; + this.accountOwner = accountOwner; + this.title = title; + } + + public String getAccountId() { + return accountId; + } + + public String getAccountOwner() { + return accountOwner; + } + + public String getTitle() { + return title; + } +} diff --git a/java-spring/customers-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/customers/CustomerService.java b/java-spring/customers-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/customers/CustomerService.java index c312a36..1e7a493 100644 --- a/java-spring/customers-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/customers/CustomerService.java +++ b/java-spring/customers-command-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/commandside/customers/CustomerService.java @@ -1,6 +1,7 @@ package net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.customers; +import net.chrisrichardson.eventstore.EntityIdentifier; import net.chrisrichardson.eventstore.EntityWithIdAndVersion; import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerInfo; import net.chrisrichardson.eventstore.repository.AggregateRepository; @@ -17,4 +18,8 @@ public class CustomerService { return accountRepository.save(new CreateCustomerCommand(customerInfo)); } + public rx.Observable> addToAccount(String customerId, String accountId, String title, String owner) { + return accountRepository.update(new EntityIdentifier(customerId), new AddToAccountCommand(accountId, title, owner)); + } + } diff --git a/java-spring/customers-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/customers/CustomerController.java b/java-spring/customers-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/customers/CustomerController.java index 1d6d231..6a19b99 100644 --- a/java-spring/customers-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/customers/CustomerController.java +++ b/java-spring/customers-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/customers/CustomerController.java @@ -4,18 +4,16 @@ import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.c import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerInfo; import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerResponse; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import rx.Observable; /** * Created by popikyardo on 03.02.16. */ @RestController -@RequestMapping("/accounts") +@RequestMapping("/customer") public class CustomerController { private CustomerService customerService; @@ -26,8 +24,15 @@ public class CustomerController { } @RequestMapping(method = RequestMethod.POST) - public Observable createAccount(@Validated @RequestBody CustomerInfo request) { + public Observable createCustomer(@Validated @RequestBody CustomerInfo request) { return customerService.createCustomer(request) .map(entityAndEventInfo -> new CustomerResponse(entityAndEventInfo.getEntityIdentifier().getId(), request)); } + + @RequestMapping(value = "/{id}/toaccounts", method = RequestMethod.POST) + public Observable> addToAccount(@PathVariable String id, @Validated @RequestBody ToAccountsRequest request) { + return customerService.addToAccount(id, request.getId(), request.getTitle(), request.getOwner()) + .map(entityAndEventInfo -> ResponseEntity.ok().build()); + } + } diff --git a/java-spring/customers-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/customers/ToAccountsRequest.java b/java-spring/customers-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/customers/ToAccountsRequest.java new file mode 100644 index 0000000..1c218f3 --- /dev/null +++ b/java-spring/customers-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/customers/ToAccountsRequest.java @@ -0,0 +1,43 @@ +package net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.customers; + +/** + * Created by Main on 08.02.2016. + */ +public class ToAccountsRequest { + private String id; + private String title; + private String owner; + + public ToAccountsRequest() { + } + + public ToAccountsRequest(String id, String title, String owner) { + this.id = id; + this.title = title; + this.owner = owner; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } +} diff --git a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerInfoUpdateService.java b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerInfoUpdateService.java index 7acb109..07ec6bd 100644 --- a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerInfoUpdateService.java +++ b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerInfoUpdateService.java @@ -3,6 +3,13 @@ package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.cu import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; + +import java.util.Collections; + +import static org.springframework.data.mongodb.core.query.Criteria.where; /** * Created by Main on 04.02.2016. @@ -11,19 +18,25 @@ public class CustomerInfoUpdateService { private Logger logger = LoggerFactory.getLogger(getClass()); - private CustomerInfoRepository accountInfoRepository; + private QuerySideCustomerRepository accountInfoRepository; + private MongoTemplate mongoTemplate; - public CustomerInfoUpdateService(CustomerInfoRepository accountInfoRepository) { + public CustomerInfoUpdateService(QuerySideCustomerRepository accountInfoRepository, MongoTemplate mongoTemplate) { this.accountInfoRepository = accountInfoRepository; + this.mongoTemplate = mongoTemplate; } public void create(String id, CustomerInfo customerInfo) { try { - accountInfoRepository.save(new CustomerInfoWithId(id, - customerInfo.getEmail(), - customerInfo.getSsn(), - customerInfo.getPhoneNumber(), - customerInfo.getAddress()) + accountInfoRepository.save(new QuerySideCustomer(id, + "", + "", + customerInfo.getEmail(), + customerInfo.getSsn(), + customerInfo.getPhoneNumber(), + customerInfo.getAddress(), + Collections.emptyList() + ) ); logger.info("Saved in mongo"); } catch (Throwable t) { @@ -32,4 +45,11 @@ public class CustomerInfoUpdateService { } } + public void addToAccount(String id, ToAccountInfo accountInfo) { + mongoTemplate.updateMulti(new Query(where("id").is(id)), + new Update(). + push("toAccounts", accountInfo), + QuerySideCustomer.class); + } + } diff --git a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerInfoWithId.java b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerInfoWithId.java deleted file mode 100644 index 3aacdd9..0000000 --- a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerInfoWithId.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.customers; - -import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.Address; -import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerInfo; - -/** - * Created by Main on 05.02.2016. - */ -public class CustomerInfoWithId extends CustomerInfo { - private String id; - - public CustomerInfoWithId(String id, String email, String ssn, String phoneNumber, Address address) { - super(email, ssn, phoneNumber, address); - this.id = id; - } - - public String getId() { - return id; - } -} diff --git a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerQueryService.java b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerQueryService.java index 2c873ef..2862184 100644 --- a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerQueryService.java +++ b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerQueryService.java @@ -7,22 +7,22 @@ import java.util.List; public class CustomerQueryService { - private CustomerInfoRepository customerInfoRepository; + private QuerySideCustomerRepository querySideCustomerRepository; - public CustomerQueryService(CustomerInfoRepository customerInfoRepository) { - this.customerInfoRepository = customerInfoRepository; + public CustomerQueryService(QuerySideCustomerRepository querySideCustomerRepository) { + this.querySideCustomerRepository = querySideCustomerRepository; } - public Observable findByCustomerId(EntityIdentifier customerId) { - CustomerInfoWithId customer = customerInfoRepository.findOne(customerId.getId()); + public Observable findByCustomerId(EntityIdentifier customerId) { + QuerySideCustomer customer = querySideCustomerRepository.findOne(customerId.getId()); if (customer == null) return Observable.error(new CustomerNotFoundException(customerId.getId())); else return Observable.just(customer); } - public Observable> findByEmail(String email){ - List customers = customerInfoRepository.findByEmailLike(email); + public Observable> findByEmail(String email){ + List customers = querySideCustomerRepository.findByEmailLike(email); if (customers.isEmpty()) return Observable.error(new CustomersNotFoundException()); else diff --git a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerQueryWorkflow.java b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerQueryWorkflow.java index e68a6d7..2f49dd3 100644 --- a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerQueryWorkflow.java +++ b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerQueryWorkflow.java @@ -1,5 +1,6 @@ package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.customers; +import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.customers.CustomerAddedToAccount; import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.customers.CustomerCreatedEvent; import net.chrisrichardson.eventstore.subscriptions.CompoundEventHandler; import net.chrisrichardson.eventstore.subscriptions.DispatchedEvent; @@ -28,10 +29,21 @@ public class CustomerQueryWorkflow implements CompoundEventHandler { public Observable create(DispatchedEvent de) { CustomerCreatedEvent event = de.event(); String id = de.getEntityIdentifier().getId(); - String eventId = de.eventId().asString(); - logger.info("**************** customer version=" + id + ", " + eventId); customerInfoUpdateService.create(id, event.getCustomerInfo()); return Observable.just(null); } + @EventHandlerMethod + public Observable addToAccount(DispatchedEvent de) { + CustomerAddedToAccount event = de.event(); + String id = de.getEntityIdentifier().getId(); + + ToAccountInfo toAccountInfo = new ToAccountInfo(event.getAccountId(), + event.getTitle(), + event.getAccountOwner()); + + customerInfoUpdateService.addToAccount(id, toAccountInfo); + return Observable.just(null); + } + } diff --git a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/QuerySideCustomer.java b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/QuerySideCustomer.java new file mode 100644 index 0000000..8bffb20 --- /dev/null +++ b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/QuerySideCustomer.java @@ -0,0 +1,40 @@ +package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.customers; + +import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.Address; +import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerInfo; + +import java.util.List; + +/** + * Created by Main on 05.02.2016. + */ +public class QuerySideCustomer extends CustomerInfo { + private String id; + protected String firstName; + protected String lastName; + private List toAccounts; + + public QuerySideCustomer(String id, String firstName, String lastName, String email, String ssn, String phoneNumber, Address address, List toAccounts) { + super(email, ssn, phoneNumber, address); + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.toAccounts = toAccounts; + } + + public String getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public List getToAccounts() { + return toAccounts; + } +} diff --git a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/QuerySideCustomerConfiguration.java b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/QuerySideCustomerConfiguration.java index 9be1fe0..6b9fdf2 100644 --- a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/QuerySideCustomerConfiguration.java +++ b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/QuerySideCustomerConfiguration.java @@ -19,12 +19,12 @@ public class QuerySideCustomerConfiguration { } @Bean - public CustomerInfoUpdateService customerInfoUpdateService(CustomerInfoRepository customerInfoRepository) { - return new CustomerInfoUpdateService(customerInfoRepository); + public CustomerInfoUpdateService customerInfoUpdateService(QuerySideCustomerRepository querySideCustomerRepository) { + return new CustomerInfoUpdateService(querySideCustomerRepository); } @Bean - public CustomerQueryService customerQueryService(CustomerInfoRepository accountInfoRepository) { + public CustomerQueryService customerQueryService(QuerySideCustomerRepository accountInfoRepository) { return new CustomerQueryService(accountInfoRepository); } diff --git a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerInfoRepository.java b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/QuerySideCustomerRepository.java similarity index 55% rename from java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerInfoRepository.java rename to java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/QuerySideCustomerRepository.java index 2111406..258a33a 100644 --- a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/CustomerInfoRepository.java +++ b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/QuerySideCustomerRepository.java @@ -4,7 +4,7 @@ import org.springframework.data.mongodb.repository.MongoRepository; import java.util.List; -interface CustomerInfoRepository extends MongoRepository { +interface QuerySideCustomerRepository extends MongoRepository { - List findByEmailLike(String email); + List findByEmailLike(String email); } diff --git a/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/ToAccountInfo.java b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/ToAccountInfo.java new file mode 100644 index 0000000..c47f39c --- /dev/null +++ b/java-spring/customers-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/customers/ToAccountInfo.java @@ -0,0 +1,29 @@ +package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.customers; + + +/** + * Created by Main on 08.02.2016. + */ +public class ToAccountInfo { + private String id; + private String title; + private String owner; + + public ToAccountInfo(String id, String title, String owner) { + this.id = id; + this.title = title; + this.owner = owner; + } + + public String getId() { + return id; + } + + public String getTitle() { + return title; + } + + public String getOwner() { + return owner; + } +} diff --git a/java-spring/customers-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/customers/CustomerQueryController.java b/java-spring/customers-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/customers/CustomerQueryController.java index a0151c2..5035759 100644 --- a/java-spring/customers-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/customers/CustomerQueryController.java +++ b/java-spring/customers-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/customers/CustomerQueryController.java @@ -1,7 +1,7 @@ package net.chrisrichardson.eventstore.javaexamples.banking.web.queryside.customers; import net.chrisrichardson.eventstore.EntityIdentifier; -import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.customers.CustomerInfoWithId; +import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.customers.QuerySideCustomer; import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.customers.CustomerNotFoundException; import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.customers.CustomerQueryService; import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.customers.CustomersNotFoundException; @@ -52,14 +52,14 @@ public class CustomerQueryController { } - private CustomerResponse getCustomerResponse(CustomerInfoWithId customerInfoWithId) { - return new CustomerResponse(customerInfoWithId.getId(), new CustomerInfo(customerInfoWithId.getEmail(), - customerInfoWithId.getSsn(), - customerInfoWithId.getPhoneNumber(), - customerInfoWithId.getAddress())); + private CustomerResponse getCustomerResponse(QuerySideCustomer querySideCustomer) { + return new CustomerResponse(querySideCustomer.getId(), new CustomerInfo(querySideCustomer.getEmail(), + querySideCustomer.getSsn(), + querySideCustomer.getPhoneNumber(), + querySideCustomer.getAddress())); } - private CustomersQueryResponse getCustomersQueryResponse(List customersList) { + private CustomersQueryResponse getCustomersQueryResponse(List customersList) { return new CustomersQueryResponse(customersList .stream() .map(this::getCustomerResponse) diff --git a/java-spring/schemas/java-mt-demo-extended-api.json b/java-spring/schemas/java-mt-demo-extended-api.json index 0287e73..cb5fa93 100644 --- a/java-spring/schemas/java-mt-demo-extended-api.json +++ b/java-spring/schemas/java-mt-demo-extended-api.json @@ -272,6 +272,47 @@ } } } + }, + "/customers/{id}/toaccounts": { + "post": { + "tags": [ + "customer-service-command-side-controller" + ], + "summary": "addToAccount", + "operationId": "addToAccountUsingPOST", + "consumes": [ + "application/json" + ], + "produces": [ + "*/*" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "id", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "request", + "description": "request", + "required": true, + "schema": { + "$ref": "#/definitions/ToAccountsRequest" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Validation error" + } + } + } } }, "definitions": { @@ -376,6 +417,20 @@ } } }, + "ToAccountsRequest":{ + "required": [ "id", "owner" ], + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "owner": { + "type": "string" + } + } + }, "Address": { "properties": { "street1": { @@ -392,7 +447,7 @@ }, "zipCode": { "type": "string" - }, + } } } } diff --git a/java-spring/settings.gradle b/java-spring/settings.gradle index 98b538a..bd1aad8 100644 --- a/java-spring/settings.gradle +++ b/java-spring/settings.gradle @@ -32,4 +32,5 @@ include 'customers-query-side-web' include 'common-customers' include 'customers-command-side-service' include 'customers-query-side-service' +include 'common-auth-controller'