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[] 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,}$