From 179cdbb5f0b7ea19df4ca1feb95ca39b9930f44e Mon Sep 17 00:00:00 2001 From: soulaimanGhailan Date: Tue, 3 Jun 2025 01:11:24 +0100 Subject: [PATCH 1/4] FIX 2 : handling commands type switch removal Signed-off-by: soulaimanGhailan --- .../command/aggregates/AccountAggregate.java | 39 +------------------ .../cqrs/command/commands/BaseCommand.java | 4 +- .../commands/CreateAccountCommand.java | 14 +++++++ .../commands/CreditAccountCommand.java | 13 +++++++ .../command/commands/DebitAccountCommand.java | 11 ++++++ .../commands/UpdateAccountStatusCommand.java | 10 +++++ .../controlles/AccountCommandRest.java | 9 +++-- .../common/Dtos/UpdateAccountStatusDTO.java | 3 +- 8 files changed, 59 insertions(+), 44 deletions(-) diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/aggregates/AccountAggregate.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/aggregates/AccountAggregate.java index 07ba9bb5a..618a9735c 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/aggregates/AccountAggregate.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/aggregates/AccountAggregate.java @@ -37,45 +37,8 @@ public AccountAggregate(EventProducer eventProducer, EventStoreRepository eventS @JmsListener(destination = "${txeventq.queue.commands.name}", id = "sampleCommand") void handleCommand(BaseCommand command) { - - BaseEvent event; - - switch (command) { - case CreateAccountCommand createAccountCommand -> { - System.out.println("Handling create: " + command); - if (createAccountCommand.getInitialBalance() < 0) - throw new IllegalArgumentException("Initial balance is negative"); - - event = new AccountCreatedEvent(UUID.randomUUID().toString(), createAccountCommand.getInitialBalance(), createAccountCommand.getCurrency(), AccountStatus.CREATED, createAccountCommand.getAccountId()); - - } - case DebitAccountCommand debitAccountCommand -> { - System.out.println("Handling debit: " + command); - if (debitAccountCommand.getAmount() < 0) throw new IllegalArgumentException("Amount is negative"); - - event = new AccountDebitedEvent(UUID.randomUUID().toString(), debitAccountCommand.getAccountId(), debitAccountCommand.getCurrency(), debitAccountCommand.getAmount()); - - - } - case CreditAccountCommand creditAccountCommand -> { - System.out.println("Handling debit: " + command); - if (creditAccountCommand.getAmount() < 0) throw new IllegalArgumentException("Amount is negative"); - - event = new AccountCreditedEvent(UUID.randomUUID().toString(), creditAccountCommand.getCurrency(), creditAccountCommand.getAmount(), creditAccountCommand.getAccountId()); - - - } - case UpdateAccountStatusCommand updateAccountStatusCommand -> { - System.out.println("Handling debit: " + command); - event = new AccountStatusUpdatedEvent(UUID.randomUUID().toString(), updateAccountStatusCommand.getAccountStatus(), updateAccountStatusCommand.getAccountId()); - - } - - default -> throw new IllegalStateException("Unexpected value: " + command); - } - + BaseEvent event = command.createEvent(); eventProducer.enqueue(event); eventStoreRepository.save(event); - } } diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/BaseCommand.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/BaseCommand.java index 540595de7..45a239f2c 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/BaseCommand.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/BaseCommand.java @@ -3,11 +3,13 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import org.example.oracle.cqrs.common.events.BaseEvent; @AllArgsConstructor @NoArgsConstructor -public class BaseCommand{ +public abstract class BaseCommand{ @Getter private T id; + public abstract BaseEvent createEvent(); } diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreateAccountCommand.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreateAccountCommand.java index 2494870c6..aaff6e098 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreateAccountCommand.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreateAccountCommand.java @@ -1,6 +1,11 @@ package org.example.oracle.cqrs.command.commands; import lombok.*; +import org.example.oracle.cqrs.common.enums.AccountStatus; +import org.example.oracle.cqrs.common.events.AccountCreatedEvent; +import org.example.oracle.cqrs.common.events.BaseEvent; + +import java.util.UUID; @Getter @NoArgsConstructor public class CreateAccountCommand extends BaseCommand { @@ -14,4 +19,13 @@ public CreateAccountCommand(String id, double initialBalance, String currency, S this.currency = currency; this.accountId = accountId; } + + @Override + public BaseEvent createEvent() { + System.out.println("Handling create: " + this); + if (this.getInitialBalance() < 0) + throw new IllegalArgumentException("Initial balance is negative"); + + return new AccountCreatedEvent(UUID.randomUUID().toString(), initialBalance, currency, AccountStatus.CREATED, accountId); + } } diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreditAccountCommand.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreditAccountCommand.java index ee7c80910..3ce7d0c50 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreditAccountCommand.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreditAccountCommand.java @@ -3,6 +3,10 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import org.example.oracle.cqrs.common.events.AccountCreditedEvent; +import org.example.oracle.cqrs.common.events.BaseEvent; + +import java.util.UUID; @Getter @NoArgsConstructor @@ -17,4 +21,13 @@ public CreditAccountCommand(String id, String accountId, double amount, String c this.amount = amount; this.currency = currency; } + + @Override + public BaseEvent createEvent() { + System.out.println("Handling debit: " + this); + if (amount < 0) throw new IllegalArgumentException("Amount is negative"); + + return new AccountCreditedEvent(UUID.randomUUID().toString(), currency, amount, accountId); + + } } diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/DebitAccountCommand.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/DebitAccountCommand.java index dc62aec61..fffdb84de 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/DebitAccountCommand.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/DebitAccountCommand.java @@ -1,6 +1,10 @@ package org.example.oracle.cqrs.command.commands; import lombok.*; +import org.example.oracle.cqrs.common.events.AccountDebitedEvent; +import org.example.oracle.cqrs.common.events.BaseEvent; + +import java.util.UUID; @Getter @NoArgsConstructor @@ -16,4 +20,11 @@ public DebitAccountCommand(String id, String accountId, double amount, String cu this.currency = currency; } + @Override + public BaseEvent createEvent() { + System.out.println("Handling debit: " + this); + if (amount < 0) throw new IllegalArgumentException("Amount is negative"); + return new AccountDebitedEvent(UUID.randomUUID().toString(), accountId, currency, amount); + + } } diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/UpdateAccountStatusCommand.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/UpdateAccountStatusCommand.java index c16913eae..fd8cca47d 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/UpdateAccountStatusCommand.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/UpdateAccountStatusCommand.java @@ -3,6 +3,10 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.example.oracle.cqrs.common.enums.AccountStatus; +import org.example.oracle.cqrs.common.events.AccountStatusUpdatedEvent; +import org.example.oracle.cqrs.common.events.BaseEvent; + +import java.util.UUID; @Getter @NoArgsConstructor @@ -15,4 +19,10 @@ public UpdateAccountStatusCommand(String id, String accountId, AccountStatus acc this.accountId = accountId; this.accountStatus = accountStatus; } + + @Override + public BaseEvent createEvent() { + System.out.println("Handling update account : " + this); + return new AccountStatusUpdatedEvent(UUID.randomUUID().toString(), accountStatus, accountId); + } } diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java index 95839fbfd..a942e6ecd 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java @@ -13,6 +13,7 @@ import org.example.oracle.cqrs.common.Dtos.DebitAccountDTO; import org.example.oracle.cqrs.common.Dtos.UpdateAccountStatusDTO; import org.example.oracle.cqrs.common.events.BaseEvent; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -37,27 +38,27 @@ public ResponseEntity createAccount(@Valid @RequestBody CreateAccountDTO request String accountId = UUID.randomUUID().toString(); commandsProducer.enqueue(new CreateAccountCommand(UUID.randomUUID().toString(), request.getInitialBalance(), request.getCurrency(), accountId)); - return ResponseEntity.status(HttpStatus.ACCEPTED).header("Location", "/api/queries/status/" + accountId).build(); + return ResponseEntity.status(HttpStatus.ACCEPTED).header(HttpHeaders.LOCATION, "/api/queries/status/" + accountId).build(); } @PostMapping("/debit") public ResponseEntity debitAccount(@Valid @RequestBody DebitAccountDTO request) { commandsProducer.enqueue(new DebitAccountCommand(UUID.randomUUID().toString(), request.getAccountId(), request.getAmount(), request.getCurrency())); - return ResponseEntity.status(HttpStatus.ACCEPTED).header("Location", "/api/queries/" + request.getAccountId()).build(); + return ResponseEntity.status(HttpStatus.ACCEPTED).header(HttpHeaders.LOCATION, "/api/queries/" + request.getAccountId()).build(); } @PostMapping("/credit") public ResponseEntity creditAccount(@Valid @RequestBody CreditAccountDTO request) { commandsProducer.enqueue(new CreditAccountCommand(UUID.randomUUID().toString(), request.getAccountId(), request.getAmount(), request.getCurrency())); - return ResponseEntity.status(HttpStatus.ACCEPTED).header("Location", "/api/queries/" + request.getAccountId()).build(); + return ResponseEntity.status(HttpStatus.ACCEPTED).header(HttpHeaders.LOCATION, "/api/queries/" + request.getAccountId()).build(); } @PutMapping("/updateStatus") public ResponseEntity updateStatus(@Valid @RequestBody UpdateAccountStatusDTO request) { commandsProducer.enqueue(new UpdateAccountStatusCommand(UUID.randomUUID().toString(), request.getAccountId(), request.getAccountStatus())); - return ResponseEntity.status(HttpStatus.ACCEPTED).header("Location", "/api/queries/status/" + request.getAccountId()).build(); + return ResponseEntity.status(HttpStatus.ACCEPTED).header(HttpHeaders.LOCATION, "/api/queries/status/" + request.getAccountId()).build(); } diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/common/Dtos/UpdateAccountStatusDTO.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/common/Dtos/UpdateAccountStatusDTO.java index c8bf8906d..b495d57a0 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/common/Dtos/UpdateAccountStatusDTO.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/common/Dtos/UpdateAccountStatusDTO.java @@ -2,6 +2,7 @@ package org.example.oracle.cqrs.common.Dtos; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -11,6 +12,6 @@ public class UpdateAccountStatusDTO { @NotBlank private String accountId ; - @NotBlank + @NotNull private AccountStatus accountStatus ; } From 30e503a29fb3666aef4acbaed082f64c3868d3be Mon Sep 17 00:00:00 2001 From: soulaimanGhailan Date: Fri, 13 Jun 2025 18:35:44 +0100 Subject: [PATCH 2/4] spring and db starters version upgrade Signed-off-by: soulaimanGhailan --- Oracle_CQRS/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Oracle_CQRS/pom.xml b/Oracle_CQRS/pom.xml index 9a78d3382..d4766b07b 100644 --- a/Oracle_CQRS/pom.xml +++ b/Oracle_CQRS/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.5 + 3.4.6 Oracle_CQRS @@ -14,8 +14,8 @@ 21 1.18.38 2.8.6 - 25.1.0 - 25.1.0 + 25.2.0 + 25.2.0 From a041e0d02d36d5661d9688119c64e962fe81ccbc Mon Sep 17 00:00:00 2001 From: soulaimanGhailan Date: Fri, 13 Jun 2025 18:51:03 +0100 Subject: [PATCH 3/4] using specific imports --- .../oracle/cqrs/command/aggregates/AccountAggregate.java | 2 +- .../cqrs/command/commands/CreateAccountCommand.java | 6 ++++-- .../cqrs/command/commands/DebitAccountCommand.java | 3 ++- .../cqrs/command/controlles/AccountCommandRest.java | 9 ++++++++- .../oracle/cqrs/common/Dtos/CreateAccountDTO.java | 5 ++++- .../oracle/cqrs/query/controller/AccountQueryRest.java | 5 ++++- .../org/example/oracle/cqrs/query/entities/Account.java | 5 ++++- 7 files changed, 27 insertions(+), 8 deletions(-) diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/aggregates/AccountAggregate.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/aggregates/AccountAggregate.java index 618a9735c..7a1a7540a 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/aggregates/AccountAggregate.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/aggregates/AccountAggregate.java @@ -1,8 +1,8 @@ package org.example.oracle.cqrs.command.aggregates; import jakarta.transaction.Transactional; -import lombok.*; +import lombok.Getter; import org.example.oracle.cqrs.command.commands.*; import org.example.oracle.cqrs.common.events.*; import org.example.oracle.cqrs.command.producers.EventProducer; diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreateAccountCommand.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreateAccountCommand.java index aaff6e098..505c5e1f2 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreateAccountCommand.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/CreateAccountCommand.java @@ -1,13 +1,15 @@ package org.example.oracle.cqrs.command.commands; -import lombok.*; +import lombok.Getter; +import lombok.NoArgsConstructor; import org.example.oracle.cqrs.common.enums.AccountStatus; import org.example.oracle.cqrs.common.events.AccountCreatedEvent; import org.example.oracle.cqrs.common.events.BaseEvent; import java.util.UUID; -@Getter @NoArgsConstructor +@Getter +@NoArgsConstructor public class CreateAccountCommand extends BaseCommand { private double initialBalance; private String currency; diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/DebitAccountCommand.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/DebitAccountCommand.java index fffdb84de..4f78aac1d 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/DebitAccountCommand.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/commands/DebitAccountCommand.java @@ -1,6 +1,7 @@ package org.example.oracle.cqrs.command.commands; -import lombok.*; +import lombok.Getter; +import lombok.NoArgsConstructor; import org.example.oracle.cqrs.common.events.AccountDebitedEvent; import org.example.oracle.cqrs.common.events.BaseEvent; diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java index a942e6ecd..63dfe5fde 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java @@ -16,7 +16,14 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.GetMapping; + import java.util.List; import java.util.UUID; diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/common/Dtos/CreateAccountDTO.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/common/Dtos/CreateAccountDTO.java index 8ab009b5f..89f586530 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/common/Dtos/CreateAccountDTO.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/common/Dtos/CreateAccountDTO.java @@ -2,7 +2,10 @@ import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Getter @Setter diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/query/controller/AccountQueryRest.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/query/controller/AccountQueryRest.java index 467afb9c2..07377f06e 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/query/controller/AccountQueryRest.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/query/controller/AccountQueryRest.java @@ -4,7 +4,10 @@ import org.example.oracle.cqrs.query.entities.Account; import org.example.oracle.cqrs.query.repositories.AccountRepository; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.List; diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/query/entities/Account.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/query/entities/Account.java index fdd2912a2..b42d5627e 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/query/entities/Account.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/query/entities/Account.java @@ -4,7 +4,10 @@ import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import jakarta.persistence.Id; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import org.example.oracle.cqrs.common.enums.AccountStatus; import java.util.Date; From 766df1b713c0b5496b2be69faaa2e6055a16399b Mon Sep 17 00:00:00 2001 From: soulaimanGhailan Date: Fri, 13 Jun 2025 19:02:02 +0100 Subject: [PATCH 4/4] building the the callback url to query part endpoints Signed-off-by: soulaimanGhailan --- .../controlles/AccountCommandRest.java | 32 +++++++++++++------ .../src/main/resources/application.properties | 3 +- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java index 63dfe5fde..f7391ab06 100644 --- a/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java +++ b/Oracle_CQRS/src/main/java/org/example/oracle/cqrs/command/controlles/AccountCommandRest.java @@ -13,8 +13,7 @@ import org.example.oracle.cqrs.common.Dtos.DebitAccountDTO; import org.example.oracle.cqrs.common.Dtos.UpdateAccountStatusDTO; import org.example.oracle.cqrs.common.events.BaseEvent; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.PutMapping; @@ -23,8 +22,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.util.UriComponentsBuilder; +import java.net.URI; import java.util.List; import java.util.UUID; @@ -34,38 +35,41 @@ public class AccountCommandRest { private CommandsProducer commandsProducer; private EventStoreRepository eventStoreRepository; + private String queryBsedUrl ; - AccountCommandRest(CommandsProducer commandsProducer, EventStoreRepository eventStoreRepository) { + AccountCommandRest(CommandsProducer commandsProducer, EventStoreRepository eventStoreRepository, @Value("${query.base.url}") String queryBsedUrl) { this.commandsProducer = commandsProducer; this.eventStoreRepository = eventStoreRepository; + this.queryBsedUrl = queryBsedUrl; } @PostMapping("/create") public ResponseEntity createAccount(@Valid @RequestBody CreateAccountDTO request) { String accountId = UUID.randomUUID().toString(); commandsProducer.enqueue(new CreateAccountCommand(UUID.randomUUID().toString(), request.getInitialBalance(), request.getCurrency(), accountId)); - - return ResponseEntity.status(HttpStatus.ACCEPTED).header(HttpHeaders.LOCATION, "/api/queries/status/" + accountId).build(); + URI location = getGetQueryUri(accountId); + return ResponseEntity.created(location).build(); } @PostMapping("/debit") public ResponseEntity debitAccount(@Valid @RequestBody DebitAccountDTO request) { commandsProducer.enqueue(new DebitAccountCommand(UUID.randomUUID().toString(), request.getAccountId(), request.getAmount(), request.getCurrency())); - - return ResponseEntity.status(HttpStatus.ACCEPTED).header(HttpHeaders.LOCATION, "/api/queries/" + request.getAccountId()).build(); + URI location = getGetQueryUri(request.getAccountId()); + return ResponseEntity.created(location).build(); } @PostMapping("/credit") public ResponseEntity creditAccount(@Valid @RequestBody CreditAccountDTO request) { commandsProducer.enqueue(new CreditAccountCommand(UUID.randomUUID().toString(), request.getAccountId(), request.getAmount(), request.getCurrency())); - - return ResponseEntity.status(HttpStatus.ACCEPTED).header(HttpHeaders.LOCATION, "/api/queries/" + request.getAccountId()).build(); + URI location = getGetQueryUri(request.getAccountId()); + return ResponseEntity.created(location).build(); } @PutMapping("/updateStatus") public ResponseEntity updateStatus(@Valid @RequestBody UpdateAccountStatusDTO request) { commandsProducer.enqueue(new UpdateAccountStatusCommand(UUID.randomUUID().toString(), request.getAccountId(), request.getAccountStatus())); - return ResponseEntity.status(HttpStatus.ACCEPTED).header(HttpHeaders.LOCATION, "/api/queries/status/" + request.getAccountId()).build(); + URI location = getGetQueryUri(request.getAccountId()); + return ResponseEntity.created(location).build(); } @@ -79,5 +83,13 @@ public String exceptionHandler(Exception exception) { return exception.getMessage(); } + private URI getGetQueryUri(String accountId) { + URI location = UriComponentsBuilder.fromHttpUrl(queryBsedUrl) + .path("/" + accountId) + .build() + .toUri(); + return location; + } + } diff --git a/Oracle_CQRS/src/main/resources/application.properties b/Oracle_CQRS/src/main/resources/application.properties index df301c7ce..ccfcfb58d 100644 --- a/Oracle_CQRS/src/main/resources/application.properties +++ b/Oracle_CQRS/src/main/resources/application.properties @@ -1,2 +1,3 @@ txeventq.queue.commands.name=${txeventq:commandsqueue} -txeventq.queue.events.name=${txeventq:eventsqueue} \ No newline at end of file +txeventq.queue.events.name=${txeventq:eventsqueue} +query.base.url=http://localhost:8081/api/queries