From 7b8b212138198c6000105bd3b11c962f24c32b87 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 13 Apr 2022 16:36:27 +0300 Subject: [PATCH] feature: add bank account aggregate exceptions --- .../java/com/eventsourcing/es/EventStore.java | 40 +++++++++---------- .../AggregateNotFoundException.java | 11 +++++ .../exceptions/NotFoundResponseDTO.java | 6 +++ .../filters/GlobalControllerAdvice.java | 10 +++++ 4 files changed, 45 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/eventsourcing/es/exceptions/AggregateNotFoundException.java create mode 100644 src/main/java/com/eventsourcing/exceptions/NotFoundResponseDTO.java diff --git a/src/main/java/com/eventsourcing/es/EventStore.java b/src/main/java/com/eventsourcing/es/EventStore.java index acefb2e..5ce8024 100644 --- a/src/main/java/com/eventsourcing/es/EventStore.java +++ b/src/main/java/com/eventsourcing/es/EventStore.java @@ -1,6 +1,7 @@ package com.eventsourcing.es; +import com.eventsourcing.es.exceptions.AggregateNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.EmptyResultDataAccessException; @@ -34,32 +35,24 @@ public class EventStore implements EventStoreDB { "metadata", Objects.isNull(event.getMetaData()) ? new byte[]{} : event.getMetaData(), "version", event.getVersion())); - log.info("(saveEvents) saved event: {}", event); + log.info("(saveEvents) saved result: {}, event: {}", result, event); }); } - private Snapshot getSnapshot(String aggregateId) { - - return new Snapshot(); - } - @Override public List loadEvents(String aggregateId, long version) { final List events = jdbcTemplate.query("select event_id ,aggregate_id, aggregate_type, event_type, data, metadata, version, timestamp" + " from events e where e.aggregate_id = :aggregate_id and e.version > :version ORDER BY e.version ASC", Map.of("aggregate_id", aggregateId, "version", version), - (rs, rowNum) -> { - Event event = Event.builder() - .aggregateId(rs.getString("aggregate_id")) - .aggregateType(rs.getString("aggregate_type")) - .eventType(rs.getString("event_type")) - .data(rs.getBytes("data")) - .metaData(rs.getBytes("metadata")) - .version(rs.getLong("version")) - .timeStamp(rs.getTimestamp("timestamp").toLocalDateTime()) - .build(); - return event; - }); + (rs, rowNum) -> Event.builder() + .aggregateId(rs.getString("aggregate_id")) + .aggregateType(rs.getString("aggregate_type")) + .eventType(rs.getString("event_type")) + .data(rs.getBytes("data")) + .metaData(rs.getBytes("metadata")) + .version(rs.getLong("version")) + .timeStamp(rs.getTimestamp("timestamp").toLocalDateTime()) + .build()); log.info("(loadEvents) events list: {}", events); return events; @@ -78,6 +71,7 @@ public class EventStore implements EventStoreDB { "data", Objects.isNull(snapshot.getData()) ? new byte[]{} : snapshot.getData(), "metadata", Objects.isNull(snapshot.getMetaData()) ? new byte[]{} : snapshot.getMetaData(), "version", snapshot.getVersion())); + log.info("(saveSnapshot) result: {}", update); } @@ -92,7 +86,8 @@ public class EventStore implements EventStoreDB { if (aggregate.getVersion() % 3 == 0) { this.saveSnapshot(aggregate); } - log.info("(save) aggregate saved: {}", aggregate); + + log.info("(save) saved aggregate: {}", aggregate); } private void handleConcurrency(String aggregateId) { @@ -117,6 +112,7 @@ public class EventStore implements EventStoreDB { .version(rs.getLong("version")) .timeStamp(rs.getTimestamp("timestamp").toLocalDateTime()) .build()).stream().findFirst(); + snapshot.ifPresent(result -> log.info("(loadSnapshot) snapshot: {}", result)); return snapshot; } @@ -124,7 +120,8 @@ public class EventStore implements EventStoreDB { private T getAggregate(final String aggregateId, final Class aggregateType) { try { return aggregateType.getConstructor(String.class).newInstance(aggregateId); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | + NoSuchMethodException e) { throw new RuntimeException(e); } } @@ -144,7 +141,6 @@ public class EventStore implements EventStoreDB { final Optional snapshot = this.loadSnapshot(aggregateId); final var aggregate = this.getSnapshotFromClass(snapshot, aggregateId, aggregateType); - log.info("(load) aggregate: {}", aggregate); final List events = this.loadEvents(aggregateId, aggregate.getVersion()); events.forEach(event -> { @@ -152,7 +148,7 @@ public class EventStore implements EventStoreDB { log.info("raise event version: {}", event.getVersion()); }); - if (aggregate.getVersion() == 0) throw new RuntimeException("aggregate not found id:" + aggregateId); + if (aggregate.getVersion() == 0) throw new AggregateNotFoundException(aggregateId); return aggregate; } diff --git a/src/main/java/com/eventsourcing/es/exceptions/AggregateNotFoundException.java b/src/main/java/com/eventsourcing/es/exceptions/AggregateNotFoundException.java new file mode 100644 index 0000000..88423ae --- /dev/null +++ b/src/main/java/com/eventsourcing/es/exceptions/AggregateNotFoundException.java @@ -0,0 +1,11 @@ +package com.eventsourcing.es.exceptions; + +public class AggregateNotFoundException extends RuntimeException { + public AggregateNotFoundException() { + super(); + } + + public AggregateNotFoundException(String aggregateID) { + super("aggregate not found id:" + aggregateID); + } +} diff --git a/src/main/java/com/eventsourcing/exceptions/NotFoundResponseDTO.java b/src/main/java/com/eventsourcing/exceptions/NotFoundResponseDTO.java new file mode 100644 index 0000000..9d97d4e --- /dev/null +++ b/src/main/java/com/eventsourcing/exceptions/NotFoundResponseDTO.java @@ -0,0 +1,6 @@ +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 1b6cd7f..32674fd 100644 --- a/src/main/java/com/eventsourcing/filters/GlobalControllerAdvice.java +++ b/src/main/java/com/eventsourcing/filters/GlobalControllerAdvice.java @@ -1,6 +1,8 @@ package com.eventsourcing.filters; +import com.eventsourcing.es.exceptions.AggregateNotFoundException; import com.eventsourcing.exceptions.InternalServerErrorResponse; +import com.eventsourcing.exceptions.NotFoundResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.Order; @@ -40,4 +42,12 @@ public class GlobalControllerAdvice { ex.getBindingResult().getFieldErrors().forEach(error -> errorMap.put(error.getField(), error.getDefaultMessage())); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMap); } + + @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); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(notFoundResponseDTO); + } }