diff --git a/pom.xml b/pom.xml
index 2e355f7..2dc2153 100644
--- a/pom.xml
+++ b/pom.xml
@@ -58,11 +58,6 @@
jackson-module-jaxb-annotations
2.11.0
-
- io.vavr
- vavr
- 0.10.3
-
com.h2database
diff --git a/src/component-test/java/io/wkrzywiec/hexagonal/library/borrowing/MakeReservationComponentTest.java b/src/component-test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/MakeReservationComponentTest.java
similarity index 91%
rename from src/component-test/java/io/wkrzywiec/hexagonal/library/borrowing/MakeReservationComponentTest.java
rename to src/component-test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/MakeReservationComponentTest.java
index b268b90..47ea86c 100644
--- a/src/component-test/java/io/wkrzywiec/hexagonal/library/borrowing/MakeReservationComponentTest.java
+++ b/src/component-test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/MakeReservationComponentTest.java
@@ -1,9 +1,9 @@
-package io.wkrzywiec.hexagonal.library.borrowing;
+package io.wkrzywiec.hexagonal.library.domain.borrowing;
import io.restassured.RestAssured;
import io.wkrzywiec.hexagonal.library.BookTestData;
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservationCommand;
-import io.wkrzywiec.hexagonal.library.inventory.infrastructure.BookRepository;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservationCommand;
+import io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure.BookRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
diff --git a/src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookComponentTest.java b/src/component-test/java/io/wkrzywiec/hexagonal/library/domain/inventory/AddNewBookComponentTest.java
similarity index 95%
rename from src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookComponentTest.java
rename to src/component-test/java/io/wkrzywiec/hexagonal/library/domain/inventory/AddNewBookComponentTest.java
index 0d0ac2b..9503b50 100644
--- a/src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookComponentTest.java
+++ b/src/component-test/java/io/wkrzywiec/hexagonal/library/domain/inventory/AddNewBookComponentTest.java
@@ -1,9 +1,9 @@
-package io.wkrzywiec.hexagonal.library.inventory;
+package io.wkrzywiec.hexagonal.library.domain.inventory;
import io.restassured.RestAssured;
import io.restassured.response.ValidatableResponse;
import io.wkrzywiec.hexagonal.library.BookTestData;
-import io.wkrzywiec.hexagonal.library.inventory.model.AddNewBookCommand;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.AddNewBookCommand;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
diff --git a/src/component-test/java/io/wkrzywiec/hexagonal/library/user/AddNewUserComponentTest.java b/src/component-test/java/io/wkrzywiec/hexagonal/library/domain/user/AddNewUserComponentTest.java
similarity index 93%
rename from src/component-test/java/io/wkrzywiec/hexagonal/library/user/AddNewUserComponentTest.java
rename to src/component-test/java/io/wkrzywiec/hexagonal/library/domain/user/AddNewUserComponentTest.java
index 830c9ae..667e0f0 100644
--- a/src/component-test/java/io/wkrzywiec/hexagonal/library/user/AddNewUserComponentTest.java
+++ b/src/component-test/java/io/wkrzywiec/hexagonal/library/domain/user/AddNewUserComponentTest.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.user;
+package io.wkrzywiec.hexagonal.library.domain.user;
import io.restassured.RestAssured;
-import io.wkrzywiec.hexagonal.library.user.model.AddUserCommand;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.AddUserCommand;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/EmailDomainConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/EmailDomainConfig.java
deleted file mode 100644
index d028750..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/EmailDomainConfig.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package io.wkrzywiec.hexagonal.library;
-
-import io.wkrzywiec.hexagonal.library.email.EmailFacade;
-import io.wkrzywiec.hexagonal.library.email.infrastructure.EmailDatabaseAdapter;
-import io.wkrzywiec.hexagonal.library.email.infrastructure.SendGridEmailSender;
-import io.wkrzywiec.hexagonal.library.email.ports.incoming.SendReservationConfirmation;
-import io.wkrzywiec.hexagonal.library.email.ports.outgoing.EmailSender;
-import io.wkrzywiec.hexagonal.library.email.ports.outgoing.EmailDatabase;
-import org.springframework.context.annotation.Bean;
-import org.springframework.jdbc.core.JdbcTemplate;
-
-public class EmailDomainConfig {
-
- @Bean
- public EmailSender emailSender() {
- return new SendGridEmailSender();
- }
-
- @Bean
- public EmailDatabase libraryDatabase(JdbcTemplate jdbcTemplate){
- return new EmailDatabaseAdapter(jdbcTemplate);
- }
-
- @Bean
- public SendReservationConfirmation sendReservationConfirmation(EmailSender emailSender, EmailDatabase database){
- return new EmailFacade(emailSender, database);
- }
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalApplication.java b/src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalApplication.java
index 0c752a1..99668f0 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalApplication.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalApplication.java
@@ -1,5 +1,10 @@
package io.wkrzywiec.hexagonal.library;
+import io.wkrzywiec.hexagonal.library.infrastructure.BorrowingDomainConfig;
+import io.wkrzywiec.hexagonal.library.infrastructure.EmailDomainConfig;
+import io.wkrzywiec.hexagonal.library.infrastructure.InventoryDomainConfig;
+import io.wkrzywiec.hexagonal.library.infrastructure.LibraryHexagonalConfig;
+import io.wkrzywiec.hexagonal.library.infrastructure.UserDomainConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/UserDomainConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/UserDomainConfig.java
deleted file mode 100644
index 97f8a3b..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/UserDomainConfig.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package io.wkrzywiec.hexagonal.library;
-
-import io.wkrzywiec.hexagonal.library.user.UserFacade;
-import io.wkrzywiec.hexagonal.library.user.infrastructure.UserDatabaseAdapter;
-import io.wkrzywiec.hexagonal.library.user.infrastructure.UserRepository;
-import io.wkrzywiec.hexagonal.library.user.ports.incoming.AddNewUser;
-import io.wkrzywiec.hexagonal.library.user.ports.outgoing.UserDatabase;
-import org.springframework.context.annotation.Bean;
-
-public class UserDomainConfig {
-
- @Bean
- public UserDatabase userDatabase(UserRepository userRepository){
- return new UserDatabaseAdapter(userRepository);
- }
-
- @Bean
- public AddNewUser addNewUser(UserDatabase userDatabase){
- return new UserFacade(userDatabase);
- }
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/application/LibraryHexagonalController.java b/src/main/java/io/wkrzywiec/hexagonal/library/application/LibraryHexagonalController.java
new file mode 100644
index 0000000..eb9f7ef
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/application/LibraryHexagonalController.java
@@ -0,0 +1,15 @@
+package io.wkrzywiec.hexagonal.library.application;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/")
+public class LibraryHexagonalController {
+
+ @GetMapping("")
+ public String getAppRoot(){
+ return "Library Hexagonal REST API";
+ }
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/BorrowingFacade.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/BorrowingFacade.java
deleted file mode 100644
index 5b3f2b9..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/BorrowingFacade.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing;
-
-import io.wkrzywiec.hexagonal.library.borrowing.model.ActiveUser;
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservedEvent;
-import io.wkrzywiec.hexagonal.library.borrowing.model.MakeBookAvailableCommand;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservationDetails;
-import io.wkrzywiec.hexagonal.library.borrowing.model.exception.ActiveUserNotFoundException;
-import io.wkrzywiec.hexagonal.library.borrowing.model.AvailableBook;
-import io.wkrzywiec.hexagonal.library.borrowing.model.exception.AvailableBookNotFoundExeption;
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservationCommand;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservedBook;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.incoming.MakeBookAvailable;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.incoming.ReserveBook;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing.BorrowingDatabase;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing.BorrowingEventPublisher;
-
-public class BorrowingFacade implements MakeBookAvailable, ReserveBook {
-
- private final BorrowingDatabase database;
- private final BorrowingEventPublisher eventPublisher;
-
- public BorrowingFacade(BorrowingDatabase database, BorrowingEventPublisher eventPublisher) {
- this.database = database;
- this.eventPublisher = eventPublisher;
- }
-
- @Override
- public void handle(MakeBookAvailableCommand bookAvailableCommand) {
- database.setBookAvailable(bookAvailableCommand.getBookId());
- }
-
- @Override
- public Long handle(BookReservationCommand bookReservation) {
- AvailableBook availableBook =
- database.getAvailableBook(bookReservation.getBookId())
- .orElseThrow(() -> new AvailableBookNotFoundExeption(bookReservation.getBookId()));
-
- ActiveUser activeUser =
- database.getActiveUser(bookReservation.getUserId())
- .orElseThrow(() -> new ActiveUserNotFoundException(bookReservation.getUserId()));
-
- ReservedBook reservedBook = activeUser.reserve(availableBook);
- ReservationDetails reservationDetails = database.save(reservedBook);
- eventPublisher.publish(new BookReservedEvent(reservationDetails));
- return reservationDetails.getReservationId().getIdAsLong();
- }
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/Book.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/Book.java
deleted file mode 100644
index aa6870c..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/Book.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model;
-
-interface Book {
- Long getIdAsLong();
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/BorrowBook.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/BorrowBook.java
deleted file mode 100644
index edb6fdc..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/BorrowBook.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing.ports.incoming;
-
-public interface BorrowBook {
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/CancelReservation.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/CancelReservation.java
deleted file mode 100644
index 283d9fa..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/CancelReservation.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing.ports.incoming;
-
-public interface CancelReservation {
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/GiveBackBook.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/GiveBackBook.java
deleted file mode 100644
index 9d2c805..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/GiveBackBook.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing.ports.incoming;
-
-public interface GiveBackBook {
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/MakeBookAvailable.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/MakeBookAvailable.java
deleted file mode 100644
index 8a7c3c8..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/MakeBookAvailable.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing.ports.incoming;
-
-import io.wkrzywiec.hexagonal.library.borrowing.model.MakeBookAvailableCommand;
-
-public interface MakeBookAvailable {
- void handle(MakeBookAvailableCommand bookAvailableCommand);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/ReserveBook.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/ReserveBook.java
deleted file mode 100644
index 28cc2c6..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/incoming/ReserveBook.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing.ports.incoming;
-
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservationCommand;
-
-public interface ReserveBook {
- Long handle(BookReservationCommand bookReservation);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/outgoing/BorrowingDatabase.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/outgoing/BorrowingDatabase.java
deleted file mode 100644
index 5e33471..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/outgoing/BorrowingDatabase.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing;
-
-import io.wkrzywiec.hexagonal.library.borrowing.model.ActiveUser;
-import io.wkrzywiec.hexagonal.library.borrowing.model.AvailableBook;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservationDetails;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservedBook;
-
-import java.util.Optional;
-
-public interface BorrowingDatabase {
- void setBookAvailable(Long bookId);
- Optional getAvailableBook(Long bookId);
- Optional getActiveUser(Long userId);
- ReservationDetails save(ReservedBook reservedBook);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/outgoing/BorrowingEventPublisher.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/outgoing/BorrowingEventPublisher.java
deleted file mode 100644
index 5d025eb..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/ports/outgoing/BorrowingEventPublisher.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing;
-
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservedEvent;
-
-public interface BorrowingEventPublisher {
- public void publish(BookReservedEvent event);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/application/NewBookWasAddedEventHandler.java
similarity index 56%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/application/NewBookWasAddedEventHandler.java
index c57f9b2..b3e61dd 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/application/NewBookWasAddedEventHandler.java
@@ -1,8 +1,8 @@
-package io.wkrzywiec.hexagonal.library.borrowing.application;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.application;
-import io.wkrzywiec.hexagonal.library.borrowing.model.MakeBookAvailableCommand;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.incoming.MakeBookAvailable;
-import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.MakeBookAvailableCommand;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming.MakeBookAvailable;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.NewBookWasAddedEvent;
import lombok.RequiredArgsConstructor;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/ReservationController.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/application/ReservationController.java
similarity index 77%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/ReservationController.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/application/ReservationController.java
index 3875333..dbce94b 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/ReservationController.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/application/ReservationController.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.borrowing.application;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.application;
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservationCommand;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.incoming.ReserveBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservationCommand;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming.ReserveBook;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/BorrowingFacade.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/BorrowingFacade.java
new file mode 100644
index 0000000..c5640de
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/BorrowingFacade.java
@@ -0,0 +1,62 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core;
+
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ActiveUser;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.AvailableBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservationCommand;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservedEvent;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.DueDate;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.MakeBookAvailableCommand;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.OverdueReservation;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservationDetails;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservedBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.exception.ActiveUserNotFoundException;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.exception.AvailableBookNotFoundExeption;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming.CancelOverdueReservations;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming.MakeBookAvailable;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming.ReserveBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing.BorrowingDatabase;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing.BorrowingEventPublisher;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+
+public class BorrowingFacade implements MakeBookAvailable, ReserveBook, CancelOverdueReservations {
+
+ private final BorrowingDatabase database;
+ private final BorrowingEventPublisher eventPublisher;
+
+ public BorrowingFacade(BorrowingDatabase database, BorrowingEventPublisher eventPublisher) {
+ this.database = database;
+ this.eventPublisher = eventPublisher;
+ }
+
+ @Override
+ public void handle(MakeBookAvailableCommand bookAvailableCommand) {
+ database.setBookAvailable(bookAvailableCommand.getBookId());
+ }
+
+ @Override
+ public Long handle(BookReservationCommand bookReservation) {
+ AvailableBook availableBook =
+ database.getAvailableBook(bookReservation.getBookId())
+ .orElseThrow(() -> new AvailableBookNotFoundExeption(bookReservation.getBookId()));
+
+ ActiveUser activeUser =
+ database.getActiveUser(bookReservation.getUserId())
+ .orElseThrow(() -> new ActiveUserNotFoundException(bookReservation.getUserId()));
+
+ ReservedBook reservedBook = activeUser.reserve(availableBook);
+ ReservationDetails reservationDetails = database.save(reservedBook);
+ eventPublisher.publish(new BookReservedEvent(reservationDetails));
+ return reservationDetails.getReservationId().getIdAsLong();
+ }
+
+ @Override
+ public void cancelOverdueReservations() {
+ DueDate dueDate = new DueDate(Instant.now().plus(3L, ChronoUnit.DAYS));
+ List overdueReservationList = database.findReservationsAfter(dueDate);
+ overdueReservationList.forEach(
+ overdue -> database.setBookAvailable(overdue.getBookIdentificationAsLong()));
+ }
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ActiveUser.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ActiveUser.java
similarity index 82%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ActiveUser.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ActiveUser.java
index 84c5920..1319606 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ActiveUser.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ActiveUser.java
@@ -1,6 +1,6 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
-import io.wkrzywiec.hexagonal.library.borrowing.model.exception.TooManyBooksAssignedToUserException;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.exception.TooManyBooksAssignedToUserException;
import lombok.EqualsAndHashCode;
import java.util.List;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/AvailableBook.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/AvailableBook.java
similarity index 79%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/AvailableBook.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/AvailableBook.java
index ab118c7..7ca2b02 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/AvailableBook.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/AvailableBook.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/Book.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/Book.java
new file mode 100644
index 0000000..87cfd6c
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/Book.java
@@ -0,0 +1,5 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
+
+interface Book {
+ Long getIdAsLong();
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/BookIdentification.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/BookIdentification.java
new file mode 100644
index 0000000..8bcd488
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/BookIdentification.java
@@ -0,0 +1,12 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
+
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public class BookIdentification {
+ private final Long value;
+
+ public Long getValueAsLong(){
+ return value;
+ }
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/BookReservationCommand.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/BookReservationCommand.java
similarity index 75%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/BookReservationCommand.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/BookReservationCommand.java
index 9e87947..6ba080c 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/BookReservationCommand.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/BookReservationCommand.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/BookReservedEvent.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/BookReservedEvent.java
similarity index 92%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/BookReservedEvent.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/BookReservedEvent.java
index 6b29e35..2674ee2 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/BookReservedEvent.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/BookReservedEvent.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
import java.time.Instant;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/DueDate.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/DueDate.java
new file mode 100644
index 0000000..3f11e95
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/DueDate.java
@@ -0,0 +1,14 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
+
+import lombok.AllArgsConstructor;
+
+import java.time.Instant;
+
+@AllArgsConstructor
+public class DueDate {
+ private final Instant timeStamp;
+
+ public Instant asInstant(){
+ return timeStamp;
+ }
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/MakeBookAvailableCommand.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/MakeBookAvailableCommand.java
similarity index 62%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/MakeBookAvailableCommand.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/MakeBookAvailableCommand.java
index 895e3b9..3144247 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/MakeBookAvailableCommand.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/MakeBookAvailableCommand.java
@@ -1,10 +1,8 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
-import lombok.Data;
import lombok.Getter;
-import lombok.NoArgsConstructor;
@AllArgsConstructor
@Getter
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/OverdueReservation.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/OverdueReservation.java
new file mode 100644
index 0000000..b45b831
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/OverdueReservation.java
@@ -0,0 +1,13 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
+
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public class OverdueReservation {
+ private Long reservationId;
+ private Long bookIdentification;
+
+ public Long getBookIdentificationAsLong() {
+ return bookIdentification;
+ }
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ReservationDetails.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ReservationDetails.java
similarity index 85%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ReservationDetails.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ReservationDetails.java
index 0bfbb86..7ff14e2 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ReservationDetails.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ReservationDetails.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
import lombok.EqualsAndHashCode;
import lombok.Getter;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ReservationId.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ReservationId.java
similarity index 77%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ReservationId.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ReservationId.java
index 83dff32..5d285da 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ReservationId.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ReservationId.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ReservedBook.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ReservedBook.java
similarity index 62%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ReservedBook.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ReservedBook.java
index effae98..8dceb73 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/ReservedBook.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/ReservedBook.java
@@ -1,16 +1,20 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model;
import lombok.EqualsAndHashCode;
+import java.time.Instant;
+
@EqualsAndHashCode
public class ReservedBook implements Book {
private final Long bookId;
private final Long userId;
+ private final Instant reservedDate;
public ReservedBook(Long bookId, Long userId) {
this.bookId = bookId;
this.userId = userId;
+ this.reservedDate = Instant.now();
}
@Override
@@ -21,4 +25,8 @@ public class ReservedBook implements Book {
public Long getAssignedUserIdAsLong(){
return userId;
}
+
+ public Instant getReservedDateAsInstant(){
+ return reservedDate;
+ }
}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/exception/ActiveUserNotFoundException.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/exception/ActiveUserNotFoundException.java
similarity index 77%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/exception/ActiveUserNotFoundException.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/exception/ActiveUserNotFoundException.java
index 6b32338..cedd3e9 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/exception/ActiveUserNotFoundException.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/exception/ActiveUserNotFoundException.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model.exception;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.exception;
public class ActiveUserNotFoundException extends RuntimeException {
public ActiveUserNotFoundException(Long bookId){
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/exception/AvailableBookNotFoundExeption.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/exception/AvailableBookNotFoundExeption.java
similarity index 77%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/exception/AvailableBookNotFoundExeption.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/exception/AvailableBookNotFoundExeption.java
index 93a7193..dffeb2d 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/exception/AvailableBookNotFoundExeption.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/exception/AvailableBookNotFoundExeption.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model.exception;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.exception;
public class AvailableBookNotFoundExeption extends RuntimeException {
public AvailableBookNotFoundExeption(Long bookId){
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/exception/TooManyBooksAssignedToUserException.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/exception/TooManyBooksAssignedToUserException.java
similarity index 81%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/exception/TooManyBooksAssignedToUserException.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/exception/TooManyBooksAssignedToUserException.java
index bdfecf6..c5f458e 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/model/exception/TooManyBooksAssignedToUserException.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/model/exception/TooManyBooksAssignedToUserException.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.borrowing.model.exception;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.exception;
public class TooManyBooksAssignedToUserException extends RuntimeException {
public TooManyBooksAssignedToUserException(Long userId){
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/BorrowBook.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/BorrowBook.java
new file mode 100644
index 0000000..0c007f3
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/BorrowBook.java
@@ -0,0 +1,4 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming;
+
+public interface BorrowBook {
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/CancelOverdueReservations.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/CancelOverdueReservations.java
new file mode 100644
index 0000000..236ace7
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/CancelOverdueReservations.java
@@ -0,0 +1,5 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming;
+
+public interface CancelOverdueReservations {
+ void cancelOverdueReservations();
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/GiveBackBook.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/GiveBackBook.java
new file mode 100644
index 0000000..73d33c8
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/GiveBackBook.java
@@ -0,0 +1,4 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming;
+
+public interface GiveBackBook {
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/MakeBookAvailable.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/MakeBookAvailable.java
new file mode 100644
index 0000000..d1569ae
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/MakeBookAvailable.java
@@ -0,0 +1,7 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming;
+
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.MakeBookAvailableCommand;
+
+public interface MakeBookAvailable {
+ void handle(MakeBookAvailableCommand bookAvailableCommand);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/ReserveBook.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/ReserveBook.java
new file mode 100644
index 0000000..163196a
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/incoming/ReserveBook.java
@@ -0,0 +1,7 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming;
+
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservationCommand;
+
+public interface ReserveBook {
+ Long handle(BookReservationCommand bookReservation);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/outgoing/BorrowingDatabase.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/outgoing/BorrowingDatabase.java
new file mode 100644
index 0000000..06bac02
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/outgoing/BorrowingDatabase.java
@@ -0,0 +1,19 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing;
+
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ActiveUser;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.AvailableBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.DueDate;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.OverdueReservation;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservationDetails;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservedBook;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface BorrowingDatabase {
+ void setBookAvailable(Long bookId);
+ Optional getAvailableBook(Long bookId);
+ Optional getActiveUser(Long userId);
+ ReservationDetails save(ReservedBook reservedBook);
+ List findReservationsAfter(DueDate dueDate);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/outgoing/BorrowingEventPublisher.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/outgoing/BorrowingEventPublisher.java
new file mode 100644
index 0000000..3d69971
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/core/ports/outgoing/BorrowingEventPublisher.java
@@ -0,0 +1,7 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing;
+
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservedEvent;
+
+public interface BorrowingEventPublisher {
+ public void publish(BookReservedEvent event);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/BorrowingDatabaseAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/BorrowingDatabaseAdapter.java
similarity index 52%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/BorrowingDatabaseAdapter.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/BorrowingDatabaseAdapter.java
index 20150fc..e3b74c8 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/BorrowingDatabaseAdapter.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/BorrowingDatabaseAdapter.java
@@ -1,18 +1,24 @@
-package io.wkrzywiec.hexagonal.library.borrowing.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.infrastructure;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ActiveUser;
-import io.wkrzywiec.hexagonal.library.borrowing.model.AvailableBook;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservationDetails;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservationId;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservedBook;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing.BorrowingDatabase;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.infrastructure.entity.OverdueReservationEntity;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ActiveUser;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.AvailableBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.DueDate;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.OverdueReservation;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservationDetails;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservationId;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservedBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing.BorrowingDatabase;
import lombok.RequiredArgsConstructor;
import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
+import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
+import java.util.stream.Collectors;
@RequiredArgsConstructor
public class BorrowingDatabaseAdapter implements BorrowingDatabase {
@@ -24,6 +30,14 @@ public class BorrowingDatabaseAdapter implements BorrowingDatabase {
jdbcTemplate.update(
"INSERT INTO available (book_id) VALUES (?)",
bookId);
+
+ jdbcTemplate.update(
+ "DELETE FROM reserved WHERE book_id = ?",
+ bookId);
+
+ jdbcTemplate.update(
+ "DELETE FROM borrowed WHERE book_id = ?",
+ bookId);
}
@Override
@@ -69,9 +83,14 @@ public class BorrowingDatabaseAdapter implements BorrowingDatabase {
@Override
public ReservationDetails save(ReservedBook reservedBook) {
jdbcTemplate.update(
- "INSERT INTO reserved (book_id, user_id) VALUES (?, ?)",
+ "INSERT INTO reserved (book_id, user_id, reserved_date) VALUES (?, ?, ?)",
reservedBook.getIdAsLong(),
- reservedBook.getAssignedUserIdAsLong());
+ reservedBook.getAssignedUserIdAsLong(),
+ reservedBook.getReservedDateAsInstant());
+
+ jdbcTemplate.update(
+ "DELETE FROM available WHERE book_id = ?",
+ reservedBook.getIdAsLong());
ReservationId reservationId = jdbcTemplate.queryForObject(
"SELECT id FROM reserved WHERE book_id = ?",
@@ -79,4 +98,15 @@ public class BorrowingDatabaseAdapter implements BorrowingDatabase {
reservedBook.getIdAsLong());
return new ReservationDetails(reservationId, reservedBook);
}
+
+ @Override
+ public List findReservationsAfter(DueDate dueDate) {
+ List entities = jdbcTemplate.query(
+ "SELECT id AS reservationId, book_id AS bookIdentification FROM reserved WHERE reserved_date > ?",
+ new BeanPropertyRowMapper(OverdueReservationEntity.class),
+ Timestamp.from(dueDate.asInstant()));
+ return entities.stream()
+ .map(entity -> new OverdueReservation(entity.getReservationId(), entity.getBookIdentification()))
+ .collect(Collectors.toList());
+ }
}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/SpringBorrowingEventPublisherAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/SpringBorrowingEventPublisherAdapter.java
similarity index 63%
rename from src/main/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/SpringBorrowingEventPublisherAdapter.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/SpringBorrowingEventPublisherAdapter.java
index 1feeb7f..825803a 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/SpringBorrowingEventPublisherAdapter.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/SpringBorrowingEventPublisherAdapter.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.borrowing.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.infrastructure;
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservedEvent;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing.BorrowingEventPublisher;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservedEvent;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing.BorrowingEventPublisher;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/entity/OverdueReservationEntity.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/entity/OverdueReservationEntity.java
new file mode 100644
index 0000000..fae1588
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/entity/OverdueReservationEntity.java
@@ -0,0 +1,9 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing.infrastructure.entity;
+
+import lombok.Data;
+
+@Data
+public class OverdueReservationEntity {
+ private Long reservationId;
+ private Long bookIdentification;
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/application/BookReservedEventHandler.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/application/BookReservedEventHandler.java
similarity index 64%
rename from src/main/java/io/wkrzywiec/hexagonal/library/email/application/BookReservedEventHandler.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/email/application/BookReservedEventHandler.java
index 15d4af4..308e1e5 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/application/BookReservedEventHandler.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/application/BookReservedEventHandler.java
@@ -1,8 +1,8 @@
-package io.wkrzywiec.hexagonal.library.email.application;
+package io.wkrzywiec.hexagonal.library.domain.email.application;
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservedEvent;
-import io.wkrzywiec.hexagonal.library.email.model.SendReservationConfirmationCommand;
-import io.wkrzywiec.hexagonal.library.email.ports.incoming.SendReservationConfirmation;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservedEvent;
+import io.wkrzywiec.hexagonal.library.domain.email.core.model.SendReservationConfirmationCommand;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.incoming.SendReservationConfirmation;
import lombok.RequiredArgsConstructor;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/EmailCreator.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/EmailCreator.java
similarity index 75%
rename from src/main/java/io/wkrzywiec/hexagonal/library/email/EmailCreator.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/EmailCreator.java
index 957ecf6..4274592 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/EmailCreator.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/EmailCreator.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.email;
+package io.wkrzywiec.hexagonal.library.domain.email.core;
-import io.wkrzywiec.hexagonal.library.email.model.EmailAddress;
-import io.wkrzywiec.hexagonal.library.email.model.ReservationConfirmEmail;
+import io.wkrzywiec.hexagonal.library.domain.email.core.model.EmailAddress;
+import io.wkrzywiec.hexagonal.library.domain.email.core.model.ReservationConfirmEmail;
class EmailCreator {
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/EmailFacade.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/EmailFacade.java
similarity index 70%
rename from src/main/java/io/wkrzywiec/hexagonal/library/email/EmailFacade.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/EmailFacade.java
index 7587459..a6ef74c 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/EmailFacade.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/EmailFacade.java
@@ -1,10 +1,10 @@
-package io.wkrzywiec.hexagonal.library.email;
+package io.wkrzywiec.hexagonal.library.domain.email.core;
-import io.wkrzywiec.hexagonal.library.email.model.ReservationConfirmEmail;
-import io.wkrzywiec.hexagonal.library.email.model.SendReservationConfirmationCommand;
-import io.wkrzywiec.hexagonal.library.email.ports.incoming.SendReservationConfirmation;
-import io.wkrzywiec.hexagonal.library.email.ports.outgoing.EmailSender;
-import io.wkrzywiec.hexagonal.library.email.ports.outgoing.EmailDatabase;
+import io.wkrzywiec.hexagonal.library.domain.email.core.model.ReservationConfirmEmail;
+import io.wkrzywiec.hexagonal.library.domain.email.core.model.SendReservationConfirmationCommand;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.incoming.SendReservationConfirmation;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing.EmailSender;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing.EmailDatabase;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/model/EmailAddress.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/EmailAddress.java
similarity index 89%
rename from src/main/java/io/wkrzywiec/hexagonal/library/email/model/EmailAddress.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/EmailAddress.java
index 49eede0..8120e3b 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/model/EmailAddress.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/EmailAddress.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.email.model;
+package io.wkrzywiec.hexagonal.library.domain.email.core.model;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/model/ReservationConfirmEmail.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/ReservationConfirmEmail.java
similarity index 90%
rename from src/main/java/io/wkrzywiec/hexagonal/library/email/model/ReservationConfirmEmail.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/ReservationConfirmEmail.java
index 4dad314..98cf8d4 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/model/ReservationConfirmEmail.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/ReservationConfirmEmail.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.email.model;
+package io.wkrzywiec.hexagonal.library.domain.email.core.model;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/model/SendReservationConfirmationCommand.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/SendReservationConfirmationCommand.java
similarity index 85%
rename from src/main/java/io/wkrzywiec/hexagonal/library/email/model/SendReservationConfirmationCommand.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/SendReservationConfirmationCommand.java
index ddfa534..4ba381d 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/model/SendReservationConfirmationCommand.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/SendReservationConfirmationCommand.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.email.model;
+package io.wkrzywiec.hexagonal.library.domain.email.core.model;
import lombok.Getter;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/ports/incoming/SendReservationConfirmation.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/ports/incoming/SendReservationConfirmation.java
new file mode 100644
index 0000000..93ff62c
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/ports/incoming/SendReservationConfirmation.java
@@ -0,0 +1,7 @@
+package io.wkrzywiec.hexagonal.library.domain.email.core.ports.incoming;
+
+import io.wkrzywiec.hexagonal.library.domain.email.core.model.SendReservationConfirmationCommand;
+
+public interface SendReservationConfirmation {
+ void handle(SendReservationConfirmationCommand reservationConfirmationCommand);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/ports/outgoing/EmailDatabase.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/ports/outgoing/EmailDatabase.java
similarity index 70%
rename from src/main/java/io/wkrzywiec/hexagonal/library/email/ports/outgoing/EmailDatabase.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/ports/outgoing/EmailDatabase.java
index 936bedb..78455f4 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/ports/outgoing/EmailDatabase.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/ports/outgoing/EmailDatabase.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.email.ports.outgoing;
+package io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing;
import java.util.Optional;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/ports/outgoing/EmailSender.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/ports/outgoing/EmailSender.java
new file mode 100644
index 0000000..f5a1ba2
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/core/ports/outgoing/EmailSender.java
@@ -0,0 +1,8 @@
+package io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing;
+
+
+import io.wkrzywiec.hexagonal.library.domain.email.core.model.ReservationConfirmEmail;
+
+public interface EmailSender {
+ void sendReservationConfirmationEmail(ReservationConfirmEmail reservationConfirmEmail);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/infrastructure/EmailDatabaseAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/infrastructure/EmailDatabaseAdapter.java
similarity index 87%
rename from src/main/java/io/wkrzywiec/hexagonal/library/email/infrastructure/EmailDatabaseAdapter.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/email/infrastructure/EmailDatabaseAdapter.java
index 507abf7..b581715 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/infrastructure/EmailDatabaseAdapter.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/infrastructure/EmailDatabaseAdapter.java
@@ -1,6 +1,6 @@
-package io.wkrzywiec.hexagonal.library.email.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.email.infrastructure;
-import io.wkrzywiec.hexagonal.library.email.ports.outgoing.EmailDatabase;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing.EmailDatabase;
import lombok.RequiredArgsConstructor;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/infrastructure/SendGridEmailSender.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/infrastructure/SendGridEmailSender.java
similarity index 83%
rename from src/main/java/io/wkrzywiec/hexagonal/library/email/infrastructure/SendGridEmailSender.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/email/infrastructure/SendGridEmailSender.java
index 38c21d7..78cb417 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/infrastructure/SendGridEmailSender.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/email/infrastructure/SendGridEmailSender.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.email.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.email.infrastructure;
import com.sendgrid.Method;
import com.sendgrid.Request;
@@ -6,8 +6,8 @@ import com.sendgrid.SendGrid;
import com.sendgrid.helpers.mail.Mail;
import com.sendgrid.helpers.mail.objects.Content;
import com.sendgrid.helpers.mail.objects.Email;
-import io.wkrzywiec.hexagonal.library.email.model.ReservationConfirmEmail;
-import io.wkrzywiec.hexagonal.library.email.ports.outgoing.EmailSender;
+import io.wkrzywiec.hexagonal.library.domain.email.core.model.ReservationConfirmEmail;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing.EmailSender;
import java.io.IOException;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/application/BookCommandController.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/application/BookCommandController.java
similarity index 76%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/application/BookCommandController.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/application/BookCommandController.java
index 01b0da0..c9a592e 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/application/BookCommandController.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/application/BookCommandController.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.inventory.application;
+package io.wkrzywiec.hexagonal.library.domain.inventory.application;
-import io.wkrzywiec.hexagonal.library.inventory.model.AddNewBookCommand;
-import io.wkrzywiec.hexagonal.library.inventory.ports.incoming.AddNewBook;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.AddNewBookCommand;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.incoming.AddNewBook;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/InventoryFacade.java
similarity index 52%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/InventoryFacade.java
index c1368db..7fceaea 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/InventoryFacade.java
@@ -1,12 +1,12 @@
-package io.wkrzywiec.hexagonal.library.inventory;
+package io.wkrzywiec.hexagonal.library.domain.inventory.core;
-import io.wkrzywiec.hexagonal.library.inventory.model.AddNewBookCommand;
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
-import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent;
-import io.wkrzywiec.hexagonal.library.inventory.ports.incoming.AddNewBook;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryEventPublisher;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.GetBookDetails;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryDatabase;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.AddNewBookCommand;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.NewBookWasAddedEvent;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.incoming.AddNewBook;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.InventoryEventPublisher;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.GetBookDetails;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.InventoryDatabase;
public class InventoryFacade implements AddNewBook{
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/AddNewBookCommand.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/AddNewBookCommand.java
similarity index 75%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/AddNewBookCommand.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/AddNewBookCommand.java
index f6f3a41..09bf7ff 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/AddNewBookCommand.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/AddNewBookCommand.java
@@ -1,8 +1,7 @@
-package io.wkrzywiec.hexagonal.library.inventory.model;
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
-import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Author.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Author.java
similarity index 90%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Author.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Author.java
index 2003b8b..898d9e2 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Author.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Author.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.inventory.model;
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.model;
import lombok.EqualsAndHashCode;
import lombok.ToString;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Book.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Book.java
similarity index 96%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Book.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Book.java
index 4e81980..cd0da6c 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Book.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Book.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.inventory.model;
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.model;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/BookIdentification.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/BookIdentification.java
similarity index 89%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/BookIdentification.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/BookIdentification.java
index f413a9a..cf6f76a 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/BookIdentification.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/BookIdentification.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.inventory.model;
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.model;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Isbn10.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Isbn10.java
similarity index 88%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Isbn10.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Isbn10.java
index 561fc2d..e963179 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Isbn10.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Isbn10.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.inventory.model;
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.model;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Isbn13.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Isbn13.java
similarity index 86%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Isbn13.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Isbn13.java
index 791e879..f10c4c7 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Isbn13.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/Isbn13.java
@@ -1,7 +1,6 @@
-package io.wkrzywiec.hexagonal.library.inventory.model;
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.model;
import lombok.EqualsAndHashCode;
-import lombok.ToString;
import javax.persistence.Column;
import javax.persistence.Embeddable;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/NewBookWasAddedEvent.java
similarity index 85%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/NewBookWasAddedEvent.java
index 3a6c4f6..3ef18d8 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/NewBookWasAddedEvent.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.inventory.model;
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.model;
import java.time.Instant;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/incoming/AddNewBook.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/incoming/AddNewBook.java
new file mode 100644
index 0000000..456ecfb
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/incoming/AddNewBook.java
@@ -0,0 +1,7 @@
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.incoming;
+
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.AddNewBookCommand;
+
+public interface AddNewBook {
+ void handle(AddNewBookCommand addNewBookCommand);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/outgoing/GetBookDetails.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/outgoing/GetBookDetails.java
new file mode 100644
index 0000000..8d5760e
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/outgoing/GetBookDetails.java
@@ -0,0 +1,7 @@
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing;
+
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
+
+public interface GetBookDetails {
+ Book handle(String bookId);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/outgoing/InventoryDatabase.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/outgoing/InventoryDatabase.java
new file mode 100644
index 0000000..7f00c0a
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/outgoing/InventoryDatabase.java
@@ -0,0 +1,7 @@
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing;
+
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
+
+public interface InventoryDatabase {
+ Book save(Book book);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/outgoing/InventoryEventPublisher.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/outgoing/InventoryEventPublisher.java
new file mode 100644
index 0000000..ca80248
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/ports/outgoing/InventoryEventPublisher.java
@@ -0,0 +1,7 @@
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing;
+
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.NewBookWasAddedEvent;
+
+public interface InventoryEventPublisher {
+ void publishNewBookWasAddedEvent(NewBookWasAddedEvent event);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/BookRepository.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/BookRepository.java
similarity index 57%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/BookRepository.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/BookRepository.java
index ae06c1c..e64dbeb 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/BookRepository.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/BookRepository.java
@@ -1,6 +1,6 @@
-package io.wkrzywiec.hexagonal.library.inventory.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure;
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/GoogleBooksAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/GoogleBooksAdapter.java
similarity index 89%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/GoogleBooksAdapter.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/GoogleBooksAdapter.java
index d2e2aad..22030a8 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/GoogleBooksAdapter.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/GoogleBooksAdapter.java
@@ -1,14 +1,14 @@
-package io.wkrzywiec.hexagonal.library.inventory.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
-import io.wkrzywiec.hexagonal.library.inventory.model.Author;
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
-import io.wkrzywiec.hexagonal.library.inventory.model.BookIdentification;
-import io.wkrzywiec.hexagonal.library.inventory.model.Isbn10;
-import io.wkrzywiec.hexagonal.library.inventory.model.Isbn13;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.GetBookDetails;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Author;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.BookIdentification;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Isbn10;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Isbn13;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.GetBookDetails;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/InventoryDatabaseAdapter.java
similarity index 53%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/InventoryDatabaseAdapter.java
index 0a47d0d..e3ba1ff 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/InventoryDatabaseAdapter.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.inventory.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure;
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryDatabase;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.InventoryDatabase;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/SpringInventoryEventPublisherAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/SpringInventoryEventPublisherAdapter.java
similarity index 62%
rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/SpringInventoryEventPublisherAdapter.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/SpringInventoryEventPublisherAdapter.java
index 6d9868d..15b0f79 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/SpringInventoryEventPublisherAdapter.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/SpringInventoryEventPublisherAdapter.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.inventory.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure;
-import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryEventPublisher;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.NewBookWasAddedEvent;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.InventoryEventPublisher;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/user/application/UserCommandController.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/application/UserCommandController.java
similarity index 77%
rename from src/main/java/io/wkrzywiec/hexagonal/library/user/application/UserCommandController.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/user/application/UserCommandController.java
index 174b35f..a63d1cd 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/user/application/UserCommandController.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/application/UserCommandController.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.user.application;
+package io.wkrzywiec.hexagonal.library.domain.user.application;
-import io.wkrzywiec.hexagonal.library.user.model.AddUserCommand;
-import io.wkrzywiec.hexagonal.library.user.ports.incoming.AddNewUser;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.AddUserCommand;
+import io.wkrzywiec.hexagonal.library.domain.user.core.ports.incoming.AddNewUser;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/UserFacade.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/UserFacade.java
new file mode 100644
index 0000000..14162d5
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/UserFacade.java
@@ -0,0 +1,25 @@
+package io.wkrzywiec.hexagonal.library.domain.user.core;
+
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.AddUserCommand;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.EmailAddress;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.User;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.UserIdentifier;
+import io.wkrzywiec.hexagonal.library.domain.user.core.ports.incoming.AddNewUser;
+import io.wkrzywiec.hexagonal.library.domain.user.core.ports.outgoing.UserDatabase;
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public class UserFacade implements AddNewUser {
+
+ private final UserDatabase database;
+
+ @Override
+ public UserIdentifier handle(AddUserCommand addUserCommand) {
+ User user = new User(
+ new EmailAddress(addUserCommand.getEmail()),
+ addUserCommand.getFirstName(),
+ addUserCommand.getLastName()
+ );
+ return database.save(user);
+ }
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/user/model/AddUserCommand.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/AddUserCommand.java
similarity index 82%
rename from src/main/java/io/wkrzywiec/hexagonal/library/user/model/AddUserCommand.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/AddUserCommand.java
index bfca4dc..8ff2c1e 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/user/model/AddUserCommand.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/AddUserCommand.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.user.model;
+package io.wkrzywiec.hexagonal.library.domain.user.core.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/user/model/EmailAddress.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/EmailAddress.java
similarity index 91%
rename from src/main/java/io/wkrzywiec/hexagonal/library/user/model/EmailAddress.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/EmailAddress.java
index 8983864..fc6fb16 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/user/model/EmailAddress.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/EmailAddress.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.user.model;
+package io.wkrzywiec.hexagonal.library.domain.user.core.model;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/user/model/User.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/User.java
similarity index 91%
rename from src/main/java/io/wkrzywiec/hexagonal/library/user/model/User.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/User.java
index b332a02..514ba60 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/user/model/User.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/User.java
@@ -1,6 +1,5 @@
-package io.wkrzywiec.hexagonal.library.user.model;
+package io.wkrzywiec.hexagonal.library.domain.user.core.model;
-import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import javax.persistence.Column;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/user/model/UserIdentifier.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/UserIdentifier.java
similarity index 74%
rename from src/main/java/io/wkrzywiec/hexagonal/library/user/model/UserIdentifier.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/UserIdentifier.java
index ed019fd..9888779 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/user/model/UserIdentifier.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/model/UserIdentifier.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.user.model;
+package io.wkrzywiec.hexagonal.library.domain.user.core.model;
public class UserIdentifier {
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/ports/incoming/AddNewUser.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/ports/incoming/AddNewUser.java
new file mode 100644
index 0000000..5e7b102
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/ports/incoming/AddNewUser.java
@@ -0,0 +1,8 @@
+package io.wkrzywiec.hexagonal.library.domain.user.core.ports.incoming;
+
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.AddUserCommand;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.UserIdentifier;
+
+public interface AddNewUser {
+ UserIdentifier handle(AddUserCommand addUserCommand);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/ports/outgoing/UserDatabase.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/ports/outgoing/UserDatabase.java
new file mode 100644
index 0000000..e831563
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/core/ports/outgoing/UserDatabase.java
@@ -0,0 +1,8 @@
+package io.wkrzywiec.hexagonal.library.domain.user.core.ports.outgoing;
+
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.User;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.UserIdentifier;
+
+public interface UserDatabase {
+ UserIdentifier save(User user);
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/user/infrastructure/UserDatabaseAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/infrastructure/UserDatabaseAdapter.java
similarity index 55%
rename from src/main/java/io/wkrzywiec/hexagonal/library/user/infrastructure/UserDatabaseAdapter.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/user/infrastructure/UserDatabaseAdapter.java
index ff62ff0..ca27208 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/user/infrastructure/UserDatabaseAdapter.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/infrastructure/UserDatabaseAdapter.java
@@ -1,8 +1,8 @@
-package io.wkrzywiec.hexagonal.library.user.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.user.infrastructure;
-import io.wkrzywiec.hexagonal.library.user.model.User;
-import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
-import io.wkrzywiec.hexagonal.library.user.ports.outgoing.UserDatabase;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.User;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.UserIdentifier;
+import io.wkrzywiec.hexagonal.library.domain.user.core.ports.outgoing.UserDatabase;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/user/infrastructure/UserRepository.java b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/infrastructure/UserRepository.java
similarity index 59%
rename from src/main/java/io/wkrzywiec/hexagonal/library/user/infrastructure/UserRepository.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/domain/user/infrastructure/UserRepository.java
index c816fb8..4588bcb 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/user/infrastructure/UserRepository.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/domain/user/infrastructure/UserRepository.java
@@ -1,6 +1,6 @@
-package io.wkrzywiec.hexagonal.library.user.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.user.infrastructure;
-import io.wkrzywiec.hexagonal.library.user.model.User;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.User;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/ports/incoming/SendReservationConfirmation.java b/src/main/java/io/wkrzywiec/hexagonal/library/email/ports/incoming/SendReservationConfirmation.java
deleted file mode 100644
index 5c671da..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/ports/incoming/SendReservationConfirmation.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.wkrzywiec.hexagonal.library.email.ports.incoming;
-
-import io.wkrzywiec.hexagonal.library.email.model.SendReservationConfirmationCommand;
-
-public interface SendReservationConfirmation {
- void handle(SendReservationConfirmationCommand reservationConfirmationCommand);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/email/ports/outgoing/EmailSender.java b/src/main/java/io/wkrzywiec/hexagonal/library/email/ports/outgoing/EmailSender.java
deleted file mode 100644
index 44e2b8d..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/email/ports/outgoing/EmailSender.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package io.wkrzywiec.hexagonal.library.email.ports.outgoing;
-
-
-import io.wkrzywiec.hexagonal.library.email.model.ReservationConfirmEmail;
-
-public interface EmailSender {
- void sendReservationConfirmationEmail(ReservationConfirmEmail reservationConfirmEmail);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/BorrowingDomainConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/BorrowingDomainConfig.java
similarity index 55%
rename from src/main/java/io/wkrzywiec/hexagonal/library/BorrowingDomainConfig.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/BorrowingDomainConfig.java
index 9fd3925..1ad64fa 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/BorrowingDomainConfig.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/BorrowingDomainConfig.java
@@ -1,11 +1,11 @@
-package io.wkrzywiec.hexagonal.library;
+package io.wkrzywiec.hexagonal.library.infrastructure;
-import io.wkrzywiec.hexagonal.library.borrowing.BorrowingFacade;
-import io.wkrzywiec.hexagonal.library.borrowing.infrastructure.BorrowingDatabaseAdapter;
-import io.wkrzywiec.hexagonal.library.borrowing.infrastructure.SpringBorrowingEventPublisherAdapter;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.incoming.MakeBookAvailable;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing.BorrowingDatabase;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing.BorrowingEventPublisher;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.BorrowingFacade;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.infrastructure.BorrowingDatabaseAdapter;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.infrastructure.SpringBorrowingEventPublisherAdapter;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.incoming.MakeBookAvailable;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing.BorrowingDatabase;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing.BorrowingEventPublisher;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/EmailDomainConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/EmailDomainConfig.java
new file mode 100644
index 0000000..54991fd
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/EmailDomainConfig.java
@@ -0,0 +1,28 @@
+package io.wkrzywiec.hexagonal.library.infrastructure;
+
+import io.wkrzywiec.hexagonal.library.domain.email.core.EmailFacade;
+import io.wkrzywiec.hexagonal.library.domain.email.infrastructure.EmailDatabaseAdapter;
+import io.wkrzywiec.hexagonal.library.domain.email.infrastructure.SendGridEmailSender;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.incoming.SendReservationConfirmation;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing.EmailSender;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing.EmailDatabase;
+import org.springframework.context.annotation.Bean;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+public class EmailDomainConfig {
+
+ @Bean
+ public EmailSender emailSender() {
+ return new SendGridEmailSender();
+ }
+
+ @Bean
+ public EmailDatabase libraryDatabase(JdbcTemplate jdbcTemplate){
+ return new EmailDatabaseAdapter(jdbcTemplate);
+ }
+
+ @Bean
+ public SendReservationConfirmation sendReservationConfirmation(EmailSender emailSender, EmailDatabase database){
+ return new EmailFacade(emailSender, database);
+ }
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/InventoryDomainConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/InventoryDomainConfig.java
similarity index 54%
rename from src/main/java/io/wkrzywiec/hexagonal/library/InventoryDomainConfig.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/InventoryDomainConfig.java
index 1ff2bcc..d8dd472 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/InventoryDomainConfig.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/InventoryDomainConfig.java
@@ -1,16 +1,16 @@
-package io.wkrzywiec.hexagonal.library;
+package io.wkrzywiec.hexagonal.library.infrastructure;
-import io.wkrzywiec.hexagonal.library.inventory.InventoryFacade;
-import io.wkrzywiec.hexagonal.library.inventory.infrastructure.BookRepository;
-import io.wkrzywiec.hexagonal.library.inventory.infrastructure.GoogleBooksAdapter;
-import io.wkrzywiec.hexagonal.library.inventory.infrastructure.InventoryDatabaseAdapter;
-import io.wkrzywiec.hexagonal.library.inventory.infrastructure.SpringInventoryEventPublisherAdapter;
-import io.wkrzywiec.hexagonal.library.inventory.ports.incoming.AddNewBook;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.InventoryFacade;
+import io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure.BookRepository;
+import io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure.GoogleBooksAdapter;
+import io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure.InventoryDatabaseAdapter;
+import io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure.SpringInventoryEventPublisherAdapter;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.incoming.AddNewBook;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
-class InventoryDomainConfig {
+public class InventoryDomainConfig {
@Bean
SpringInventoryEventPublisherAdapter springInventoryEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/LibraryHexagonalConfig.java
similarity index 80%
rename from src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalConfig.java
rename to src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/LibraryHexagonalConfig.java
index 25fd826..d123ec8 100644
--- a/src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalConfig.java
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/LibraryHexagonalConfig.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library;
+package io.wkrzywiec.hexagonal.library.infrastructure;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/UserDomainConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/UserDomainConfig.java
new file mode 100644
index 0000000..d738b30
--- /dev/null
+++ b/src/main/java/io/wkrzywiec/hexagonal/library/infrastructure/UserDomainConfig.java
@@ -0,0 +1,21 @@
+package io.wkrzywiec.hexagonal.library.infrastructure;
+
+import io.wkrzywiec.hexagonal.library.domain.user.core.UserFacade;
+import io.wkrzywiec.hexagonal.library.domain.user.infrastructure.UserDatabaseAdapter;
+import io.wkrzywiec.hexagonal.library.domain.user.infrastructure.UserRepository;
+import io.wkrzywiec.hexagonal.library.domain.user.core.ports.incoming.AddNewUser;
+import io.wkrzywiec.hexagonal.library.domain.user.core.ports.outgoing.UserDatabase;
+import org.springframework.context.annotation.Bean;
+
+public class UserDomainConfig {
+
+ @Bean
+ public UserDatabase userDatabase(UserRepository userRepository){
+ return new UserDatabaseAdapter(userRepository);
+ }
+
+ @Bean
+ public AddNewUser addNewUser(UserDatabase userDatabase){
+ return new UserFacade(userDatabase);
+ }
+}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/incoming/AddNewBook.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/incoming/AddNewBook.java
deleted file mode 100644
index 5c1322f..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/incoming/AddNewBook.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.wkrzywiec.hexagonal.library.inventory.ports.incoming;
-
-import io.wkrzywiec.hexagonal.library.inventory.model.AddNewBookCommand;
-
-public interface AddNewBook {
- void handle(AddNewBookCommand addNewBookCommand);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/GetBookDetails.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/GetBookDetails.java
deleted file mode 100644
index 87c0f89..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/GetBookDetails.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.wkrzywiec.hexagonal.library.inventory.ports.outgoing;
-
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
-
-public interface GetBookDetails {
- Book handle(String bookId);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryDatabase.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryDatabase.java
deleted file mode 100644
index 943ebef..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryDatabase.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.wkrzywiec.hexagonal.library.inventory.ports.outgoing;
-
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
-
-public interface InventoryDatabase {
- Book save(Book book);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryEventPublisher.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryEventPublisher.java
deleted file mode 100644
index fb47af3..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryEventPublisher.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.wkrzywiec.hexagonal.library.inventory.ports.outgoing;
-
-import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent;
-
-public interface InventoryEventPublisher {
- void publishNewBookWasAddedEvent(NewBookWasAddedEvent event);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/user/UserFacade.java b/src/main/java/io/wkrzywiec/hexagonal/library/user/UserFacade.java
deleted file mode 100644
index 4b16749..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/user/UserFacade.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package io.wkrzywiec.hexagonal.library.user;
-
-import io.wkrzywiec.hexagonal.library.user.model.AddUserCommand;
-import io.wkrzywiec.hexagonal.library.user.model.EmailAddress;
-import io.wkrzywiec.hexagonal.library.user.model.User;
-import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
-import io.wkrzywiec.hexagonal.library.user.ports.incoming.AddNewUser;
-import io.wkrzywiec.hexagonal.library.user.ports.outgoing.UserDatabase;
-import lombok.AllArgsConstructor;
-
-@AllArgsConstructor
-public class UserFacade implements AddNewUser {
-
- private final UserDatabase database;
-
- @Override
- public UserIdentifier handle(AddUserCommand addUserCommand) {
- User user = new User(
- new EmailAddress(addUserCommand.getEmail()),
- addUserCommand.getFirstName(),
- addUserCommand.getLastName()
- );
- return database.save(user);
- }
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/user/ports/incoming/AddNewUser.java b/src/main/java/io/wkrzywiec/hexagonal/library/user/ports/incoming/AddNewUser.java
deleted file mode 100644
index 8375e71..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/user/ports/incoming/AddNewUser.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package io.wkrzywiec.hexagonal.library.user.ports.incoming;
-
-import io.wkrzywiec.hexagonal.library.user.model.AddUserCommand;
-import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
-
-public interface AddNewUser {
- UserIdentifier handle(AddUserCommand addUserCommand);
-}
diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/user/ports/outgoing/UserDatabase.java b/src/main/java/io/wkrzywiec/hexagonal/library/user/ports/outgoing/UserDatabase.java
deleted file mode 100644
index f481496..0000000
--- a/src/main/java/io/wkrzywiec/hexagonal/library/user/ports/outgoing/UserDatabase.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package io.wkrzywiec.hexagonal.library.user.ports.outgoing;
-
-import io.wkrzywiec.hexagonal.library.user.model.User;
-import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
-
-public interface UserDatabase {
- UserIdentifier save(User user);
-}
diff --git a/src/main/resources/db/changelog/03_books_statuses.sql b/src/main/resources/db/changelog/03_books_statuses.sql
index b744842..2ed9a0e 100644
--- a/src/main/resources/db/changelog/03_books_statuses.sql
+++ b/src/main/resources/db/changelog/03_books_statuses.sql
@@ -4,13 +4,15 @@ CREATE TABLE IF NOT EXISTS public.available (
);
CREATE TABLE IF NOT EXISTS public.reserved (
- id BIGSERIAL PRIMARY KEY,
- book_id BIGINT NOT NULL REFERENCES public.book,
- user_id BIGINT NOT NULL REFERENCES public.user
+ id BIGSERIAL PRIMARY KEY,
+ reserved_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ book_id BIGINT NOT NULL REFERENCES public.book,
+ user_id BIGINT NOT NULL REFERENCES public.user
);
CREATE TABLE IF NOT EXISTS public.borrowed (
- id BIGSERIAL PRIMARY KEY,
- book_id BIGINT NOT NULL REFERENCES public.book,
- user_id BIGINT NOT NULL REFERENCES public.user
+ id BIGSERIAL PRIMARY KEY,
+ borrowed_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ book_id BIGINT NOT NULL REFERENCES public.book,
+ user_id BIGINT NOT NULL REFERENCES public.user
);
\ No newline at end of file
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/BookTestData.java b/src/test/java/io/wkrzywiec/hexagonal/library/BookTestData.java
index 1ba86d1..5985281 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/BookTestData.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/BookTestData.java
@@ -1,10 +1,10 @@
package io.wkrzywiec.hexagonal.library;
-import io.wkrzywiec.hexagonal.library.inventory.model.Author;
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
-import io.wkrzywiec.hexagonal.library.inventory.model.BookIdentification;
-import io.wkrzywiec.hexagonal.library.inventory.model.Isbn10;
-import io.wkrzywiec.hexagonal.library.inventory.model.Isbn13;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Author;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.BookIdentification;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Isbn10;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Isbn13;
import java.util.Collections;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/BorrowingArchitectureTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/BorrowingArchitectureTest.java
index 825af04..a149894 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/BorrowingArchitectureTest.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/BorrowingArchitectureTest.java
@@ -4,21 +4,21 @@ import com.tngtech.archunit.core.importer.ImportOption;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
-import io.wkrzywiec.hexagonal.library.borrowing.BorrowingFacade;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.BorrowingFacade;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClass;
import static com.tngtech.archunit.library.Architectures.onionArchitecture;
-@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.borrowing"},
+@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.domain.borrowing"},
importOptions = { ImportOption.DoNotIncludeTests.class })
public class BorrowingArchitectureTest {
@ArchTest
public static final ArchRule hexagonalArchInBorrowingDomain = onionArchitecture()
- .domainModels("io.wkrzywiec.hexagonal.library.borrowing.model..")
- .domainServices("io.wkrzywiec.hexagonal.library.borrowing..")
- .applicationServices("io.wkrzywiec.hexagonal.library.borrowing.application..")
- .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.borrowing.infrastructure..");
+ .domainModels("io.wkrzywiec.hexagonal.library.domain.borrowing.core.model..")
+ .domainServices("io.wkrzywiec.hexagonal.library.domain.borrowing..")
+ .applicationServices("io.wkrzywiec.hexagonal.library.domain.borrowing.application..")
+ .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.domain.borrowing.infrastructure..");
@ArchTest
public static final ArchRule noSpringDependenciesInBorrowingFacade =
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/EmailArchitectureTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/EmailArchitectureTest.java
index 39bdea1..cd5e7d9 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/EmailArchitectureTest.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/EmailArchitectureTest.java
@@ -4,21 +4,21 @@ import com.tngtech.archunit.core.importer.ImportOption;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
-import io.wkrzywiec.hexagonal.library.email.EmailFacade;
+import io.wkrzywiec.hexagonal.library.domain.email.core.EmailFacade;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClass;
import static com.tngtech.archunit.library.Architectures.onionArchitecture;
-@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.email"},
+@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.domain.email"},
importOptions = { ImportOption.DoNotIncludeTests.class })
public class EmailArchitectureTest {
@ArchTest
public static final ArchRule hexagonalArchInEmailDomain = onionArchitecture()
- .domainModels("io.wkrzywiec.hexagonal.library.email.model..")
- .domainServices("io.wkrzywiec.hexagonal.library.email..")
- .applicationServices("io.wkrzywiec.hexagonal.library.email.application..")
- .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.email.infrastructure..");
+ .domainModels("io.wkrzywiec.hexagonal.library.domain.email.core.model..")
+ .domainServices("io.wkrzywiec.hexagonal.library.domain.email..")
+ .applicationServices("io.wkrzywiec.hexagonal.library.domain.email.application..")
+ .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.domain.email.infrastructure..");
@ArchTest
public static final ArchRule noSpringDependenciesInEmailFacade =
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/InventoryArchitectureTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/InventoryArchitectureTest.java
index 24a5b0c..8338c05 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/InventoryArchitectureTest.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/InventoryArchitectureTest.java
@@ -4,21 +4,21 @@ import com.tngtech.archunit.core.importer.ImportOption;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
-import io.wkrzywiec.hexagonal.library.inventory.InventoryFacade;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.InventoryFacade;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClass;
import static com.tngtech.archunit.library.Architectures.onionArchitecture;
-@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.inventory"},
+@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.domain.inventory"},
importOptions = { ImportOption.DoNotIncludeTests.class })
public class InventoryArchitectureTest {
@ArchTest
public static final ArchRule hexagonalArchInInventoryDomain = onionArchitecture()
- .domainModels("io.wkrzywiec.hexagonal.library.inventory.model..")
- .domainServices("io.wkrzywiec.hexagonal.library.inventory..")
- .applicationServices("io.wkrzywiec.hexagonal.library.inventory.application..")
- .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.inventory.infrastructure..");
+ .domainModels("io.wkrzywiec.hexagonal.library.domain.inventory.core.model..")
+ .domainServices("io.wkrzywiec.hexagonal.library.domain.inventory..")
+ .applicationServices("io.wkrzywiec.hexagonal.library.domain.inventory.application..")
+ .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure..");
@ArchTest
public static final ArchRule noSpringDependenciesInInventoryFacade =
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/UserArchitectureTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/UserArchitectureTest.java
index e3a19f5..88dfe0c 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/UserArchitectureTest.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/UserArchitectureTest.java
@@ -4,21 +4,21 @@ import com.tngtech.archunit.core.importer.ImportOption;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
-import io.wkrzywiec.hexagonal.library.user.UserFacade;
+import io.wkrzywiec.hexagonal.library.domain.user.core.UserFacade;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClass;
import static com.tngtech.archunit.library.Architectures.onionArchitecture;
-@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.user"},
+@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.domain.user"},
importOptions = { ImportOption.DoNotIncludeTests.class })
public class UserArchitectureTest {
@ArchTest
public static final ArchRule hexagonalArchInUserDomain = onionArchitecture()
- .domainModels("io.wkrzywiec.hexagonal.library.user.model..")
- .domainServices("io.wkrzywiec.hexagonal.library.user..")
- .applicationServices("io.wkrzywiec.hexagonal.library.user.application..")
- .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.user.infrastructure..");
+ .domainModels("io.wkrzywiec.hexagonal.library.domain.user.core.model..")
+ .domainServices("io.wkrzywiec.hexagonal.library.domain.user..")
+ .applicationServices("io.wkrzywiec.hexagonal.library.domain.user.application..")
+ .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.domain.user.infrastructure..");
@ArchTest
public static final ArchRule noSpringDependenciesInUserFacade =
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/BorrowingEventPublisherFake.java b/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/BorrowingEventPublisherFake.java
deleted file mode 100644
index 31c7bb0..0000000
--- a/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/BorrowingEventPublisherFake.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing;
-
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservedEvent;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing.BorrowingEventPublisher;
-
-public class BorrowingEventPublisherFake implements BorrowingEventPublisher {
-
- @Override
- public void publish(BookReservedEvent event) {
-
- }
-}
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/ReservationTestData.java b/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/ReservationTestData.java
deleted file mode 100644
index f614041..0000000
--- a/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/ReservationTestData.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package io.wkrzywiec.hexagonal.library.borrowing;
-
-import io.wkrzywiec.hexagonal.library.borrowing.model.ActiveUser;
-import io.wkrzywiec.hexagonal.library.borrowing.model.AvailableBook;
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservationCommand;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservedBook;
-
-import java.util.ArrayList;
-
-public class ReservationTestData {
-
- public static BookReservationCommand anyBookReservation(Long bookId, Long userId){
- return BookReservationCommand.builder()
- .bookId(bookId)
- .userId(userId)
- .build();
- }
-
- public static AvailableBook anyAvailableBook(Long bookId){
- return new AvailableBook(bookId);
- }
-
- public static ActiveUser anyActiveUser(Long userId){
- return new ActiveUser(userId, new ArrayList());
- }
-}
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/BorrowingEventPublisherFake.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/BorrowingEventPublisherFake.java
new file mode 100644
index 0000000..f853ca0
--- /dev/null
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/BorrowingEventPublisherFake.java
@@ -0,0 +1,12 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing;
+
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservedEvent;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing.BorrowingEventPublisher;
+
+public class BorrowingEventPublisherFake implements BorrowingEventPublisher {
+
+ @Override
+ public void publish(BookReservedEvent event) {
+
+ }
+}
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/BorrowingFacadeTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/BorrowingFacadeTest.java
similarity index 64%
rename from src/test/java/io/wkrzywiec/hexagonal/library/borrowing/BorrowingFacadeTest.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/BorrowingFacadeTest.java
index 5ced4ae..44783ee 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/BorrowingFacadeTest.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/BorrowingFacadeTest.java
@@ -1,17 +1,23 @@
-package io.wkrzywiec.hexagonal.library.borrowing;
+package io.wkrzywiec.hexagonal.library.domain.borrowing;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ActiveUser;
-import io.wkrzywiec.hexagonal.library.borrowing.model.AvailableBook;
-import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservationCommand;
-import io.wkrzywiec.hexagonal.library.borrowing.model.MakeBookAvailableCommand;
-import io.wkrzywiec.hexagonal.library.borrowing.model.exception.ActiveUserNotFoundException;
-import io.wkrzywiec.hexagonal.library.borrowing.model.exception.AvailableBookNotFoundExeption;
-import io.wkrzywiec.hexagonal.library.borrowing.model.exception.TooManyBooksAssignedToUserException;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing.BorrowingEventPublisher;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.BorrowingFacade;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ActiveUser;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.AvailableBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservationCommand;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.MakeBookAvailableCommand;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservedBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.exception.ActiveUserNotFoundException;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.exception.AvailableBookNotFoundExeption;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.exception.TooManyBooksAssignedToUserException;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing.BorrowingEventPublisher;
+import org.apache.commons.lang3.reflect.FieldUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -50,7 +56,7 @@ public class BorrowingFacadeTest {
@DisplayName("Make successful book reservation")
public void givenAvailableBooksAndActiveUser_whenMakingReservation_thenBookIsReserved(){
//given
- BookReservationCommand reservationCommand = ReservationTestData.anyBookReservation(100L, 100L);
+ BookReservationCommand reservationCommand = ReservationTestData.anyBookReservationCommand(100L, 100L);
AvailableBook availableBook = ReservationTestData.anyAvailableBook(reservationCommand.getBookId());
ActiveUser activeUser = ReservationTestData.anyActiveUser(reservationCommand.getUserId());
@@ -69,10 +75,10 @@ public class BorrowingFacadeTest {
@DisplayName("User can't have more than 3 reservations")
public void givenActiveUserAlreadyHas3Books_whenMakingReservation_thenBookIsNotReserved(){
//given
- BookReservationCommand firstReservationCommand = ReservationTestData.anyBookReservation(100L, 100L);
- BookReservationCommand secondReservationCommand = ReservationTestData.anyBookReservation(101L, 100L);
- BookReservationCommand thirdReservationCommand = ReservationTestData.anyBookReservation(102L, 100L);
- BookReservationCommand fourthReservationCommand = ReservationTestData.anyBookReservation(103L, 100L);
+ BookReservationCommand firstReservationCommand = ReservationTestData.anyBookReservationCommand(100L, 100L);
+ BookReservationCommand secondReservationCommand = ReservationTestData.anyBookReservationCommand(101L, 100L);
+ BookReservationCommand thirdReservationCommand = ReservationTestData.anyBookReservationCommand(102L, 100L);
+ BookReservationCommand fourthReservationCommand = ReservationTestData.anyBookReservationCommand(103L, 100L);
AvailableBook availableBookNo1 = ReservationTestData.anyAvailableBook(firstReservationCommand.getBookId());
AvailableBook availableBookNo2 = ReservationTestData.anyAvailableBook(secondReservationCommand.getBookId());
@@ -101,7 +107,7 @@ public class BorrowingFacadeTest {
@DisplayName("Try to reserve book,but it's not available")
public void givenNotAvailableBook_whenMakingReservation_thenThrowException(){
//given
- BookReservationCommand reservationCommand = ReservationTestData.anyBookReservation(100L, 100L);
+ BookReservationCommand reservationCommand = ReservationTestData.anyBookReservationCommand(100L, 100L);
ActiveUser activeUser = ReservationTestData.anyActiveUser(reservationCommand.getUserId());
database.activeUsers.put(activeUser.getIdAsLong(), activeUser);
@@ -115,7 +121,7 @@ public class BorrowingFacadeTest {
@DisplayName("Try to reserve book, but active user is not found")
public void givenNotActiveUser_whenMakingReservation_thenThrowException(){
//given
- BookReservationCommand reservationCommand = ReservationTestData.anyBookReservation(100L, 100L);
+ BookReservationCommand reservationCommand = ReservationTestData.anyBookReservationCommand(100L, 100L);
AvailableBook availableBook = ReservationTestData.anyAvailableBook(reservationCommand.getBookId());
database.availableBooks.put(availableBook.getIdAsLong(), availableBook);
@@ -125,4 +131,42 @@ public class BorrowingFacadeTest {
ActiveUserNotFoundException.class,
() -> facade.handle(reservationCommand));
}
+
+ @Test
+ @DisplayName("Cancel reservation after 3 days")
+ public void givenBookIsReserved_when3daysPass_thenBookIsAvailable(){
+ //given
+ ReservedBook reservedBook = ReservationTestData.anyReservedBook(100L, 100L);
+ changeReservationTimeFor(reservedBook, 4L);
+ database.reservedBooks.put(100L, reservedBook);
+
+ //when
+ facade.cancelOverdueReservations();
+
+ //then
+ assertEquals(0, database.reservedBooks.size());
+ }
+
+ @Test
+ @DisplayName("Do not cancel reservation after 2 days")
+ public void givenBookIsReserved_when2daysPass_thenBookIsStillReserved(){
+ //given
+ ReservedBook reservedBook = ReservationTestData.anyReservedBook(100L, 100L);
+ changeReservationTimeFor(reservedBook, 2L);
+ database.reservedBooks.put(100L, reservedBook);
+
+ //when
+ facade.cancelOverdueReservations();
+
+ //then
+ assertEquals(1, database.reservedBooks.size());
+ }
+
+ private void changeReservationTimeFor(ReservedBook reservedBook, Long daysFromNow) {
+ try {
+ FieldUtils.writeField(reservedBook, "reservedDate", Instant.now().plus(daysFromNow, ChronoUnit.DAYS), true);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
}
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/InMemoryBorrowingDatabase.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/InMemoryBorrowingDatabase.java
similarity index 51%
rename from src/test/java/io/wkrzywiec/hexagonal/library/borrowing/InMemoryBorrowingDatabase.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/InMemoryBorrowingDatabase.java
index 14588d0..48b3921 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/InMemoryBorrowingDatabase.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/InMemoryBorrowingDatabase.java
@@ -1,15 +1,19 @@
-package io.wkrzywiec.hexagonal.library.borrowing;
+package io.wkrzywiec.hexagonal.library.domain.borrowing;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ActiveUser;
-import io.wkrzywiec.hexagonal.library.borrowing.model.AvailableBook;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservationDetails;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservationId;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservedBook;
-import io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing.BorrowingDatabase;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ActiveUser;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.AvailableBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.DueDate;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.OverdueReservation;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservationDetails;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservationId;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservedBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.ports.outgoing.BorrowingDatabase;
+import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
public class InMemoryBorrowingDatabase implements BorrowingDatabase {
@@ -20,6 +24,7 @@ public class InMemoryBorrowingDatabase implements BorrowingDatabase {
@Override
public void setBookAvailable(Long bookId) {
availableBooks.put(bookId, new AvailableBook(bookId));
+ reservedBooks.remove(bookId);
}
@Override
@@ -47,4 +52,17 @@ public class InMemoryBorrowingDatabase implements BorrowingDatabase {
reservedBooks.put(reservationId, reservedBook);
return new ReservationDetails(new ReservationId(reservationId), reservedBook);
}
+
+ @Override
+ public List findReservationsAfter(DueDate dueDate) {
+ return reservedBooks.values().stream()
+ .filter(reservedBook ->
+ reservedBook.getReservedDateAsInstant()
+ .isAfter(dueDate.asInstant()))
+ .map(reservedBook ->
+ new OverdueReservation(
+ 1L,
+ reservedBook.getIdAsLong()))
+ .collect(Collectors.toList());
+ }
}
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/ReservationTestData.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/ReservationTestData.java
new file mode 100644
index 0000000..204e6f4
--- /dev/null
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/ReservationTestData.java
@@ -0,0 +1,30 @@
+package io.wkrzywiec.hexagonal.library.domain.borrowing;
+
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ActiveUser;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.AvailableBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.BookReservationCommand;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservedBook;
+
+import java.util.ArrayList;
+
+public class ReservationTestData {
+
+ public static BookReservationCommand anyBookReservationCommand(Long bookId, Long userId){
+ return BookReservationCommand.builder()
+ .bookId(bookId)
+ .userId(userId)
+ .build();
+ }
+
+ public static ReservedBook anyReservedBook(Long bookId, Long userId){
+ return new ReservedBook(bookId, userId);
+ }
+
+ public static AvailableBook anyAvailableBook(Long bookId){
+ return new AvailableBook(bookId);
+ }
+
+ public static ActiveUser anyActiveUser(Long userId){
+ return new ActiveUser(userId, new ArrayList());
+ }
+}
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/BorrowingDatabaseAdapterITCase.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/BorrowingDatabaseAdapterITCase.java
similarity index 63%
rename from src/test/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/BorrowingDatabaseAdapterITCase.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/BorrowingDatabaseAdapterITCase.java
index e36d1f0..cc979e8 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/BorrowingDatabaseAdapterITCase.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/borrowing/infrastructure/BorrowingDatabaseAdapterITCase.java
@@ -1,11 +1,13 @@
-package io.wkrzywiec.hexagonal.library.borrowing.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.borrowing.infrastructure;
import io.wkrzywiec.hexagonal.library.BookTestData;
import io.wkrzywiec.hexagonal.library.UserTestData;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ActiveUser;
-import io.wkrzywiec.hexagonal.library.borrowing.model.AvailableBook;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservationDetails;
-import io.wkrzywiec.hexagonal.library.borrowing.model.ReservedBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ActiveUser;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.AvailableBook;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.DueDate;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.OverdueReservation;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservationDetails;
+import io.wkrzywiec.hexagonal.library.domain.borrowing.core.model.ReservedBook;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -14,6 +16,8 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.jdbc.Sql;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -39,10 +43,7 @@ public class BorrowingDatabaseAdapterITCase {
@Sql(scripts = "/clean-database.sql", executionPhase = AFTER_TEST_METHOD)
public void shouldSaveAvailableBook(){
//given
- Long bookId = jdbcTemplate.queryForObject(
- "SELECT id FROM book WHERE title = ?",
- Long.class,
- BookTestData.homoDeusBookTitle());
+ Long bookId = getHomoDeusBookId();
//when
database.setBookAvailable(bookId);
@@ -61,10 +62,7 @@ public class BorrowingDatabaseAdapterITCase {
@Sql(scripts = "/clean-database.sql", executionPhase = AFTER_TEST_METHOD)
public void shouldGetAvailableBook(){
//given
- Long bookId = jdbcTemplate.queryForObject(
- "SELECT id FROM book WHERE title = ?",
- Long.class,
- BookTestData.homoDeusBookTitle());
+ Long bookId = getHomoDeusBookId();
//when
Optional availableBookOptional = database.getAvailableBook(bookId);
@@ -80,10 +78,7 @@ public class BorrowingDatabaseAdapterITCase {
@Sql(scripts = "/clean-database.sql", executionPhase = AFTER_TEST_METHOD)
public void shouldGetActiveUser() {
//given
- Long activeUserId = jdbcTemplate.queryForObject(
- "SELECT id FROM user WHERE email = ?",
- Long.class,
- UserTestData.johnDoeEmail());
+ Long activeUserId = getJohnDoeUserId();
//when
Optional activeUserOptional = database.getActiveUser(activeUserId);
@@ -99,15 +94,9 @@ public class BorrowingDatabaseAdapterITCase {
@Sql(scripts = "/clean-database.sql", executionPhase = AFTER_TEST_METHOD)
public void shouldSaveReservedBook(){
//given
- Long bookId = jdbcTemplate.queryForObject(
- "SELECT id FROM book WHERE title = ?",
- Long.class,
- BookTestData.homoDeusBookTitle());
+ Long bookId = getHomoDeusBookId();
- Long activeUserId = jdbcTemplate.queryForObject(
- "SELECT id FROM user WHERE email = ?",
- Long.class,
- UserTestData.johnDoeEmail());
+ Long activeUserId = getJohnDoeUserId();
ReservedBook reservedBook = new ReservedBook(bookId, activeUserId);
@@ -119,4 +108,40 @@ public class BorrowingDatabaseAdapterITCase {
assertEquals(activeUserId, reservationDetails.getReservedBook().getAssignedUserIdAsLong());
assertTrue(reservationDetails.getReservationId().getIdAsLong() > 0);
}
+
+ @Test
+ @DisplayName("Find book after 3 days of reservation")
+ @Sql({"/book-and-user.sql"})
+ @Sql(scripts = "/clean-database.sql", executionPhase = AFTER_TEST_METHOD)
+ public void shouldFindOverdueReservations(){
+ //given
+ DueDate thirdDayAfterReservation = new DueDate(Instant.now().plus(3, ChronoUnit.DAYS));
+ Long overdueBookId = getHomoDeusBookId();
+ Long johnDoeUserId = getJohnDoeUserId();
+ jdbcTemplate.update(
+ "INSERT INTO public.reserved (book_id, user_id, reserved_date) VALUES (?, ?, ?)",
+ overdueBookId,
+ johnDoeUserId,
+ Instant.now().plus(3, ChronoUnit.DAYS));
+
+ //when
+ OverdueReservation overdueReservation = database.findReservationsAfter(thirdDayAfterReservation).get(0);
+
+ //then
+ assertEquals(overdueBookId, overdueReservation.getBookIdentificationAsLong());
+ }
+
+ private Long getHomoDeusBookId(){
+ return jdbcTemplate.queryForObject(
+ "SELECT id FROM book WHERE title = ?",
+ Long.class,
+ BookTestData.homoDeusBookTitle());
+ }
+
+ private Long getJohnDoeUserId(){
+ return jdbcTemplate.queryForObject(
+ "SELECT id FROM user WHERE email = ?",
+ Long.class,
+ UserTestData.johnDoeEmail());
+ }
}
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/email/EmailFacadeTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/EmailFacadeTest.java
similarity index 79%
rename from src/test/java/io/wkrzywiec/hexagonal/library/email/EmailFacadeTest.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/email/EmailFacadeTest.java
index a959d5e..f5a503c 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/email/EmailFacadeTest.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/EmailFacadeTest.java
@@ -1,9 +1,10 @@
-package io.wkrzywiec.hexagonal.library.email;
+package io.wkrzywiec.hexagonal.library.domain.email;
import io.wkrzywiec.hexagonal.library.BookTestData;
import io.wkrzywiec.hexagonal.library.UserTestData;
-import io.wkrzywiec.hexagonal.library.email.model.SendReservationConfirmationCommand;
-import io.wkrzywiec.hexagonal.library.email.ports.outgoing.EmailSender;
+import io.wkrzywiec.hexagonal.library.domain.email.core.EmailFacade;
+import io.wkrzywiec.hexagonal.library.domain.email.core.model.SendReservationConfirmationCommand;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing.EmailSender;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/EmailSenderFake.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/EmailSenderFake.java
new file mode 100644
index 0000000..1855221
--- /dev/null
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/EmailSenderFake.java
@@ -0,0 +1,12 @@
+package io.wkrzywiec.hexagonal.library.domain.email;
+
+import io.wkrzywiec.hexagonal.library.domain.email.core.model.ReservationConfirmEmail;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing.EmailSender;
+
+public class EmailSenderFake implements EmailSender {
+
+ @Override
+ public void sendReservationConfirmationEmail(ReservationConfirmEmail reservationConfirmEmail) {
+
+ }
+}
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/email/InMemoryEmailDatabase.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/InMemoryEmailDatabase.java
similarity index 80%
rename from src/test/java/io/wkrzywiec/hexagonal/library/email/InMemoryEmailDatabase.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/email/InMemoryEmailDatabase.java
index 9c65b66..5d1f0c0 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/email/InMemoryEmailDatabase.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/InMemoryEmailDatabase.java
@@ -1,6 +1,6 @@
-package io.wkrzywiec.hexagonal.library.email;
+package io.wkrzywiec.hexagonal.library.domain.email;
-import io.wkrzywiec.hexagonal.library.email.ports.outgoing.EmailDatabase;
+import io.wkrzywiec.hexagonal.library.domain.email.core.ports.outgoing.EmailDatabase;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/email/model/EmailAddressTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/EmailAddressTest.java
similarity index 95%
rename from src/test/java/io/wkrzywiec/hexagonal/library/email/model/EmailAddressTest.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/EmailAddressTest.java
index d15a38a..df3fdff 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/email/model/EmailAddressTest.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/core/model/EmailAddressTest.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.email.model;
+package io.wkrzywiec.hexagonal.library.domain.email.core.model;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/email/infrastructure/EmailDatabaseAdapterITCase.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/infrastructure/EmailDatabaseAdapterITCase.java
similarity index 98%
rename from src/test/java/io/wkrzywiec/hexagonal/library/email/infrastructure/EmailDatabaseAdapterITCase.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/email/infrastructure/EmailDatabaseAdapterITCase.java
index 48978a4..a0adc7c 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/email/infrastructure/EmailDatabaseAdapterITCase.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/email/infrastructure/EmailDatabaseAdapterITCase.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.email.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.email.infrastructure;
import io.wkrzywiec.hexagonal.library.BookTestData;
import io.wkrzywiec.hexagonal.library.UserTestData;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/GetBookDetailsFake.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/GetBookDetailsFake.java
similarity index 69%
rename from src/test/java/io/wkrzywiec/hexagonal/library/inventory/GetBookDetailsFake.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/GetBookDetailsFake.java
index f0da61c..ddb5fd1 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/GetBookDetailsFake.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/GetBookDetailsFake.java
@@ -1,8 +1,8 @@
-package io.wkrzywiec.hexagonal.library.inventory;
+package io.wkrzywiec.hexagonal.library.domain.inventory;
import io.wkrzywiec.hexagonal.library.BookTestData;
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.GetBookDetails;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.GetBookDetails;
import java.util.HashMap;
import java.util.Map;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InMemoryInventoryDatabase.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/InMemoryInventoryDatabase.java
similarity index 71%
rename from src/test/java/io/wkrzywiec/hexagonal/library/inventory/InMemoryInventoryDatabase.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/InMemoryInventoryDatabase.java
index 3569a7f..694cdcc 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InMemoryInventoryDatabase.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/InMemoryInventoryDatabase.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.inventory;
+package io.wkrzywiec.hexagonal.library.domain.inventory;
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryDatabase;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.InventoryDatabase;
import org.apache.commons.lang3.reflect.FieldUtils;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/InvenotryEventPublisherFake.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/InvenotryEventPublisherFake.java
new file mode 100644
index 0000000..543b6c1
--- /dev/null
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/InvenotryEventPublisherFake.java
@@ -0,0 +1,10 @@
+package io.wkrzywiec.hexagonal.library.domain.inventory;
+
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.NewBookWasAddedEvent;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.InventoryEventPublisher;
+
+public class InvenotryEventPublisherFake implements InventoryEventPublisher {
+
+ @Override
+ public void publishNewBookWasAddedEvent(NewBookWasAddedEvent event) { }
+}
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/InventoryFacadeTest.java
similarity index 71%
rename from src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/InventoryFacadeTest.java
index d80090c..44e4ce4 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/InventoryFacadeTest.java
@@ -1,10 +1,11 @@
-package io.wkrzywiec.hexagonal.library.inventory;
+package io.wkrzywiec.hexagonal.library.domain.inventory;
import io.wkrzywiec.hexagonal.library.BookTestData;
-import io.wkrzywiec.hexagonal.library.inventory.model.AddNewBookCommand;
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.GetBookDetails;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryEventPublisher;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.InventoryFacade;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.AddNewBookCommand;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.GetBookDetails;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.ports.outgoing.InventoryEventPublisher;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/model/IsbnTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/IsbnTest.java
similarity index 94%
rename from src/test/java/io/wkrzywiec/hexagonal/library/inventory/model/IsbnTest.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/IsbnTest.java
index 3fcc09d..19e7138 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/model/IsbnTest.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/core/model/IsbnTest.java
@@ -1,4 +1,4 @@
-package io.wkrzywiec.hexagonal.library.inventory.model;
+package io.wkrzywiec.hexagonal.library.domain.inventory.core.model;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/GoogleBooksAdapterITCase.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/GoogleBooksAdapterITCase.java
similarity index 92%
rename from src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/GoogleBooksAdapterITCase.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/GoogleBooksAdapterITCase.java
index 9b021bc..ffd4553 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/GoogleBooksAdapterITCase.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/GoogleBooksAdapterITCase.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.inventory.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure;
import io.wkrzywiec.hexagonal.library.BookTestData;
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/InventoryDatabaseAdapterITCase.java
similarity index 91%
rename from src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/InventoryDatabaseAdapterITCase.java
index b6da3cf..e02ca22 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/inventory/infrastructure/InventoryDatabaseAdapterITCase.java
@@ -1,7 +1,7 @@
-package io.wkrzywiec.hexagonal.library.inventory.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.inventory.infrastructure;
import io.wkrzywiec.hexagonal.library.BookTestData;
-import io.wkrzywiec.hexagonal.library.inventory.model.Book;
+import io.wkrzywiec.hexagonal.library.domain.inventory.core.model.Book;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/user/InMemoryUserDatabase.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/user/InMemoryUserDatabase.java
similarity index 66%
rename from src/test/java/io/wkrzywiec/hexagonal/library/user/InMemoryUserDatabase.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/user/InMemoryUserDatabase.java
index 063de7a..666f703 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/user/InMemoryUserDatabase.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/user/InMemoryUserDatabase.java
@@ -1,8 +1,8 @@
-package io.wkrzywiec.hexagonal.library.user;
+package io.wkrzywiec.hexagonal.library.domain.user;
-import io.wkrzywiec.hexagonal.library.user.model.User;
-import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
-import io.wkrzywiec.hexagonal.library.user.ports.outgoing.UserDatabase;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.User;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.UserIdentifier;
+import io.wkrzywiec.hexagonal.library.domain.user.core.ports.outgoing.UserDatabase;
import org.apache.commons.lang3.reflect.FieldUtils;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/user/UserFacadeTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/user/UserFacadeTest.java
similarity index 75%
rename from src/test/java/io/wkrzywiec/hexagonal/library/user/UserFacadeTest.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/user/UserFacadeTest.java
index c8838fc..ea2e95e 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/user/UserFacadeTest.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/user/UserFacadeTest.java
@@ -1,10 +1,11 @@
-package io.wkrzywiec.hexagonal.library.user;
+package io.wkrzywiec.hexagonal.library.domain.user;
import io.wkrzywiec.hexagonal.library.UserTestData;
-import io.wkrzywiec.hexagonal.library.user.model.AddUserCommand;
-import io.wkrzywiec.hexagonal.library.user.model.EmailAddress;
-import io.wkrzywiec.hexagonal.library.user.model.User;
-import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
+import io.wkrzywiec.hexagonal.library.domain.user.core.UserFacade;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.AddUserCommand;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.EmailAddress;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.User;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.UserIdentifier;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/user/infrastructure/UserDatabaseAdapterITCase.java b/src/test/java/io/wkrzywiec/hexagonal/library/domain/user/infrastructure/UserDatabaseAdapterITCase.java
similarity index 83%
rename from src/test/java/io/wkrzywiec/hexagonal/library/user/infrastructure/UserDatabaseAdapterITCase.java
rename to src/test/java/io/wkrzywiec/hexagonal/library/domain/user/infrastructure/UserDatabaseAdapterITCase.java
index dcd7960..3be7c72 100644
--- a/src/test/java/io/wkrzywiec/hexagonal/library/user/infrastructure/UserDatabaseAdapterITCase.java
+++ b/src/test/java/io/wkrzywiec/hexagonal/library/domain/user/infrastructure/UserDatabaseAdapterITCase.java
@@ -1,9 +1,9 @@
-package io.wkrzywiec.hexagonal.library.user.infrastructure;
+package io.wkrzywiec.hexagonal.library.domain.user.infrastructure;
import io.wkrzywiec.hexagonal.library.UserTestData;
-import io.wkrzywiec.hexagonal.library.user.model.EmailAddress;
-import io.wkrzywiec.hexagonal.library.user.model.User;
-import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.EmailAddress;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.User;
+import io.wkrzywiec.hexagonal.library.domain.user.core.model.UserIdentifier;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -39,8 +39,7 @@ public class UserDatabaseAdapterITCase {
User user = new User(
new EmailAddress(UserTestData.johnDoeEmail()),
"John",
- "Doe"
- );
+ "Doe");
//when
UserIdentifier userIdentifier = userDatabase.save(user);
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/email/EmailSenderFake.java b/src/test/java/io/wkrzywiec/hexagonal/library/email/EmailSenderFake.java
deleted file mode 100644
index 3b7ab37..0000000
--- a/src/test/java/io/wkrzywiec/hexagonal/library/email/EmailSenderFake.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package io.wkrzywiec.hexagonal.library.email;
-
-import io.wkrzywiec.hexagonal.library.email.model.ReservationConfirmEmail;
-import io.wkrzywiec.hexagonal.library.email.ports.outgoing.EmailSender;
-
-public class EmailSenderFake implements EmailSender {
-
- @Override
- public void sendReservationConfirmationEmail(ReservationConfirmEmail reservationConfirmEmail) {
-
- }
-}
diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InvenotryEventPublisherFake.java b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InvenotryEventPublisherFake.java
deleted file mode 100644
index fc215b1..0000000
--- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InvenotryEventPublisherFake.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package io.wkrzywiec.hexagonal.library.inventory;
-
-import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent;
-import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryEventPublisher;
-
-public class InvenotryEventPublisherFake implements InventoryEventPublisher {
-
- @Override
- public void publishNewBookWasAddedEvent(NewBookWasAddedEvent event) { }
-}