From 9ddbc5dd0ccc88406d53b45b15e14912302988b4 Mon Sep 17 00:00:00 2001 From: deepcloudlabs Date: Tue, 23 Jun 2020 20:30:17 +0300 Subject: [PATCH] add modelmapper and configure it to convert EmployeeRequest to Employee --- hr-microservice-hexagonal/pom.xml | 5 +++ .../HrMicroserviceHexagonalApplication.java | 5 +++ .../hr/adapter/EmployeeRepositoryAdapter.java | 5 +++ .../hr/adapter/EventPuslisherAdapter.java | 5 +++ .../java/com/example/hr/config/AppConfig.java | 5 +++ .../example/hr/config/ModelMapperConfig.java | 39 +++++++++++++++++++ .../com/example/hr/config/SwaggerConfig.java | 5 +++ .../hr/controller/EmployeeController.java | 38 +++++++++++------- .../com/example/hr/dto/EmployeeRequest.java | 15 +++---- .../com/example/hr/dto/EmployeeResponse.java | 5 +++ .../com/example/hr/dto/RestErrorMessage.java | 5 +++ .../example/hr/handler/RestErrorHandler.java | 30 +++++++------- .../com/example/hr/orm/EmployeeEntity.java | 7 +++- .../hr/repository/EmployeeJpaRepository.java | 5 +++ .../java/com/example/validation/Email.java | 5 +++ .../java/com/example/validation/Iban.java | 5 +++ .../com/example/validation/IbanValidator.java | 5 +++ .../example/validation/StrongPassword.java | 5 +++ .../com/example/validation/TcKimlikNo.java | 5 +++ .../validation/TcKimlikNoValidator.java | 5 +++ .../src/main/resources/application.properties | 1 + 21 files changed, 164 insertions(+), 41 deletions(-) create mode 100644 hr-microservice-hexagonal/src/main/java/com/example/hr/config/ModelMapperConfig.java diff --git a/hr-microservice-hexagonal/pom.xml b/hr-microservice-hexagonal/pom.xml index 395f84c..26f172c 100644 --- a/hr-microservice-hexagonal/pom.xml +++ b/hr-microservice-hexagonal/pom.xml @@ -25,6 +25,11 @@ hr-domain 0.0.1-SNAPSHOT + + org.modelmapper + modelmapper + 2.3.0 + org.springframework.boot spring-boot-starter-data-jpa diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/HrMicroserviceHexagonalApplication.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/HrMicroserviceHexagonalApplication.java index a2f14c3..b997a82 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/HrMicroserviceHexagonalApplication.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/HrMicroserviceHexagonalApplication.java @@ -3,6 +3,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +/** + * + * @author Binnur Kurt + * + */ @SpringBootApplication public class HrMicroserviceHexagonalApplication { diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EmployeeRepositoryAdapter.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EmployeeRepositoryAdapter.java index 637015b..dd7b123 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EmployeeRepositoryAdapter.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EmployeeRepositoryAdapter.java @@ -12,6 +12,11 @@ import com.example.hr.repository.EmployeeJpaRepository; import com.example.hr.repository.EmployeeRepository; +/** + * + * @author Binnur Kurt + * + */ @Repository public class EmployeeRepositoryAdapter implements EmployeeRepository { @Autowired diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EventPuslisherAdapter.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EventPuslisherAdapter.java index c0091b3..f88a7da 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EventPuslisherAdapter.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EventPuslisherAdapter.java @@ -5,6 +5,11 @@ import com.example.hr.events.BusinessEvent; import com.example.hr.infrastructure.EventPushlisher; +/** + * + * @author Binnur Kurt + * + */ @Service public class EventPuslisherAdapter implements EventPushlisher { diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/config/AppConfig.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/config/AppConfig.java index e777551..66f13b6 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/config/AppConfig.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/config/AppConfig.java @@ -8,6 +8,11 @@ import com.example.hr.infrastructure.EventPushlisher; import com.example.hr.repository.EmployeeRepository; +/** + * + * @author Binnur Kurt + * + */ @Configuration public class AppConfig { diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/config/ModelMapperConfig.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/config/ModelMapperConfig.java new file mode 100644 index 0000000..1cf1ec8 --- /dev/null +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/config/ModelMapperConfig.java @@ -0,0 +1,39 @@ +package com.example.hr.config; + +import org.modelmapper.Converter; +import org.modelmapper.ModelMapper; +import org.modelmapper.TypeMap; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.example.hr.domain.Employee; +import com.example.hr.domain.MoneyCurrency; +import com.example.hr.dto.EmployeeRequest; + +/** + * + * @author Binnur Kurt + * + */ +@Configuration +public class ModelMapperConfig { + + @Bean + public ModelMapper modelMapper() { + ModelMapper mapper = new ModelMapper(); + TypeMap employeeRequestToEmployeeTypeMap = mapper.getTypeMap(EmployeeRequest.class, + Employee.class); + if (employeeRequestToEmployeeTypeMap == null) { + employeeRequestToEmployeeTypeMap = mapper.createTypeMap(EmployeeRequest.class, Employee.class); + } + employeeRequestToEmployeeTypeMap.setProvider(provisionRequest -> { + var employeeRequest = EmployeeRequest.class.cast(provisionRequest.getSource()); + String[] tokens = employeeRequest.getFullname().split("\\w+"); + return new Employee.Builder(employeeRequest.getIdentity()).fullname(tokens[0], tokens[1]) + .iban(employeeRequest.getIban()).salary(employeeRequest.getSalary(), MoneyCurrency.TL) + .birthYear(employeeRequest.getBirthYear()).fulltime(employeeRequest.isFulltime()) + .department(employeeRequest.getDepartment()).photo(employeeRequest.getPhoto()).build(); + }); + return mapper; + } +} diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/config/SwaggerConfig.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/config/SwaggerConfig.java index 5ab102e..487fd8a 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/config/SwaggerConfig.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/config/SwaggerConfig.java @@ -19,6 +19,11 @@ import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; +/** + * + * @author Binnur Kurt + * + */ @Configuration @EnableSwagger2 public class SwaggerConfig implements WebMvcConfigurer { diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/controller/EmployeeController.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/controller/EmployeeController.java index 5c1d3f2..cf237f3 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/controller/EmployeeController.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/controller/EmployeeController.java @@ -2,8 +2,8 @@ import java.util.Map; +import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.DeleteMapping; @@ -17,11 +17,17 @@ import org.springframework.web.context.annotation.RequestScope; import com.example.hr.application.EmployeeApplication; +import com.example.hr.domain.Employee; import com.example.hr.dto.EmployeeRequest; import com.example.hr.dto.EmployeeResponse; import com.example.hr.orm.EmployeeEntity; import com.example.validation.TcKimlikNo; +/** + * + * @author Binnur Kurt + * + */ @RestController @RequestScope @RequestMapping("/employees") @@ -30,32 +36,34 @@ public class EmployeeController { @Autowired private EmployeeApplication employeeApplication; + @Autowired + private ModelMapper mapper; @PostMapping public EmployeeResponse hireEmployee(@RequestBody @Validated EmployeeRequest request) { - employeeApplication.hireEmployee(request.toEmployee()); + employeeApplication.hireEmployee(mapper.map(request, Employee.class)); return new EmployeeResponse("success"); } - + @PutMapping("{identity}") - public void updateEmployee(@PathVariable @TcKimlikNo String identity, - @Validated @RequestBody EmployeeEntity e) { - + public void updateEmployee(@PathVariable @TcKimlikNo String identity, @Validated @RequestBody EmployeeEntity e) { + } + @PatchMapping("{identity}") - public void patchEmployee(@PathVariable @TcKimlikNo String identity, - Map employee) { - EmployeeEntity employeeEntity= null; + public void patchEmployee(@PathVariable @TcKimlikNo String identity, Map employee) { + EmployeeEntity employeeEntity = null; var clazz = EmployeeEntity.class; - employee.forEach((field,value)->{ - try { + employee.forEach((field, value) -> { + try { clazz.getDeclaredField(field).set(employeeEntity, value); - } catch (Exception e) {} + } catch (Exception e) { + } }); } - - //@GetMapping - + + // @GetMapping + @DeleteMapping("{identity}") public EmployeeResponse fireEmployee(@PathVariable @TcKimlikNo String identity) { employeeApplication.fireEmployee(null); diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/EmployeeRequest.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/EmployeeRequest.java index 4e912bf..eb14c79 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/EmployeeRequest.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/EmployeeRequest.java @@ -6,15 +6,18 @@ import javax.validation.constraints.Size; import com.example.hr.domain.Department; -import com.example.hr.domain.Employee; -import com.example.hr.domain.MoneyCurrency; import com.example.validation.Iban; import com.example.validation.TcKimlikNo; +/** + * + * @author Binnur Kurt + * + */ public class EmployeeRequest { @TcKimlikNo private String identity; - @Size(min=6) + @Size(min = 6) private String fullname; @Min(3_000) private double salary; @@ -101,10 +104,4 @@ public String toString() { + iban + ", fulltime=" + fulltime + ", birthYear=" + birthYear + ", department=" + department + "]"; } - public Employee toEmployee() { - String[] tokens = fullname.split("\\w+"); - return new Employee.Builder(identity).fullname(tokens[0], tokens[1]).iban(iban).salary(salary, MoneyCurrency.TL) - .birthYear(birthYear).fulltime(fulltime).department(department).photo(photo).build(); - } - } diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/EmployeeResponse.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/EmployeeResponse.java index 1fb01f9..1bd7060 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/EmployeeResponse.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/EmployeeResponse.java @@ -1,5 +1,10 @@ package com.example.hr.dto; +/** + * + * @author Binnur Kurt + * + */ public class EmployeeResponse { private String status; diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/RestErrorMessage.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/RestErrorMessage.java index ff82df6..bb232f9 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/RestErrorMessage.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/dto/RestErrorMessage.java @@ -1,5 +1,10 @@ package com.example.hr.dto; +/** + * + * @author Binnur Kurt + * + */ public class RestErrorMessage { private int errorId; private String message; diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/handler/RestErrorHandler.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/handler/RestErrorHandler.java index 1a7a81e..5ad9c43 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/handler/RestErrorHandler.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/handler/RestErrorHandler.java @@ -14,36 +14,34 @@ import com.example.hr.dto.RestErrorMessage; +/** + * + * @author Binnur Kurt + * + */ @RestControllerAdvice public class RestErrorHandler { @ExceptionHandler(RuntimeException.class) @ResponseStatus(code = HttpStatus.BAD_REQUEST) public RestErrorMessage handleException(Exception e) { - return new RestErrorMessage(100,e.getMessage(),"6b8038e5-3b8f-4230-bfe8-4de2c422469f"); + return new RestErrorMessage(100, e.getMessage(), "6b8038e5-3b8f-4230-bfe8-4de2c422469f"); } - + @ExceptionHandler(ConstraintViolationException.class) @ResponseStatus(code = HttpStatus.BAD_REQUEST) public RestErrorMessage handleConstraintViolationException(ConstraintViolationException e) { - var violations = e.getConstraintViolations() - .stream() - .map(ConstraintViolation::getMessage) - .collect(Collectors.joining("|")); - return new RestErrorMessage(200,violations,"7c248b97-9aa8-46fd-b5b2-9f8ea537635c"); + var violations = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage) + .collect(Collectors.joining("|")); + return new RestErrorMessage(200, violations, "7c248b97-9aa8-46fd-b5b2-9f8ea537635c"); } - - + @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(code = HttpStatus.BAD_REQUEST) public RestErrorMessage handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - var violations = e.getBindingResult() - .getAllErrors() - .stream() - .map(ObjectError::getDefaultMessage) + var violations = e.getBindingResult().getAllErrors().stream().map(ObjectError::getDefaultMessage) .collect(Collectors.joining("|")); - return new RestErrorMessage(200,violations,"7c248b97-9aa8-46fd-b5b2-9f8ea537635c"); + return new RestErrorMessage(200, violations, "7c248b97-9aa8-46fd-b5b2-9f8ea537635c"); } - - + } diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/orm/EmployeeEntity.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/orm/EmployeeEntity.java index 0bd7066..59ad23d 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/orm/EmployeeEntity.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/orm/EmployeeEntity.java @@ -17,6 +17,11 @@ import com.example.validation.Iban; import com.example.validation.TcKimlikNo; +/** + * + * @author Binnur Kurt + * + */ @Entity @Table(name = "employees") @DynamicUpdate @@ -28,7 +33,7 @@ public class EmployeeEntity { @Size(min = 5) private String fullname; @Min(3_000) - //@Column(columnDefinition = "float default 1000") + // @Column(columnDefinition = "float default 1000") private Double salary; @Iban private String iban; diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/repository/EmployeeJpaRepository.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/repository/EmployeeJpaRepository.java index 697c078..c2efb4b 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/repository/EmployeeJpaRepository.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/repository/EmployeeJpaRepository.java @@ -4,6 +4,11 @@ import com.example.hr.orm.EmployeeEntity; +/** + * + * @author Binnur Kurt + * + */ public interface EmployeeJpaRepository extends JpaRepository { } diff --git a/hr-microservice-hexagonal/src/main/java/com/example/validation/Email.java b/hr-microservice-hexagonal/src/main/java/com/example/validation/Email.java index a63f0a3..5a09f71 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/validation/Email.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/validation/Email.java @@ -9,6 +9,11 @@ import javax.validation.Payload; import javax.validation.constraints.Pattern; +/** + * + * @author Binnur Kurt + * + */ @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) @Pattern(regexp = "^\\+?[a-z0-9](([-+.]|[_]+)?[a-z0-9]+)*@([a-z0-9]+(\\.|\\-))+[a-z]{2,6}$", message = "{validation.email}") diff --git a/hr-microservice-hexagonal/src/main/java/com/example/validation/Iban.java b/hr-microservice-hexagonal/src/main/java/com/example/validation/Iban.java index 19377f6..a25713b 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/validation/Iban.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/validation/Iban.java @@ -8,6 +8,11 @@ import javax.validation.Constraint; import javax.validation.Payload; +/** + * + * @author Binnur Kurt + * + */ @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = IbanValidator.class) diff --git a/hr-microservice-hexagonal/src/main/java/com/example/validation/IbanValidator.java b/hr-microservice-hexagonal/src/main/java/com/example/validation/IbanValidator.java index 97d39d9..5952227 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/validation/IbanValidator.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/validation/IbanValidator.java @@ -3,6 +3,11 @@ import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; +/** + * + * @author Binnur Kurt + * + */ public class IbanValidator implements ConstraintValidator { private static final long MAX = 999999999; private static final long MODULUS = 97; diff --git a/hr-microservice-hexagonal/src/main/java/com/example/validation/StrongPassword.java b/hr-microservice-hexagonal/src/main/java/com/example/validation/StrongPassword.java index a8d47ba..00a76e3 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/validation/StrongPassword.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/validation/StrongPassword.java @@ -10,6 +10,11 @@ import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; +/** + * + * @author Binnur Kurt + * + */ @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) @Pattern.List({ @Pattern(regexp = "^.*\\d+.*$", message = "{validation.strongPassword2}"), diff --git a/hr-microservice-hexagonal/src/main/java/com/example/validation/TcKimlikNo.java b/hr-microservice-hexagonal/src/main/java/com/example/validation/TcKimlikNo.java index 7bd8027..c90ea5b 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/validation/TcKimlikNo.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/validation/TcKimlikNo.java @@ -8,6 +8,11 @@ import javax.validation.Constraint; import javax.validation.Payload; +/** + * + * @author Binnur Kurt + * + */ @Target({ ElementType.FIELD, ElementType.PARAMETER }) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = TcKimlikNoValidator.class) diff --git a/hr-microservice-hexagonal/src/main/java/com/example/validation/TcKimlikNoValidator.java b/hr-microservice-hexagonal/src/main/java/com/example/validation/TcKimlikNoValidator.java index eb57612..bc9a2bf 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/validation/TcKimlikNoValidator.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/validation/TcKimlikNoValidator.java @@ -3,6 +3,11 @@ import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; +/** + * + * @author Binnur Kurt + * + */ public class TcKimlikNoValidator implements ConstraintValidator { @Override diff --git a/hr-microservice-hexagonal/src/main/resources/application.properties b/hr-microservice-hexagonal/src/main/resources/application.properties index 65016f1..07e397d 100644 --- a/hr-microservice-hexagonal/src/main/resources/application.properties +++ b/hr-microservice-hexagonal/src/main/resources/application.properties @@ -4,6 +4,7 @@ server.address=localhost server.port=7001 server.servlet.context-path=/hr spring.mvc.servlet.path=/api/v1 + major.version=1 minor.version=0 timestamp=1581420934