From e7f1a901d9b42595099adab82781ed893d299c0d Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 18 Apr 2022 10:27:30 +0300 Subject: [PATCH] feature: add bank account domain improvements --- .../BankAccountDocumentNotFoundException.java | 10 +++++++++ .../BankAccountMongoProjection.java | 10 ++++----- .../com/eventsourcing/es/KafkaEventBus.java | 2 +- .../exceptions/ExceptionResponseDTO.java | 6 ++++++ .../exceptions/NotFoundResponseDTO.java | 6 ------ .../filters/GlobalControllerAdvice.java | 21 ++++++++++++++----- 6 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/eventsourcing/bankAccount/exceptions/BankAccountDocumentNotFoundException.java create mode 100644 src/main/java/com/eventsourcing/exceptions/ExceptionResponseDTO.java delete mode 100644 src/main/java/com/eventsourcing/exceptions/NotFoundResponseDTO.java diff --git a/src/main/java/com/eventsourcing/bankAccount/exceptions/BankAccountDocumentNotFoundException.java b/src/main/java/com/eventsourcing/bankAccount/exceptions/BankAccountDocumentNotFoundException.java new file mode 100644 index 0000000..8d1c3b7 --- /dev/null +++ b/src/main/java/com/eventsourcing/bankAccount/exceptions/BankAccountDocumentNotFoundException.java @@ -0,0 +1,10 @@ +package com.eventsourcing.bankAccount.exceptions; + +public class BankAccountDocumentNotFoundException extends RuntimeException { + public BankAccountDocumentNotFoundException() { + } + + public BankAccountDocumentNotFoundException(String id) { + super("bank account document not found id:" + id); + } +} diff --git a/src/main/java/com/eventsourcing/bankAccount/projection/BankAccountMongoProjection.java b/src/main/java/com/eventsourcing/bankAccount/projection/BankAccountMongoProjection.java index 5073316..4898d07 100644 --- a/src/main/java/com/eventsourcing/bankAccount/projection/BankAccountMongoProjection.java +++ b/src/main/java/com/eventsourcing/bankAccount/projection/BankAccountMongoProjection.java @@ -7,6 +7,7 @@ import com.eventsourcing.bankAccount.events.AddressUpdatedEvent; import com.eventsourcing.bankAccount.events.BalanceDepositedEvent; import com.eventsourcing.bankAccount.events.BankAccountCreatedEvent; import com.eventsourcing.bankAccount.events.EmailChangedEvent; +import com.eventsourcing.bankAccount.exceptions.BankAccountDocumentNotFoundException; import com.eventsourcing.bankAccount.repository.BankAccountMongoRepository; import com.eventsourcing.es.Event; import com.eventsourcing.es.EventStoreDB; @@ -114,7 +115,7 @@ public class BankAccountMongoProjection implements Projection { log.info("(when) EmailChangedEvent: {}, aggregateID: {}", event, event.getAggregateId()); final var documentOptional = mongoRepository.findByAggregateId(event.getAggregateId()); if (documentOptional.isEmpty()) - throw new RuntimeException("Bank Account Document not found id: {}" + event.getAggregateId()); + throw new BankAccountDocumentNotFoundException(event.getAggregateId()); final var document = documentOptional.get(); document.setEmail(event.getNewEmail()); @@ -126,7 +127,7 @@ public class BankAccountMongoProjection implements Projection { log.info("(when) AddressUpdatedEvent: {}, aggregateID: {}", event, event.getAggregateId()); final var documentOptional = mongoRepository.findByAggregateId(event.getAggregateId()); if (documentOptional.isEmpty()) - throw new RuntimeException("Bank Account Document not found id: {}" + event.getAggregateId()); + throw new BankAccountDocumentNotFoundException(event.getAggregateId()); final var document = documentOptional.get(); document.setAddress(event.getNewAddress()); @@ -138,11 +139,10 @@ public class BankAccountMongoProjection implements Projection { log.info("(when) BalanceDepositedEvent: {}, aggregateID: {}", event, event.getAggregateId()); final var documentOptional = mongoRepository.findByAggregateId(event.getAggregateId()); if (documentOptional.isEmpty()) - throw new RuntimeException("Bank Account Document not found id: {}" + event.getAggregateId()); + throw new BankAccountDocumentNotFoundException(event.getAggregateId()); final var document = documentOptional.get(); - final var balance = document.getBalance(); - final var newBalance = balance.add(event.getAmount()); + final var newBalance = document.getBalance().add(event.getAmount()); document.setBalance(newBalance); mongoRepository.save(document); } diff --git a/src/main/java/com/eventsourcing/es/KafkaEventBus.java b/src/main/java/com/eventsourcing/es/KafkaEventBus.java index 7152ed0..10ebd6c 100644 --- a/src/main/java/com/eventsourcing/es/KafkaEventBus.java +++ b/src/main/java/com/eventsourcing/es/KafkaEventBus.java @@ -35,7 +35,7 @@ public class KafkaEventBus implements EventBus { log.info("publishing kafka record value >>>>> {}", new String(record.value())); } catch (Exception ex) { - log.error("(KafkaEventBus) publish get", ex); + log.error("(KafkaEventBus) publish get timeout", ex); throw new RuntimeException(ex); } } diff --git a/src/main/java/com/eventsourcing/exceptions/ExceptionResponseDTO.java b/src/main/java/com/eventsourcing/exceptions/ExceptionResponseDTO.java new file mode 100644 index 0000000..549f84b --- /dev/null +++ b/src/main/java/com/eventsourcing/exceptions/ExceptionResponseDTO.java @@ -0,0 +1,6 @@ +package com.eventsourcing.exceptions; + +import java.time.LocalDateTime; + +public record ExceptionResponseDTO(int Status, String message, LocalDateTime timestamp) { +} diff --git a/src/main/java/com/eventsourcing/exceptions/NotFoundResponseDTO.java b/src/main/java/com/eventsourcing/exceptions/NotFoundResponseDTO.java deleted file mode 100644 index 9d97d4e..0000000 --- a/src/main/java/com/eventsourcing/exceptions/NotFoundResponseDTO.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.eventsourcing.exceptions; - -import java.time.LocalDateTime; - -public record NotFoundResponseDTO(int Status, String message, LocalDateTime timestamp) { -} diff --git a/src/main/java/com/eventsourcing/filters/GlobalControllerAdvice.java b/src/main/java/com/eventsourcing/filters/GlobalControllerAdvice.java index 2ae8dea..c288f37 100644 --- a/src/main/java/com/eventsourcing/filters/GlobalControllerAdvice.java +++ b/src/main/java/com/eventsourcing/filters/GlobalControllerAdvice.java @@ -1,8 +1,11 @@ package com.eventsourcing.filters; +import com.eventsourcing.bankAccount.exceptions.BankAccountDocumentNotFoundException; +import com.eventsourcing.bankAccount.exceptions.InvalidAddressException; +import com.eventsourcing.bankAccount.exceptions.InvalidEmailException; import com.eventsourcing.es.exceptions.AggregateNotFoundException; import com.eventsourcing.exceptions.InternalServerErrorResponse; -import com.eventsourcing.exceptions.NotFoundResponseDTO; +import com.eventsourcing.exceptions.ExceptionResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.Order; @@ -43,10 +46,18 @@ public class GlobalControllerAdvice { } @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(AggregateNotFoundException.class) - public ResponseEntity handleAggregateNotFoundException(AggregateNotFoundException ex) { - final var notFoundResponseDTO = new NotFoundResponseDTO(HttpStatus.NOT_FOUND.value(), ex.getMessage(), LocalDateTime.now()); - log.error("AggregateNotFoundException response ex:", ex); + @ExceptionHandler({AggregateNotFoundException.class, BankAccountDocumentNotFoundException.class}) + public ResponseEntity handleAggregateNotFoundExceptions(AggregateNotFoundException ex) { + final var notFoundResponseDTO = new ExceptionResponseDTO(HttpStatus.NOT_FOUND.value(), ex.getMessage(), LocalDateTime.now()); + log.error("handleAggregateNotFoundExceptions response ex:", ex); return ResponseEntity.status(HttpStatus.NOT_FOUND).body(notFoundResponseDTO); } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler({InvalidAddressException.class, InvalidEmailException.class}) + public ResponseEntity handleInvalidAggregateExceptions(AggregateNotFoundException ex) { + final var notFoundResponseDTO = new ExceptionResponseDTO(HttpStatus.BAD_REQUEST.value(), ex.getMessage(), LocalDateTime.now()); + log.error("handleInvalidAggregateExceptions response ex:", ex); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(notFoundResponseDTO); + } }