diff --git a/adapter/addressvalidation/mvnw b/adapter/addressvalidation/mvnw
index 8ae6456..3c8a553 100644
--- a/adapter/addressvalidation/mvnw
+++ b/adapter/addressvalidation/mvnw
@@ -316,7 +316,7 @@ export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
-$MAVEN_OPTS \
--classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
-"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
-${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/adapter/addressvalidation/src/main/java/de/strasser/peter/hexagonal/addressvalidation/AddressValidator.java b/adapter/addressvalidation/src/main/java/de/strasser/peter/hexagonal/addressvalidation/AddressValidator.java
index f307887..4d0d408 100644
--- a/adapter/addressvalidation/src/main/java/de/strasser/peter/hexagonal/addressvalidation/AddressValidator.java
+++ b/adapter/addressvalidation/src/main/java/de/strasser/peter/hexagonal/addressvalidation/AddressValidator.java
@@ -1,8 +1,8 @@
package de.strasser.peter.hexagonal.addressvalidation;
-import de.strasser.peter.hexagonal.application.customer.domain.Address;
-import de.strasser.peter.hexagonal.application.customer.port.out.AddressValidatorPort;
-import de.strasser.peter.hexagonal.application.customer.port.out.commands.ValidateAddressCommand;
+import de.strasser.peter.hexagonal.application.domain.Address;
+import de.strasser.peter.hexagonal.application.port.out.AddressValidatorPort;
+import de.strasser.peter.hexagonal.application.port.out.commands.ValidateAddressCommand;
import de.strasser.peter.hexagonal.common.Adapter;
import lombok.extern.slf4j.Slf4j;
diff --git a/adapter/addressvalidation/src/main/java/de/strasser/peter/hexagonal/addressvalidation/InvalidAddressExc.java b/adapter/addressvalidation/src/main/java/de/strasser/peter/hexagonal/addressvalidation/InvalidAddressExc.java
index 02855f1..91b6bbc 100644
--- a/adapter/addressvalidation/src/main/java/de/strasser/peter/hexagonal/addressvalidation/InvalidAddressExc.java
+++ b/adapter/addressvalidation/src/main/java/de/strasser/peter/hexagonal/addressvalidation/InvalidAddressExc.java
@@ -1,7 +1,7 @@
package de.strasser.peter.hexagonal.addressvalidation;
-import de.strasser.peter.hexagonal.application.customer.exception.BusinessException;
-import de.strasser.peter.hexagonal.application.customer.port.out.commands.ValidateAddressCommand;
+import de.strasser.peter.hexagonal.application.exception.BusinessException;
+import de.strasser.peter.hexagonal.application.port.out.commands.ValidateAddressCommand;
public class InvalidAddressExc extends BusinessException {
public InvalidAddressExc(ValidateAddressCommand validateAddressCommand) {
diff --git a/adapter/persistence/mvnw b/adapter/persistence/mvnw
index 8ae6456..3c8a553 100644
--- a/adapter/persistence/mvnw
+++ b/adapter/persistence/mvnw
@@ -316,7 +316,7 @@ export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
-$MAVEN_OPTS \
--classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
-"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
-${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/CustomerDao.java b/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/CustomerDao.java
index f49bcb2..e3a7a8d 100644
--- a/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/CustomerDao.java
+++ b/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/CustomerDao.java
@@ -1,9 +1,9 @@
package de.strasser.peter.hexagonal.persistence;
-import de.strasser.peter.hexagonal.application.customer.domain.Customer;
-import de.strasser.peter.hexagonal.application.customer.port.in.QueryAllCustomersCRUD;
-import de.strasser.peter.hexagonal.application.customer.port.out.LoadCustomerPort;
-import de.strasser.peter.hexagonal.application.customer.port.out.SaveCustomerPort;
+import de.strasser.peter.hexagonal.application.domain.Customer;
+import de.strasser.peter.hexagonal.application.port.in.QueryAllCustomersCRUD;
+import de.strasser.peter.hexagonal.application.port.out.LoadCustomerPort;
+import de.strasser.peter.hexagonal.application.port.out.SaveCustomerPort;
import de.strasser.peter.hexagonal.persistence.errors.CustomerDoesNotExistExc;
import de.strasser.peter.hexagonal.persistence.mapper.CustomerMapper;
import de.strasser.peter.hexagonal.persistence.model.CustomerEntity;
diff --git a/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/errors/CustomerDoesNotExistExc.java b/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/errors/CustomerDoesNotExistExc.java
index 9884ef5..c6b1e19 100644
--- a/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/errors/CustomerDoesNotExistExc.java
+++ b/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/errors/CustomerDoesNotExistExc.java
@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.persistence.errors;
-import de.strasser.peter.hexagonal.application.customer.exception.BusinessException;
+import de.strasser.peter.hexagonal.application.exception.BusinessException;
import java.math.BigInteger;
diff --git a/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/mapper/CustomerMapper.java b/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/mapper/CustomerMapper.java
index fed47cd..29dcada 100644
--- a/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/mapper/CustomerMapper.java
+++ b/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/mapper/CustomerMapper.java
@@ -1,7 +1,7 @@
package de.strasser.peter.hexagonal.persistence.mapper;
-import de.strasser.peter.hexagonal.application.customer.domain.Address;
-import de.strasser.peter.hexagonal.application.customer.domain.Customer;
+import de.strasser.peter.hexagonal.application.domain.Address;
+import de.strasser.peter.hexagonal.application.domain.Customer;
import de.strasser.peter.hexagonal.persistence.model.CustomerEntity;
import org.mapstruct.Mapper;
import org.springframework.core.convert.converter.Converter;
diff --git a/adapter/persistence/src/test/java/de/strasser/peter/hexagonal/persistence/CustomerDaoTest.java b/adapter/persistence/src/test/java/de/strasser/peter/hexagonal/persistence/CustomerDaoTest.java
index 0408829..ec8705a 100644
--- a/adapter/persistence/src/test/java/de/strasser/peter/hexagonal/persistence/CustomerDaoTest.java
+++ b/adapter/persistence/src/test/java/de/strasser/peter/hexagonal/persistence/CustomerDaoTest.java
@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.persistence;
-import de.strasser.peter.hexagonal.application.customer.domain.Customer;
+import de.strasser.peter.hexagonal.application.domain.Customer;
import de.strasser.peter.hexagonal.persistence.mapper.CustomerMapperImpl;
import de.strasser.peter.hexagonal.persistence.repository.CustomerRepository;
import org.junit.jupiter.api.AfterEach;
diff --git a/adapter/web/mvnw b/adapter/web/mvnw
index 8ae6456..3c8a553 100644
--- a/adapter/web/mvnw
+++ b/adapter/web/mvnw
@@ -316,7 +316,7 @@ export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
-$MAVEN_OPTS \
--classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
-"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
-${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/AddAddressController.java b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/AddAddressController.java
index 49859cf..cae3582 100644
--- a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/AddAddressController.java
+++ b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/AddAddressController.java
@@ -1,7 +1,7 @@
package de.strasser.peter.hexagonal.web;
-import de.strasser.peter.hexagonal.application.customer.port.in.AddAddressUseCase;
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
+import de.strasser.peter.hexagonal.application.port.in.AddAddressUseCase;
+import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.common.Adapter;
import de.strasser.peter.hexagonal.web.dto.request.AddAddressRequest;
import de.strasser.peter.hexagonal.web.mapper.AddAddressWebMapper;
diff --git a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/CustomerCRUDController.java b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/CustomerCRUDController.java
index 584de73..791de79 100644
--- a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/CustomerCRUDController.java
+++ b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/CustomerCRUDController.java
@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web;
-import de.strasser.peter.hexagonal.application.customer.port.in.QueryAllCustomersCRUD;
+import de.strasser.peter.hexagonal.application.port.in.QueryAllCustomersCRUD;
import de.strasser.peter.hexagonal.common.Adapter;
import de.strasser.peter.hexagonal.web.dto.response.CustomerResponse;
import de.strasser.peter.hexagonal.web.mapper.CustomerWebMapper;
diff --git a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/RegisterCustomerController.java b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/RegisterCustomerController.java
index b522aad..c774b62 100644
--- a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/RegisterCustomerController.java
+++ b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/RegisterCustomerController.java
@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web;
-import de.strasser.peter.hexagonal.application.customer.port.in.RegisterCustomerUseCase;
+import de.strasser.peter.hexagonal.application.port.in.RegisterCustomerUseCase;
import de.strasser.peter.hexagonal.common.Adapter;
import de.strasser.peter.hexagonal.web.dto.request.RegisterCustomerRequest;
import de.strasser.peter.hexagonal.web.mapper.RegisterCustomerWebMapper;
diff --git a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/errors/ErrorHandling.java b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/errors/ErrorHandling.java
index c33a2f3..a9cbb46 100644
--- a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/errors/ErrorHandling.java
+++ b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/errors/ErrorHandling.java
@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web.errors;
-import de.strasser.peter.hexagonal.application.customer.exception.BusinessException;
+import de.strasser.peter.hexagonal.application.exception.BusinessException;
import lombok.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
diff --git a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/AddAddressWebMapper.java b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/AddAddressWebMapper.java
index 36b6788..b488459 100644
--- a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/AddAddressWebMapper.java
+++ b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/AddAddressWebMapper.java
@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web.mapper;
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
+import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.web.dto.request.AddAddressRequest;
import org.mapstruct.Mapper;
diff --git a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/CustomerWebMapper.java b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/CustomerWebMapper.java
index ff63998..cd47440 100644
--- a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/CustomerWebMapper.java
+++ b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/CustomerWebMapper.java
@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web.mapper;
-import de.strasser.peter.hexagonal.application.customer.domain.Customer;
+import de.strasser.peter.hexagonal.application.domain.Customer;
import de.strasser.peter.hexagonal.web.dto.response.CustomerResponse;
import org.mapstruct.Mapper;
diff --git a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/RegisterCustomerWebMapper.java b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/RegisterCustomerWebMapper.java
index 3b935ab..d1fce9b 100644
--- a/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/RegisterCustomerWebMapper.java
+++ b/adapter/web/src/main/java/de/strasser/peter/hexagonal/web/mapper/RegisterCustomerWebMapper.java
@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web.mapper;
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.RegisterCustomerCommand;
+import de.strasser.peter.hexagonal.application.port.in.commands.RegisterCustomerCommand;
import de.strasser.peter.hexagonal.web.dto.request.RegisterCustomerRequest;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
diff --git a/adapter/web/src/test/java/de/strasser/peter/hexagonal/web/AddAddressControllerTest.java b/adapter/web/src/test/java/de/strasser/peter/hexagonal/web/AddAddressControllerTest.java
index a220061..a1c4ae7 100644
--- a/adapter/web/src/test/java/de/strasser/peter/hexagonal/web/AddAddressControllerTest.java
+++ b/adapter/web/src/test/java/de/strasser/peter/hexagonal/web/AddAddressControllerTest.java
@@ -1,8 +1,8 @@
package de.strasser.peter.hexagonal.web;
-import de.strasser.peter.hexagonal.application.customer.port.in.AddAddressUseCase;
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
-import de.strasser.peter.hexagonal.common.validators.ReadStringResources;
+import de.strasser.peter.hexagonal.application.port.in.AddAddressUseCase;
+import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
+import de.strasser.peter.hexagonal.common.ReadStringResources;
import de.strasser.peter.hexagonal.web.mapper.AddAddressWebMapperImpl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
diff --git a/adapter/web/src/test/java/de/strasser/peter/hexagonal/web/RegisterCustomerControllerTest.java b/adapter/web/src/test/java/de/strasser/peter/hexagonal/web/RegisterCustomerControllerTest.java
index 94b3beb..8bc6d1f 100644
--- a/adapter/web/src/test/java/de/strasser/peter/hexagonal/web/RegisterCustomerControllerTest.java
+++ b/adapter/web/src/test/java/de/strasser/peter/hexagonal/web/RegisterCustomerControllerTest.java
@@ -1,8 +1,8 @@
package de.strasser.peter.hexagonal.web;
-import de.strasser.peter.hexagonal.application.customer.port.in.RegisterCustomerUseCase;
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.RegisterCustomerCommand;
-import de.strasser.peter.hexagonal.common.validators.ReadStringResources;
+import de.strasser.peter.hexagonal.application.port.in.RegisterCustomerUseCase;
+import de.strasser.peter.hexagonal.application.port.in.commands.RegisterCustomerCommand;
+import de.strasser.peter.hexagonal.common.ReadStringResources;
import de.strasser.peter.hexagonal.web.mapper.RegisterCustomerWebMapperImpl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
diff --git a/application/mvnw b/application/mvnw
index 8ae6456..3c8a553 100644
--- a/application/mvnw
+++ b/application/mvnw
@@ -316,7 +316,7 @@ export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
-$MAVEN_OPTS \
--classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
-"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
-${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/application/pom.xml b/application/pom.xml
index d7a6337..73791a8 100644
--- a/application/pom.xml
+++ b/application/pom.xml
@@ -51,6 +51,10 @@
org.projectlombok
lombok-mapstruct-binding
+
+ javax.transaction
+ javax.transaction-api
+
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/mapper/AddAddressMapper.java b/application/src/main/java/de/strasser/peter/hexagonal/application/customer/mapper/AddAddressMapper.java
deleted file mode 100644
index f45d7b3..0000000
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/mapper/AddAddressMapper.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package de.strasser.peter.hexagonal.application.customer.mapper;
-
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
-import de.strasser.peter.hexagonal.application.customer.port.out.commands.ValidateAddressCommand;
-import org.mapstruct.Mapper;
-
-@Mapper
-public interface AddAddressMapper {
- ValidateAddressCommand toOutCmd(AddAddressCommand addAddressCommand);
-}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/QueryAllCustomersCRUD.java b/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/QueryAllCustomersCRUD.java
deleted file mode 100644
index 3a9f2d7..0000000
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/QueryAllCustomersCRUD.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package de.strasser.peter.hexagonal.application.customer.port.in;
-
-import de.strasser.peter.hexagonal.application.customer.domain.Customer;
-
-import java.util.List;
-
-public interface QueryAllCustomersCRUD {
- List getAll();
-}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/RegisterCustomerUseCase.java b/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/RegisterCustomerUseCase.java
deleted file mode 100644
index ea7df94..0000000
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/RegisterCustomerUseCase.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package de.strasser.peter.hexagonal.application.customer.port.in;
-
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.RegisterCustomerCommand;
-
-import javax.validation.Valid;
-
-public interface RegisterCustomerUseCase {
- void register(@Valid RegisterCustomerCommand registerCustomerCommand);
-}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/AddressValidatorPort.java b/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/AddressValidatorPort.java
deleted file mode 100644
index 4b25f7f..0000000
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/AddressValidatorPort.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package de.strasser.peter.hexagonal.application.customer.port.out;
-
-import de.strasser.peter.hexagonal.application.customer.domain.Address;
-import de.strasser.peter.hexagonal.application.customer.port.out.commands.ValidateAddressCommand;
-
-public interface AddressValidatorPort {
- Address validate(ValidateAddressCommand validateAddressCommand);
-}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/LoadCustomerPort.java b/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/LoadCustomerPort.java
deleted file mode 100644
index ab24b30..0000000
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/LoadCustomerPort.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package de.strasser.peter.hexagonal.application.customer.port.out;
-
-import de.strasser.peter.hexagonal.application.customer.domain.Customer;
-
-import java.math.BigInteger;
-
-public interface LoadCustomerPort {
- Customer findById(BigInteger id);
-}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/SaveCustomerPort.java b/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/SaveCustomerPort.java
deleted file mode 100644
index 873e470..0000000
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/SaveCustomerPort.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package de.strasser.peter.hexagonal.application.customer.port.out;
-
-import de.strasser.peter.hexagonal.application.customer.domain.Customer;
-
-public interface SaveCustomerPort {
- void upsert(Customer customer);
-}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/domain/Address.java b/application/src/main/java/de/strasser/peter/hexagonal/application/domain/Address.java
similarity index 77%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/domain/Address.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/domain/Address.java
index 24edd08..bb6547b 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/domain/Address.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/domain/Address.java
@@ -1,6 +1,6 @@
-package de.strasser.peter.hexagonal.application.customer.domain;
+package de.strasser.peter.hexagonal.application.domain;
-import de.strasser.peter.hexagonal.application.customer.exception.AddressTypeDoesNotExistsExc;
+import de.strasser.peter.hexagonal.application.exception.AddressTypeDoesNotExistsExc;
import lombok.Value;
@Value
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/domain/Customer.java b/application/src/main/java/de/strasser/peter/hexagonal/application/domain/Customer.java
similarity index 89%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/domain/Customer.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/domain/Customer.java
index 65832d9..e119dde 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/domain/Customer.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/domain/Customer.java
@@ -1,7 +1,7 @@
-package de.strasser.peter.hexagonal.application.customer.domain;
+package de.strasser.peter.hexagonal.application.domain;
-import de.strasser.peter.hexagonal.application.customer.exception.TooOldToDeactivateExc;
-import de.strasser.peter.hexagonal.application.customer.exception.TooYoungExc;
+import de.strasser.peter.hexagonal.application.exception.TooOldToDeactivateExc;
+import de.strasser.peter.hexagonal.application.exception.TooYoungExc;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/AddressTypeDoesNotExistsExc.java b/application/src/main/java/de/strasser/peter/hexagonal/application/exception/AddressTypeDoesNotExistsExc.java
similarity index 74%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/AddressTypeDoesNotExistsExc.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/exception/AddressTypeDoesNotExistsExc.java
index 89edf99..417de91 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/AddressTypeDoesNotExistsExc.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/exception/AddressTypeDoesNotExistsExc.java
@@ -1,4 +1,4 @@
-package de.strasser.peter.hexagonal.application.customer.exception;
+package de.strasser.peter.hexagonal.application.exception;
public class AddressTypeDoesNotExistsExc extends BusinessException {
public AddressTypeDoesNotExistsExc(String type) {
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/BusinessException.java b/application/src/main/java/de/strasser/peter/hexagonal/application/exception/BusinessException.java
similarity index 67%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/BusinessException.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/exception/BusinessException.java
index ff68b7d..38aba59 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/BusinessException.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/exception/BusinessException.java
@@ -1,4 +1,4 @@
-package de.strasser.peter.hexagonal.application.customer.exception;
+package de.strasser.peter.hexagonal.application.exception;
public abstract class BusinessException extends IllegalStateException {
public BusinessException(String error) {
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/DefaultAdressRequiredToActivateExc.java b/application/src/main/java/de/strasser/peter/hexagonal/application/exception/DefaultAdressRequiredToActivateExc.java
similarity index 76%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/DefaultAdressRequiredToActivateExc.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/exception/DefaultAdressRequiredToActivateExc.java
index 61ce35c..cb0fd53 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/DefaultAdressRequiredToActivateExc.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/exception/DefaultAdressRequiredToActivateExc.java
@@ -1,4 +1,4 @@
-package de.strasser.peter.hexagonal.application.customer.exception;
+package de.strasser.peter.hexagonal.application.exception;
public class DefaultAdressRequiredToActivateExc extends BusinessException {
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/TooOldToDeactivateExc.java b/application/src/main/java/de/strasser/peter/hexagonal/application/exception/TooOldToDeactivateExc.java
similarity index 74%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/TooOldToDeactivateExc.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/exception/TooOldToDeactivateExc.java
index 1c52a45..d019aa6 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/TooOldToDeactivateExc.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/exception/TooOldToDeactivateExc.java
@@ -1,4 +1,4 @@
-package de.strasser.peter.hexagonal.application.customer.exception;
+package de.strasser.peter.hexagonal.application.exception;
public class TooOldToDeactivateExc extends BusinessException {
public TooOldToDeactivateExc(int age) {
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/TooYoungExc.java b/application/src/main/java/de/strasser/peter/hexagonal/application/exception/TooYoungExc.java
similarity index 76%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/TooYoungExc.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/exception/TooYoungExc.java
index 13fb051..188f2f7 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/exception/TooYoungExc.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/exception/TooYoungExc.java
@@ -1,4 +1,4 @@
-package de.strasser.peter.hexagonal.application.customer.exception;
+package de.strasser.peter.hexagonal.application.exception;
import java.text.MessageFormat;
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/mapper/AddAddressMapper.java b/application/src/main/java/de/strasser/peter/hexagonal/application/mapper/AddAddressMapper.java
new file mode 100644
index 0000000..ad32ee4
--- /dev/null
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/mapper/AddAddressMapper.java
@@ -0,0 +1,10 @@
+package de.strasser.peter.hexagonal.application.mapper;
+
+import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
+import de.strasser.peter.hexagonal.application.port.out.commands.ValidateAddressCommand;
+import org.mapstruct.Mapper;
+
+@Mapper
+public interface AddAddressMapper {
+ ValidateAddressCommand toOutCmd(AddAddressCommand addAddressCommand);
+}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/mapper/Test.java b/application/src/main/java/de/strasser/peter/hexagonal/application/mapper/Test.java
new file mode 100644
index 0000000..c4bfef5
--- /dev/null
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/mapper/Test.java
@@ -0,0 +1,8 @@
+package de.strasser.peter.hexagonal.application.mapper;
+
+import lombok.Value;
+
+@Value
+public class Test {
+ private String test;
+}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/AddAddressUseCase.java b/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/AddAddressUseCase.java
similarity index 67%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/AddAddressUseCase.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/port/in/AddAddressUseCase.java
index ae24f93..24f77f4 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/AddAddressUseCase.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/AddAddressUseCase.java
@@ -1,6 +1,6 @@
-package de.strasser.peter.hexagonal.application.customer.port.in;
+package de.strasser.peter.hexagonal.application.port.in;
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
+import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
import javax.validation.Valid;
import javax.validation.constraints.Min;
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/QueryAllCustomersCRUD.java b/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/QueryAllCustomersCRUD.java
new file mode 100644
index 0000000..9cc9256
--- /dev/null
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/QueryAllCustomersCRUD.java
@@ -0,0 +1,9 @@
+package de.strasser.peter.hexagonal.application.port.in;
+
+import de.strasser.peter.hexagonal.application.domain.Customer;
+
+import java.util.List;
+
+public interface QueryAllCustomersCRUD {
+ List getAll();
+}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/RegisterCustomerUseCase.java b/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/RegisterCustomerUseCase.java
new file mode 100644
index 0000000..f8b22af
--- /dev/null
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/RegisterCustomerUseCase.java
@@ -0,0 +1,9 @@
+package de.strasser.peter.hexagonal.application.port.in;
+
+import de.strasser.peter.hexagonal.application.port.in.commands.RegisterCustomerCommand;
+
+import javax.validation.Valid;
+
+public interface RegisterCustomerUseCase {
+ void register(@Valid RegisterCustomerCommand registerCustomerCommand);
+}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/commands/AddAddressCommand.java b/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/commands/AddAddressCommand.java
similarity index 84%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/commands/AddAddressCommand.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/port/in/commands/AddAddressCommand.java
index 38dffe4..dc58776 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/commands/AddAddressCommand.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/commands/AddAddressCommand.java
@@ -1,4 +1,4 @@
-package de.strasser.peter.hexagonal.application.customer.port.in.commands;
+package de.strasser.peter.hexagonal.application.port.in.commands;
import lombok.AllArgsConstructor;
import lombok.Data;
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/commands/RegisterCustomerCommand.java b/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/commands/RegisterCustomerCommand.java
similarity index 71%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/commands/RegisterCustomerCommand.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/port/in/commands/RegisterCustomerCommand.java
index 26e2254..589c95e 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/in/commands/RegisterCustomerCommand.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/port/in/commands/RegisterCustomerCommand.java
@@ -1,6 +1,6 @@
-package de.strasser.peter.hexagonal.application.customer.port.in.commands;
+package de.strasser.peter.hexagonal.application.port.in.commands;
-import de.strasser.peter.hexagonal.application.customer.validator.SecurePassword;
+import de.strasser.peter.hexagonal.application.validator.SecurePassword;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/AddressValidatorPort.java b/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/AddressValidatorPort.java
new file mode 100644
index 0000000..e55f62e
--- /dev/null
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/AddressValidatorPort.java
@@ -0,0 +1,8 @@
+package de.strasser.peter.hexagonal.application.port.out;
+
+import de.strasser.peter.hexagonal.application.domain.Address;
+import de.strasser.peter.hexagonal.application.port.out.commands.ValidateAddressCommand;
+
+public interface AddressValidatorPort {
+ Address validate(ValidateAddressCommand validateAddressCommand);
+}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/LoadCustomerPort.java b/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/LoadCustomerPort.java
new file mode 100644
index 0000000..489cd49
--- /dev/null
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/LoadCustomerPort.java
@@ -0,0 +1,9 @@
+package de.strasser.peter.hexagonal.application.port.out;
+
+import de.strasser.peter.hexagonal.application.domain.Customer;
+
+import java.math.BigInteger;
+
+public interface LoadCustomerPort {
+ Customer findById(BigInteger id);
+}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/SaveCustomerPort.java b/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/SaveCustomerPort.java
new file mode 100644
index 0000000..dbafb82
--- /dev/null
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/SaveCustomerPort.java
@@ -0,0 +1,7 @@
+package de.strasser.peter.hexagonal.application.port.out;
+
+import de.strasser.peter.hexagonal.application.domain.Customer;
+
+public interface SaveCustomerPort {
+ void upsert(Customer customer);
+}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/commands/ValidateAddressCommand.java b/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/commands/ValidateAddressCommand.java
similarity index 77%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/commands/ValidateAddressCommand.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/port/out/commands/ValidateAddressCommand.java
index 920ec5e..77206f0 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/commands/ValidateAddressCommand.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/port/out/commands/ValidateAddressCommand.java
@@ -1,4 +1,4 @@
-package de.strasser.peter.hexagonal.application.customer.port.out.commands;
+package de.strasser.peter.hexagonal.application.port.out.commands;
import lombok.AllArgsConstructor;
import lombok.Data;
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/service/AddressService.java b/application/src/main/java/de/strasser/peter/hexagonal/application/service/AddressService.java
similarity index 63%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/service/AddressService.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/service/AddressService.java
index c89c81f..3f158f3 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/service/AddressService.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/service/AddressService.java
@@ -1,16 +1,18 @@
-package de.strasser.peter.hexagonal.application.customer.service;
+package de.strasser.peter.hexagonal.application.service;
-import de.strasser.peter.hexagonal.application.customer.domain.Address;
-import de.strasser.peter.hexagonal.application.customer.domain.Customer;
-import de.strasser.peter.hexagonal.application.customer.mapper.AddAddressMapper;
-import de.strasser.peter.hexagonal.application.customer.port.in.AddAddressUseCase;
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
-import de.strasser.peter.hexagonal.application.customer.port.out.AddressValidatorPort;
-import de.strasser.peter.hexagonal.application.customer.port.out.LoadCustomerPort;
-import de.strasser.peter.hexagonal.application.customer.port.out.SaveCustomerPort;
+import de.strasser.peter.hexagonal.application.domain.Address;
+import de.strasser.peter.hexagonal.application.domain.Customer;
+import de.strasser.peter.hexagonal.application.mapper.AddAddressMapper;
+import de.strasser.peter.hexagonal.application.mapper.Test;
+import de.strasser.peter.hexagonal.application.port.in.AddAddressUseCase;
+import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
+import de.strasser.peter.hexagonal.application.port.out.AddressValidatorPort;
+import de.strasser.peter.hexagonal.application.port.out.LoadCustomerPort;
+import de.strasser.peter.hexagonal.application.port.out.SaveCustomerPort;
+import de.strasser.peter.hexagonal.common.UseCase;
import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
+import javax.transaction.Transactional;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
@@ -19,7 +21,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-@Service
+@UseCase
+@Transactional
@RequiredArgsConstructor
class AddressService implements AddAddressUseCase {
private final SaveCustomerPort saveCustomerAdapter;
@@ -36,7 +39,7 @@ class AddressService implements AddAddressUseCase {
addAddressCmds.forEach(addAddressCommand -> validateAndAddToMap(addresses, addAddressCommand));
customer.addAddresses(addresses);
-
+ new Test("he");
saveCustomerAdapter.upsert(customer);
}
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/service/RegisterCustomerService.java b/application/src/main/java/de/strasser/peter/hexagonal/application/service/RegisterCustomerService.java
similarity index 58%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/service/RegisterCustomerService.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/service/RegisterCustomerService.java
index 13ecc8c..e4d9d05 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/service/RegisterCustomerService.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/service/RegisterCustomerService.java
@@ -1,19 +1,19 @@
-package de.strasser.peter.hexagonal.application.customer.service;
+package de.strasser.peter.hexagonal.application.service;
-import de.strasser.peter.hexagonal.application.customer.domain.Customer;
-import de.strasser.peter.hexagonal.application.customer.port.in.RegisterCustomerUseCase;
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.RegisterCustomerCommand;
-import de.strasser.peter.hexagonal.application.customer.port.out.SaveCustomerPort;
+import de.strasser.peter.hexagonal.application.domain.Customer;
+import de.strasser.peter.hexagonal.application.port.in.RegisterCustomerUseCase;
+import de.strasser.peter.hexagonal.application.port.in.commands.RegisterCustomerCommand;
+import de.strasser.peter.hexagonal.application.port.out.SaveCustomerPort;
+import de.strasser.peter.hexagonal.common.UseCase;
import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
+import javax.transaction.Transactional;
import javax.validation.Valid;
-@Slf4j
-@Service
+@UseCase
@Validated
+@Transactional
@RequiredArgsConstructor
class RegisterCustomerService implements RegisterCustomerUseCase {
private final SaveCustomerPort saveUser;
diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/validator/SecurePassword.java b/application/src/main/java/de/strasser/peter/hexagonal/application/validator/SecurePassword.java
similarity index 96%
rename from application/src/main/java/de/strasser/peter/hexagonal/application/customer/validator/SecurePassword.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/validator/SecurePassword.java
index 3053d3e..618b0c8 100644
--- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/validator/SecurePassword.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/validator/SecurePassword.java
@@ -1,4 +1,4 @@
-package de.strasser.peter.hexagonal.application.customer.validator;
+package de.strasser.peter.hexagonal.application.validator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
diff --git a/application/src/test/java/de/strasser/peter/hexagonal/application/TestConfiguration.java b/application/src/test/java/de/strasser/peter/hexagonal/application/TestConfiguration.java
index 153988a..04da687 100644
--- a/application/src/test/java/de/strasser/peter/hexagonal/application/TestConfiguration.java
+++ b/application/src/test/java/de/strasser/peter/hexagonal/application/TestConfiguration.java
@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.application;
-import de.strasser.peter.hexagonal.application.customer.mapper.AddAddressMapper;
+import de.strasser.peter.hexagonal.application.mapper.AddAddressMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.mock.mockito.SpyBean;
diff --git a/application/src/test/java/de/strasser/peter/hexagonal/application/customer/domain/CustomerTest.java b/application/src/test/java/de/strasser/peter/hexagonal/application/domain/CustomerTest.java
similarity index 88%
rename from application/src/test/java/de/strasser/peter/hexagonal/application/customer/domain/CustomerTest.java
rename to application/src/test/java/de/strasser/peter/hexagonal/application/domain/CustomerTest.java
index c0ebd0d..470c423 100644
--- a/application/src/test/java/de/strasser/peter/hexagonal/application/customer/domain/CustomerTest.java
+++ b/application/src/test/java/de/strasser/peter/hexagonal/application/domain/CustomerTest.java
@@ -1,7 +1,7 @@
-package de.strasser.peter.hexagonal.application.customer.domain;
+package de.strasser.peter.hexagonal.application.domain;
-import de.strasser.peter.hexagonal.application.customer.exception.TooOldToDeactivateExc;
-import de.strasser.peter.hexagonal.application.customer.exception.TooYoungExc;
+import de.strasser.peter.hexagonal.application.exception.TooOldToDeactivateExc;
+import de.strasser.peter.hexagonal.application.exception.TooYoungExc;
import org.junit.jupiter.api.Test;
import java.time.LocalDate;
diff --git a/application/src/test/java/de/strasser/peter/hexagonal/application/customer/service/AddressServiceTest.java b/application/src/test/java/de/strasser/peter/hexagonal/application/service/AddressServiceTest.java
similarity index 87%
rename from application/src/test/java/de/strasser/peter/hexagonal/application/customer/service/AddressServiceTest.java
rename to application/src/test/java/de/strasser/peter/hexagonal/application/service/AddressServiceTest.java
index 7054059..56a3eb8 100644
--- a/application/src/test/java/de/strasser/peter/hexagonal/application/customer/service/AddressServiceTest.java
+++ b/application/src/test/java/de/strasser/peter/hexagonal/application/service/AddressServiceTest.java
@@ -1,12 +1,12 @@
-package de.strasser.peter.hexagonal.application.customer.service;
+package de.strasser.peter.hexagonal.application.service;
-import de.strasser.peter.hexagonal.application.customer.domain.Address;
-import de.strasser.peter.hexagonal.application.customer.domain.Customer;
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
-import de.strasser.peter.hexagonal.application.customer.port.out.AddressValidatorPort;
-import de.strasser.peter.hexagonal.application.customer.port.out.LoadCustomerPort;
-import de.strasser.peter.hexagonal.application.customer.port.out.SaveCustomerPort;
-import de.strasser.peter.hexagonal.application.customer.port.out.commands.ValidateAddressCommand;
+import de.strasser.peter.hexagonal.application.domain.Address;
+import de.strasser.peter.hexagonal.application.domain.Customer;
+import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
+import de.strasser.peter.hexagonal.application.port.out.AddressValidatorPort;
+import de.strasser.peter.hexagonal.application.port.out.LoadCustomerPort;
+import de.strasser.peter.hexagonal.application.port.out.SaveCustomerPort;
+import de.strasser.peter.hexagonal.application.port.out.commands.ValidateAddressCommand;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/application/src/test/java/de/strasser/peter/hexagonal/application/customer/service/RegisterCustomerServiceTest.java b/application/src/test/java/de/strasser/peter/hexagonal/application/service/RegisterCustomerServiceTest.java
similarity index 82%
rename from application/src/test/java/de/strasser/peter/hexagonal/application/customer/service/RegisterCustomerServiceTest.java
rename to application/src/test/java/de/strasser/peter/hexagonal/application/service/RegisterCustomerServiceTest.java
index 073ef02..8f82b6c 100644
--- a/application/src/test/java/de/strasser/peter/hexagonal/application/customer/service/RegisterCustomerServiceTest.java
+++ b/application/src/test/java/de/strasser/peter/hexagonal/application/service/RegisterCustomerServiceTest.java
@@ -1,9 +1,9 @@
-package de.strasser.peter.hexagonal.application.customer.service;
+package de.strasser.peter.hexagonal.application.service;
-import de.strasser.peter.hexagonal.application.customer.port.in.commands.RegisterCustomerCommand;
-import de.strasser.peter.hexagonal.application.customer.port.out.AddressValidatorPort;
-import de.strasser.peter.hexagonal.application.customer.port.out.LoadCustomerPort;
-import de.strasser.peter.hexagonal.application.customer.port.out.SaveCustomerPort;
+import de.strasser.peter.hexagonal.application.port.in.commands.RegisterCustomerCommand;
+import de.strasser.peter.hexagonal.application.port.out.AddressValidatorPort;
+import de.strasser.peter.hexagonal.application.port.out.LoadCustomerPort;
+import de.strasser.peter.hexagonal.application.port.out.SaveCustomerPort;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/config/mvnw b/config/mvnw
index 8ae6456..3c8a553 100644
--- a/config/mvnw
+++ b/config/mvnw
@@ -316,7 +316,7 @@ export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
-$MAVEN_OPTS \
--classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
-"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
-${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/config/pom.xml b/config/pom.xml
index 5f69187..faa0be7 100644
--- a/config/pom.xml
+++ b/config/pom.xml
@@ -48,7 +48,11 @@
de.strasser.peter.hexagonal
persistence
-
+
+ com.tngtech.archunit
+ archunit-junit5
+ test
+
diff --git a/config/src/test/java/de/strasser/peter/hexagonal/DomainArchitectureTest.java b/config/src/test/java/de/strasser/peter/hexagonal/DomainArchitectureTest.java
new file mode 100644
index 0000000..49f4eb9
--- /dev/null
+++ b/config/src/test/java/de/strasser/peter/hexagonal/DomainArchitectureTest.java
@@ -0,0 +1,20 @@
+package de.strasser.peter.hexagonal;
+
+import com.tngtech.archunit.junit.AnalyzeClasses;
+import com.tngtech.archunit.junit.ArchTest;
+import com.tngtech.archunit.lang.ArchRule;
+
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
+
+@AnalyzeClasses(packages = "de.strasser.peter.hexagonal")
+public class DomainArchitectureTest {
+
+ @ArchTest
+ static final ArchRule should_OnlyDependOnLombokAndExceptions =
+ classes()
+ .that()
+ .resideInAPackage("..domain..")
+ .should()
+ .onlyDependOnClassesThat()
+ .resideInAnyPackage("..lombok..", "..domain..", "java..", "..exception..");
+}
diff --git a/config/src/test/java/de/strasser/peter/hexagonal/config/HexagonalApplicationTests.java b/config/src/test/java/de/strasser/peter/hexagonal/HexagonalApplicationTests.java
similarity index 80%
rename from config/src/test/java/de/strasser/peter/hexagonal/config/HexagonalApplicationTests.java
rename to config/src/test/java/de/strasser/peter/hexagonal/HexagonalApplicationTests.java
index fcdf943..83e1aca 100644
--- a/config/src/test/java/de/strasser/peter/hexagonal/config/HexagonalApplicationTests.java
+++ b/config/src/test/java/de/strasser/peter/hexagonal/HexagonalApplicationTests.java
@@ -1,4 +1,4 @@
-package de.strasser.peter.hexagonal.config;
+package de.strasser.peter.hexagonal;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/config/src/test/java/de/strasser/peter/hexagonal/HexagonalArchitectureTest.java b/config/src/test/java/de/strasser/peter/hexagonal/HexagonalArchitectureTest.java
new file mode 100644
index 0000000..8fc8a72
--- /dev/null
+++ b/config/src/test/java/de/strasser/peter/hexagonal/HexagonalArchitectureTest.java
@@ -0,0 +1,25 @@
+package de.strasser.peter.hexagonal;
+
+import com.tngtech.archunit.junit.AnalyzeClasses;
+import com.tngtech.archunit.junit.ArchTest;
+import com.tngtech.archunit.lang.ArchRule;
+
+import static com.tngtech.archunit.library.Architectures.onionArchitecture;
+
+@AnalyzeClasses(packages = "de.strasser.peter.hexagonal")
+public class HexagonalArchitectureTest {
+
+ /**
+ * See diagram at https://www.archunit.org/userguide/html/000_Index.html#Onion%20Architecture for
+ * what rules this enforces.
+ */
+ @ArchTest
+ static final ArchRule should_FollowHexagonalRules =
+ onionArchitecture()
+ .domainModels("de.strasser.peter.hexagonal.application.domain..")
+ .domainServices("de.strasser.peter.hexagonal.application.service..")
+ .applicationServices("de.strasser.peter.hexagonal..")
+ .adapter("web", "de.strasser.peter.hexagonal.web..")
+ .adapter("persistence", "de.strasser.peter.hexagonal.persistence..")
+ .adapter("addressvalidation", "de.strasser.peter.hexagonal.addressvalidation..");
+}
diff --git a/config/src/test/java/de/strasser/peter/hexagonal/PortsArchitectureTest.java b/config/src/test/java/de/strasser/peter/hexagonal/PortsArchitectureTest.java
new file mode 100644
index 0000000..1d5880d
--- /dev/null
+++ b/config/src/test/java/de/strasser/peter/hexagonal/PortsArchitectureTest.java
@@ -0,0 +1,29 @@
+package de.strasser.peter.hexagonal;
+
+import com.tngtech.archunit.junit.AnalyzeClasses;
+import com.tngtech.archunit.junit.ArchTest;
+import com.tngtech.archunit.lang.ArchRule;
+
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
+
+@AnalyzeClasses(packages = "de.strasser.peter.hexagonal.application.port")
+public class PortsArchitectureTest {
+
+ @ArchTest
+ static final ArchRule should_EndWithUseCaseOrCRUD_When_IsInPort =
+ classes()
+ .that()
+ .resideInAPackage("..in")
+ .should()
+ .haveSimpleNameEndingWith("UseCase")
+ .orShould()
+ .haveSimpleNameEndingWith("CRUD");
+
+ @ArchTest
+ static final ArchRule should_EndWithPort_When_IsOutPort =
+ classes().that().resideInAPackage("..out").should().haveSimpleNameEndingWith("Port");
+
+ @ArchTest
+ static final ArchRule should_EndWithCommand_When_IsCommandModel =
+ classes().that().resideInAPackage("..commands").should().haveSimpleNameEndingWith("Command");
+}
diff --git a/config/src/test/java/de/strasser/peter/hexagonal/UseCaseArchitectureTest.java b/config/src/test/java/de/strasser/peter/hexagonal/UseCaseArchitectureTest.java
new file mode 100644
index 0000000..bd228bf
--- /dev/null
+++ b/config/src/test/java/de/strasser/peter/hexagonal/UseCaseArchitectureTest.java
@@ -0,0 +1,42 @@
+package de.strasser.peter.hexagonal;
+
+import com.tngtech.archunit.base.DescribedPredicate;
+import com.tngtech.archunit.core.domain.JavaClass;
+import com.tngtech.archunit.junit.AnalyzeClasses;
+import com.tngtech.archunit.junit.ArchTest;
+import com.tngtech.archunit.lang.ArchRule;
+import de.strasser.peter.hexagonal.common.UseCase;
+
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
+
+@AnalyzeClasses(packages = "de.strasser.peter.hexagonal")
+public class UseCaseArchitectureTest {
+
+ static final DescribedPredicate portInterface =
+ JavaClass.Predicates.simpleNameEndingWith("UseCase");
+
+ @ArchTest
+ static final ArchRule should_BePackageVisibility_When_IsUsecase =
+ classes().that().areAnnotatedWith(UseCase.class).should().bePackagePrivate();
+
+ @ArchTest
+ static final ArchRule should_BeInPackageService_When_IsUsecase =
+ classes().that().areAnnotatedWith(UseCase.class).should().resideInAPackage("..service..");
+
+ @ArchTest
+ static final ArchRule should_ImplementOnlyPorts_When_IsUsecase =
+ classes().that().areAnnotatedWith(UseCase.class).should().implement(portInterface);
+
+ @ArchTest
+ static final ArchRule should_NotDependOnAdapters_When_IsUsecase =
+ noClasses()
+ .that()
+ .areAnnotatedWith(UseCase.class)
+ .should()
+ .dependOnClassesThat()
+ .resideInAPackage("..persistence..")
+ .orShould()
+ .dependOnClassesThat()
+ .resideInAPackage("..web..");
+}
diff --git a/config/src/test/java/de/strasser/peter/hexagonal/config/ArchitectureTest.java b/config/src/test/java/de/strasser/peter/hexagonal/config/ArchitectureTest.java
deleted file mode 100644
index 755b4ec..0000000
--- a/config/src/test/java/de/strasser/peter/hexagonal/config/ArchitectureTest.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package de.strasser.peter.hexagonal.config;
-
-public class ArchitectureTest {}
diff --git a/pom.xml b/pom.xml
index daef6ea..7512b98 100644
--- a/pom.xml
+++ b/pom.xml
@@ -81,7 +81,7 @@
com.tngtech.archunit
- archunit
+ archunit-junit5
${archunit.version}
test