diff --git a/adapter/addressvalidation/pom.xml b/adapter/addressvalidation/pom.xml
index 5ec778b..73685ba 100644
--- a/adapter/addressvalidation/pom.xml
+++ b/adapter/addressvalidation/pom.xml
@@ -15,7 +15,7 @@
Adapter to call validate addresses in external systems
14
- 1.3.1.Final
+ 1.4.1.Final
1.18.12
diff --git a/adapter/persistence/pom.xml b/adapter/persistence/pom.xml
index 6b94c33..5bed9a7 100644
--- a/adapter/persistence/pom.xml
+++ b/adapter/persistence/pom.xml
@@ -16,7 +16,7 @@
jar
14
- 1.3.1.Final
+ 1.4.1.Final
1.18.12
1.15.0
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 24132d0..fed47cd 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
@@ -43,7 +43,8 @@ public interface CustomerMapper {
getAddressAttribute(customer, Address.AddressType.BILLING, Address::getStreet),
getAddressAttribute(customer, Address.AddressType.BILLING, Address::getHouseNumber),
getAddressAttribute(customer, Address.AddressType.BILLING, Address::getZipCode),
- getAddressAttribute(customer, Address.AddressType.BILLING, Address::getCountry));
+ getAddressAttribute(customer, Address.AddressType.BILLING, Address::getCountry),
+ null);
}
private T getAddressAttribute(
diff --git a/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/model/CustomerEntity.java b/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/model/CustomerEntity.java
index 7e50301..46a3d3d 100644
--- a/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/model/CustomerEntity.java
+++ b/adapter/persistence/src/main/java/de/strasser/peter/hexagonal/persistence/model/CustomerEntity.java
@@ -3,37 +3,39 @@ package de.strasser.peter.hexagonal.persistence.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.math.BigInteger;
import java.time.LocalDate;
+import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document
public class CustomerEntity {
- @Id
- private BigInteger id;
- private String name;
- private String hashedPassword;
- private LocalDate birthday;
- private boolean active;
+ @Id private BigInteger id;
+ private String name;
+ private String hashedPassword;
+ private LocalDate birthday;
+ private boolean active;
- private String street;
- private Integer houseNumber;
- private Integer zipCode;
- private String country;
+ private String street;
+ private Integer houseNumber;
+ private Integer zipCode;
+ private String country;
- private String shippingStreet;
- private Integer shippingHouseNumber;
- private Integer shippingZipCode;
- private String shippingCountry;
+ private String shippingStreet;
+ private Integer shippingHouseNumber;
+ private Integer shippingZipCode;
+ private String shippingCountry;
- private String billingStreet;
- private Integer billingHouseNumber;
- private Integer billingZipCode;
- private String billingCountry;
+ private String billingStreet;
+ private Integer billingHouseNumber;
+ private Integer billingZipCode;
+ private String billingCountry;
+ @CreatedDate private LocalDateTime createdAt;
}
diff --git a/adapter/web/pom.xml b/adapter/web/pom.xml
index caf6476..8080880 100644
--- a/adapter/web/pom.xml
+++ b/adapter/web/pom.xml
@@ -16,7 +16,7 @@
Web adapter
14
- 1.3.1.Final
+ 1.4.1.Final
1.18.12
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 b9c79ed..a220061 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
@@ -2,7 +2,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.common.validators.TestUtils;
+import de.strasser.peter.hexagonal.common.validators.ReadStringResources;
import de.strasser.peter.hexagonal.web.mapper.AddAddressWebMapperImpl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
@@ -31,7 +31,7 @@ class AddAddressControllerTest {
@Test
public void should_AddAddress() throws Exception {
- final String body = TestUtils.readStringFromResource("valid_add_address.json");
+ final String body = ReadStringResources.readStringFromResource("valid_add_address.json");
final int customerId = 1231231;
mockMvc
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 eda1cc6..8dc4f93 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
@@ -2,7 +2,7 @@ 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.TestUtils;
+import de.strasser.peter.hexagonal.common.validators.ReadStringResources;
import de.strasser.peter.hexagonal.web.mapper.RegisterCustomerWebMapperImpl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
@@ -30,7 +30,7 @@ class RegisterCustomerControllerTest {
@Test
public void should_RegisterUser_When_SendingValidRequest() throws Exception {
- final String body = TestUtils.readStringFromResource("valid_register_customer.json");
+ final String body = ReadStringResources.readStringFromResource("valid_register_customer.json");
mockMvc
.perform(post("/v1/register").contentType(MediaType.APPLICATION_JSON).content(body))
.andExpect(status().isOk())
@@ -43,7 +43,7 @@ class RegisterCustomerControllerTest {
@Test
public void should_DenyRequest_When_SendingInvalidDateFormat() throws Exception {
- final String body = TestUtils.readStringFromResource("invalid_date_register_customer.json");
+ final String body = ReadStringResources.readStringFromResource("invalid_date_register_customer.json");
mockMvc
.perform(post("/v1/register").contentType(MediaType.APPLICATION_JSON).content(body))
diff --git a/application/pom.xml b/application/pom.xml
index 8b3ba02..a153945 100644
--- a/application/pom.xml
+++ b/application/pom.xml
@@ -16,8 +16,9 @@
Business logic for demo project
14
- 1.3.1.Final
- 1.18.12
+ 1.4.2.Final
+ 1.18.16
+ 0.2.0
@@ -49,7 +50,11 @@
mapstruct
${org.mapstruct.version}
-
+
+ org.projectlombok
+ lombok-mapstruct-binding
+ ${lombok-mapstruct-binding.version}
+
@@ -72,6 +77,11 @@
lombok
${org.lombok.version}
+
+ org.projectlombok
+ lombok-mapstruct-binding
+ ${lombok-mapstruct-binding.version}
+
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/customer/domain/Customer.java
index 07cb185..3158a29 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/customer/domain/Customer.java
@@ -18,10 +18,10 @@ import java.util.Map;
public class Customer {
private final BigInteger id;
private String name;
- private String hashedPassword;
- private LocalDate birthday;
- private int age;
- private Map addresses;
+ private final String hashedPassword;
+ private final LocalDate birthday;
+ private final int age;
+ private final Map addresses;
private boolean active;
private Customer(
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/customer/port/in/commands/RegisterCustomerCommand.java
index 3f2678b..3f0fbde 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/customer/port/in/commands/RegisterCustomerCommand.java
@@ -1,7 +1,7 @@
package de.strasser.peter.hexagonal.application.customer.port.in.commands;
-import de.strasser.peter.hexagonal.common.validators.SecurePassword;
+import de.strasser.peter.hexagonal.application.customer.validator.SecurePassword;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
diff --git a/common/src/main/java/de/strasser/peter/hexagonal/common/validators/SecurePassword.java b/application/src/main/java/de/strasser/peter/hexagonal/application/customer/validator/SecurePassword.java
similarity index 72%
rename from common/src/main/java/de/strasser/peter/hexagonal/common/validators/SecurePassword.java
rename to application/src/main/java/de/strasser/peter/hexagonal/application/customer/validator/SecurePassword.java
index a2be987..8155ba8 100644
--- a/common/src/main/java/de/strasser/peter/hexagonal/common/validators/SecurePassword.java
+++ b/application/src/main/java/de/strasser/peter/hexagonal/application/customer/validator/SecurePassword.java
@@ -1,4 +1,7 @@
-package de.strasser.peter.hexagonal.common.validators;
+package de.strasser.peter.hexagonal.application.customer.validator;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
@@ -29,13 +32,17 @@ public @interface SecurePassword {
Class extends Payload>[] payload() default {};
+ @Component
class PasswordValidator implements ConstraintValidator {
+ private static final String DEFAULT_PASSWORD_REQUIREMENTS =
+ "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*(),.?\":{}|<>])(?=\\S+$).{8,}$";
+
+ @Value("${password.format:" + DEFAULT_PASSWORD_REQUIREMENTS + "}")
+ private String pwFormat;
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
- return s != null
- && s.matches(
- "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*(),.?\":{}|<>])(?=\\S+$).{8,}$");
+ return s != null && s.matches(pwFormat);
}
}
}
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 3633615..153988a 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,12 +1,13 @@
package de.strasser.peter.hexagonal.application;
-
+import de.strasser.peter.hexagonal.application.customer.mapper.AddAddressMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.mock.mockito.SpyBean;
@Slf4j
@SpringBootApplication
public class TestConfiguration {
-
+ @SpyBean public AddAddressMapper addAddressMapperMock;
}
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/customer/domain/CustomerTest.java
index 7623dff..5895292 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/customer/domain/CustomerTest.java
@@ -2,7 +2,9 @@ package de.strasser.peter.hexagonal.application.customer.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.customer.mapper.AddAddressMapper;
import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.mock.mockito.MockBean;
import java.time.LocalDate;
import java.util.Collections;
@@ -11,6 +13,7 @@ import static org.junit.jupiter.api.Assertions.*;
class CustomerTest {
+
@Test
public void should_CreateNewCustomer() {
final var customer = Customer.newCustomer("name", "pw", LocalDate.of(1980, 1, 1));
@@ -58,4 +61,6 @@ class CustomerTest {
final Customer customer = Customer.newCustomer("name", "pw", LocalDate.of(1950, 1, 1));
assertThrows(TooOldToDeactivateExc.class, customer::deactivate);
}
+
+
}
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/customer/service/AddressServiceTest.java
index bc76a32..2f41fba 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/customer/service/AddressServiceTest.java
@@ -32,7 +32,6 @@ class AddressServiceTest {
@MockBean private SaveCustomerPort saveCustomerAdapterMock;
@MockBean private AddressValidatorPort addressValidatorAdapterMock;
@MockBean private LoadCustomerPort loadCustomerAdapterMock;
- @SpyBean private AddAddressMapper addAddressMapperMock;
@Test
public void should_AddAddress() {
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/customer/service/RegisterCustomerServiceTest.java
index 72817ed..4ee26a8 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/customer/service/RegisterCustomerServiceTest.java
@@ -30,8 +30,7 @@ class RegisterCustomerServiceTest {
private AddressValidatorPort addressValidatorAdapterMock;
@MockBean
private LoadCustomerPort loadCustomerAdapterMock;
- @MockBean
- private AddAddressMapper addAddressMapperMock;
+
@BeforeEach
public void setUp() {
diff --git a/application/src/test/resources/application.yml b/application/src/test/resources/application.yml
new file mode 100644
index 0000000..6f0dc38
--- /dev/null
+++ b/application/src/test/resources/application.yml
@@ -0,0 +1 @@
+# password.format: ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*(),.?":{}|<>])(?=\S+$).{8,}$
diff --git a/common/src/main/java/de/strasser/peter/hexagonal/common/validators/TestUtils.java b/common/src/main/java/de/strasser/peter/hexagonal/common/validators/ReadStringResources.java
similarity index 91%
rename from common/src/main/java/de/strasser/peter/hexagonal/common/validators/TestUtils.java
rename to common/src/main/java/de/strasser/peter/hexagonal/common/validators/ReadStringResources.java
index bc92d5e..cfff0c3 100644
--- a/common/src/main/java/de/strasser/peter/hexagonal/common/validators/TestUtils.java
+++ b/common/src/main/java/de/strasser/peter/hexagonal/common/validators/ReadStringResources.java
@@ -6,7 +6,7 @@ import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
-public class TestUtils {
+public class ReadStringResources {
public static String readStringFromResource(String filename) throws IOException {
final File file = ResourceUtils.getFile("classpath:" + filename);
diff --git a/config/src/main/resources/application.properties b/config/src/main/resources/application.properties
deleted file mode 100644
index eb06b92..0000000
--- a/config/src/main/resources/application.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
-logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
diff --git a/config/src/main/resources/application.yml b/config/src/main/resources/application.yml
new file mode 100644
index 0000000..8e0772f
--- /dev/null
+++ b/config/src/main/resources/application.yml
@@ -0,0 +1,3 @@
+spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS: false
+
+password.format: ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*(),.?":{}|<>])(?=\S+$).{8,}$