From 832f5ebf1c3bd7c961c76b8a603b3e7af7f22b35 Mon Sep 17 00:00:00 2001 From: deepcloudlabs Date: Thu, 25 Jun 2020 23:01:22 +0300 Subject: [PATCH] fix converter errors fix transaction error --- .../hr/application/EmployeeApplication.java | 4 +- .../business/SimpleEmployeeApplication.java | 16 ++-- .../src/com/example/hr/domain/Employee.java | 13 ++- .../com.example/hr-domain/pom.properties | 2 +- .../SimpleEmployeeApplicationTest.java | 5 +- .../adapter/EmployeeRepositoryJpaAdapter.java | 12 +-- .../example/hr/config/ModelMapperConfig.java | 90 +++++++++---------- .../hr/controller/EmployeeController.java | 20 +++-- .../example/hr/document/EmployeeDocument.java | 4 +- .../com/example/hr/dto/EmployeeRequest.java | 4 +- .../example/hr/handler/RestErrorHandler.java | 2 +- .../com/example/hr/orm/EmployeeEntity.java | 6 +- .../{TcKimlikNo.java => TcKimlik.java} | 2 +- .../validation/TcKimlikNoValidator.java | 4 +- 14 files changed, 101 insertions(+), 83 deletions(-) rename hr-microservice-hexagonal/src/main/java/com/example/validation/{TcKimlikNo.java => TcKimlik.java} (95%) diff --git a/hr-domain/src/com/example/hr/application/EmployeeApplication.java b/hr-domain/src/com/example/hr/application/EmployeeApplication.java index 249d898..afe571a 100644 --- a/hr-domain/src/com/example/hr/application/EmployeeApplication.java +++ b/hr-domain/src/com/example/hr/application/EmployeeApplication.java @@ -1,5 +1,7 @@ package com.example.hr.application; +import java.util.Optional; + import com.example.hr.domain.Employee; import com.example.hr.domain.TcKimlikNo; @@ -12,6 +14,6 @@ public interface EmployeeApplication { boolean hireEmployee(Employee employee); - boolean fireEmployee(TcKimlikNo identity); + Optional fireEmployee(TcKimlikNo identity); } \ No newline at end of file diff --git a/hr-domain/src/com/example/hr/application/business/SimpleEmployeeApplication.java b/hr-domain/src/com/example/hr/application/business/SimpleEmployeeApplication.java index f61ba7c..e04c687 100644 --- a/hr-domain/src/com/example/hr/application/business/SimpleEmployeeApplication.java +++ b/hr-domain/src/com/example/hr/application/business/SimpleEmployeeApplication.java @@ -1,5 +1,8 @@ package com.example.hr.application.business; +import java.util.Optional; +import java.util.UUID; + import com.example.hr.application.EmployeeApplication; import com.example.hr.domain.Employee; import com.example.hr.domain.TcKimlikNo; @@ -28,18 +31,19 @@ public void setEventPushlisher(EventPushlisher eventPushlisher) { @Override public boolean hireEmployee(Employee employee) { employeeRepository.save(employee); - eventPushlisher.publishEvent(new EmployeeHiredEvent("", "employees", employee)); + eventPushlisher.publishEvent(new EmployeeHiredEvent(UUID.randomUUID().toString(), "employees", employee)); return true; } @Override - public boolean fireEmployee(TcKimlikNo identity) { + public Optional fireEmployee(TcKimlikNo identity) { var employee = employeeRepository.findByIdentity(identity); - if (employee.isEmpty()) return false; - Employee emp = employee.get(); + if (employee.isEmpty()) + return Optional.empty(); + var emp = employee.get(); employeeRepository.remove(emp); - eventPushlisher.publishEvent(new EmployeeFiredEvent("1", "employees", emp)); - return true; + eventPushlisher.publishEvent(new EmployeeFiredEvent(UUID.randomUUID().toString(), "employees", emp)); + return Optional.of(emp); } } diff --git a/hr-domain/src/com/example/hr/domain/Employee.java b/hr-domain/src/com/example/hr/domain/Employee.java index 1163471..165cfa4 100644 --- a/hr-domain/src/com/example/hr/domain/Employee.java +++ b/hr-domain/src/com/example/hr/domain/Employee.java @@ -16,15 +16,18 @@ // Ctrl + Shift + F (Format Source Code) (Ctrl + Alt + L) public class Employee { private static final Money MIN_SALARY = Money.of(3_000, MoneyCurrency.TL); - private final TcKimlikNo identityNo; + private TcKimlikNo identityNo; private FullName fullname; private Money salary; private Iban iban; - private final BirthYear birthYear; + private BirthYear birthYear; private Photo photo; private boolean fulltime; private Department department; + public Employee() { + } + public Employee(TcKimlikNo identityNo, FullName fullname, Money salary, Iban iban, BirthYear birthYear, Photo photo, boolean fulltime, Department department) { this.identityNo = identityNo; @@ -128,6 +131,12 @@ public void hireToParttime() { this.decreaseSalary(50.); } + @Override + public String toString() { + return "Employee [identityNo=" + identityNo + ", fullname=" + fullname + ", salary=" + salary + ", iban=" + iban + + ", birthYear=" + birthYear + ", fulltime=" + fulltime + ", department=" + department + "]"; + } + public static class Builder { private final TcKimlikNo identityNo; private FullName fullname; diff --git a/hr-domain/target/classes/META-INF/maven/com.example/hr-domain/pom.properties b/hr-domain/target/classes/META-INF/maven/com.example/hr-domain/pom.properties index 2c74a2b..99c09a2 100644 --- a/hr-domain/target/classes/META-INF/maven/com.example/hr-domain/pom.properties +++ b/hr-domain/target/classes/META-INF/maven/com.example/hr-domain/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Tue Jun 23 17:09:21 EET 2020 +#Thu Jun 25 22:30:37 EET 2020 m2e.projectLocation=C\:\\DEVEL\\stage\\tmp\\dcl350\\hr-domain m2e.projectName=hr-domain groupId=com.example diff --git a/hr-domain/test/com/example/hr/application/business/SimpleEmployeeApplicationTest.java b/hr-domain/test/com/example/hr/application/business/SimpleEmployeeApplicationTest.java index 5729494..8a4bfbb 100644 --- a/hr-domain/test/com/example/hr/application/business/SimpleEmployeeApplicationTest.java +++ b/hr-domain/test/com/example/hr/application/business/SimpleEmployeeApplicationTest.java @@ -1,5 +1,6 @@ package com.example.hr.application.business; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Optional; @@ -73,9 +74,9 @@ void fireEmployee_success() { Mockito.when(empRepo.findByIdentity(TcKimlikNo.of("40310900232"))).thenReturn(Optional.of(jack)); Mockito.doNothing().when(eventPublisher).publishEvent(new EmployeeFiredEvent("2", "employees", jack)); // 2. call exercise method - var success = app.fireEmployee(TcKimlikNo.of("40310900232")); + var emp = app.fireEmployee(TcKimlikNo.of("40310900232")); // 3. Verification - assertTrue(success); + assertEquals(jack, emp.get()); // 4. destroy setup } diff --git a/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EmployeeRepositoryJpaAdapter.java b/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EmployeeRepositoryJpaAdapter.java index 02b6e75..1169aa4 100644 --- a/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EmployeeRepositoryJpaAdapter.java +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/adapter/EmployeeRepositoryJpaAdapter.java @@ -2,8 +2,10 @@ import java.util.Optional; +import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import com.example.hr.domain.Employee; import com.example.hr.domain.FullName; @@ -24,21 +26,20 @@ public class EmployeeRepositoryJpaAdapter implements EmployeeRepository { @Autowired private EmployeeJpaRepository empJpaRepo; + @Autowired + private ModelMapper mapper; @Override public Optional findByIdentity(TcKimlikNo identity) { var emp = empJpaRepo.findById(identity.getValue()); if (emp.isPresent()) { - // EmployeeEntity -> Employee - Employee employee = new Employee.Builder(emp.get().getIdentity()) - // TODO: set other fields of domain entity - .build(); - return Optional.of(employee); + return Optional.of(mapper.map(emp.get(), Employee.class)); } return Optional.empty(); } @Override + @Transactional public void save(Employee employee) { EmployeeEntity entity = new EmployeeEntity(); entity.setIdentity(employee.getIdentityNo().getValue()); @@ -54,6 +55,7 @@ public void save(Employee employee) { } @Override + @Transactional public void remove(Employee employee) { var identity = employee.getIdentityNo().getValue(); empJpaRepo.deleteById(identity); 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 index 0d8386e..0aee858 100644 --- 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 @@ -1,7 +1,7 @@ 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; @@ -10,6 +10,7 @@ import com.example.hr.domain.FullName; import com.example.hr.domain.MoneyCurrency; import com.example.hr.dto.EmployeeRequest; +import com.example.hr.orm.EmployeeEntity; /** * @@ -18,55 +19,52 @@ */ @Configuration public class ModelMapperConfig { + private static final Converter employeeDocumentToEmployeeConverter = context -> { + var employeeDocument = context.getSource(); + String[] tokens = employeeDocument.getFullname().split("\\w+"); + return new Employee.Builder(employeeDocument.getIdentity()).fullname(tokens[0], tokens[1]) + .iban(employeeDocument.getIban()).salary(employeeDocument.getSalary(), MoneyCurrency.TL) + .birthYear(employeeDocument.getBirthYear()).fulltime(employeeDocument.getFulltime()) + .department(employeeDocument.getDepartment()).photo(employeeDocument.getPhoto().getBytes()).build(); + }; + private static final Converter employeeToEmployeeDocumentConverter = (context -> { + var employee = context.getSource(); + EmployeeDocument employeeDocument = new EmployeeDocument(); + employeeDocument.setIdentity(employee.getIdentityNo().getValue()); + FullName fullname = employee.getFullname(); + employeeDocument.setFullname(fullname.getFirst() + " " + fullname.getLast()); + employeeDocument.setSalary(employee.getSalary().getValue()); + employeeDocument.setIban(employee.getIban().getValue()); + employeeDocument.setPhoto(new String(employee.getPhoto().getValue())); + employeeDocument.setBirthYear(employee.getBirthYear().getValue()); + employeeDocument.setDepartment(employee.getDepartment()); + employeeDocument.setFulltime(employee.isFulltime()); + return employeeDocument; + }); + private static final Converter employeeRequestToEmployeeConverter = (context -> { + var employeeRequest = context.getSource(); + String[] tokens = employeeRequest.getFullname().split("\\s+"); + 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(); + }); + private static final Converter employeeEntityToEmployeeConverter = (context -> { + var employeeEntity = context.getSource(); + String[] tokens = employeeEntity.getFullname().split("\\s+"); + return new Employee.Builder(employeeEntity.getIdentity()).fullname(tokens[0], tokens[1]) + .iban(employeeEntity.getIban()).salary(employeeEntity.getSalary(), MoneyCurrency.TL) + .birthYear(employeeEntity.getBirthYear()).fulltime(employeeEntity.isFulltime()) + .department(employeeEntity.getDepartment()).photo(employeeEntity.getPhoto()).build(); + }); @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(); - }); - TypeMap employeeDocumentToEmployeeTypeMap = mapper - .getTypeMap(EmployeeDocument.class, Employee.class); - if (employeeDocumentToEmployeeTypeMap == null) { - employeeDocumentToEmployeeTypeMap = mapper.createTypeMap(EmployeeDocument.class, Employee.class); - } - employeeRequestToEmployeeTypeMap.setProvider(provisionRequest -> { - var employeeDocument = EmployeeDocument.class.cast(provisionRequest.getSource()); - String[] tokens = employeeDocument.getFullname().split("\\w+"); - return new Employee.Builder(employeeDocument.getIdentity()).fullname(tokens[0], tokens[1]) - .iban(employeeDocument.getIban()).salary(employeeDocument.getSalary(), MoneyCurrency.TL) - .birthYear(employeeDocument.getBirthYear()).fulltime(employeeDocument.getFulltime()) - .department(employeeDocument.getDepartment()).photo(employeeDocument.getPhoto().getBytes()).build(); - }); - TypeMap employeeToEmployeeDocumentTypeMap = mapper.getTypeMap(Employee.class, - EmployeeDocument.class); - if (employeeToEmployeeDocumentTypeMap == null) { - employeeToEmployeeDocumentTypeMap = mapper.createTypeMap(Employee.class, EmployeeDocument.class); - } - employeeToEmployeeDocumentTypeMap.setProvider(provisionRequest -> { - var employee = Employee.class.cast(provisionRequest.getSource()); - EmployeeDocument employeeDocument = new EmployeeDocument(); - employeeDocument.setIdentity(employee.getIdentityNo().getValue()); - FullName fullname = employee.getFullname(); - employeeDocument.setFullname(fullname.getFirst() + " " + fullname.getLast()); - employeeDocument.setSalary(employee.getSalary().getValue()); - employeeDocument.setIban(employee.getIban().getValue()); - employeeDocument.setPhoto(new String(employee.getPhoto().getValue())); - employeeDocument.setBirthYear(employee.getBirthYear().getValue()); - employeeDocument.setDepartment(employee.getDepartment()); - employeeDocument.setFulltime(employee.isFulltime()); - return employeeDocument; - }); + mapper.addConverter(employeeRequestToEmployeeConverter, EmployeeRequest.class, Employee.class); + mapper.addConverter(employeeEntityToEmployeeConverter, EmployeeEntity.class, Employee.class); + mapper.addConverter(employeeToEmployeeDocumentConverter, Employee.class, EmployeeDocument.class); + mapper.addConverter(employeeDocumentToEmployeeConverter, EmployeeDocument.class, Employee.class); return mapper; } } 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 cf237f3..bf5f78d 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 @@ -18,10 +18,11 @@ import com.example.hr.application.EmployeeApplication; import com.example.hr.domain.Employee; +import com.example.hr.domain.TcKimlikNo; import com.example.hr.dto.EmployeeRequest; import com.example.hr.dto.EmployeeResponse; import com.example.hr.orm.EmployeeEntity; -import com.example.validation.TcKimlikNo; +import com.example.validation.TcKimlik; /** * @@ -41,17 +42,18 @@ public class EmployeeController { @PostMapping public EmployeeResponse hireEmployee(@RequestBody @Validated EmployeeRequest request) { - employeeApplication.hireEmployee(mapper.map(request, Employee.class)); + Employee emp = mapper.map(request, Employee.class); + employeeApplication.hireEmployee(emp); return new EmployeeResponse("success"); } @PutMapping("{identity}") - public void updateEmployee(@PathVariable @TcKimlikNo String identity, @Validated @RequestBody EmployeeEntity e) { + public void updateEmployee(@PathVariable @TcKimlik String identity, @Validated @RequestBody EmployeeEntity e) { } @PatchMapping("{identity}") - public void patchEmployee(@PathVariable @TcKimlikNo String identity, Map employee) { + public void patchEmployee(@PathVariable @TcKimlik String identity, Map employee) { EmployeeEntity employeeEntity = null; var clazz = EmployeeEntity.class; employee.forEach((field, value) -> { @@ -62,11 +64,11 @@ public void patchEmployee(@PathVariable @TcKimlikNo String identity, Map[] groups() default {}; 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 bc9a2bf..afcba0f 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 @@ -8,10 +8,10 @@ * @author Binnur Kurt * */ -public class TcKimlikNoValidator implements ConstraintValidator { +public class TcKimlikNoValidator implements ConstraintValidator { @Override - public void initialize(TcKimlikNo arg0) { + public void initialize(TcKimlik arg0) { } @Override