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) { } -}