From 1d2f884699bdba6fb125b766f70841af8a11b047 Mon Sep 17 00:00:00 2001 From: deepcloudlabs Date: Tue, 23 Jun 2020 12:27:22 +0300 Subject: [PATCH] implement persistence adapter add swagger ui to document rest api --- hr-microservice-hexagonal/pom.xml | 15 ++ .../hr/adapter/EmployeeRepositoryAdapter.java | 36 ++++- .../hr/adapter/EventPuslisherAdapter.java | 2 +- .../java/com/example/hr/config/AppConfig.java | 5 +- .../com/example/hr/config/SwaggerConfig.java | 69 ++++++++++ .../hr/controller/EmployeeController.java | 6 +- .../com/example/hr/dto/EmployeeRequest.java | 91 +++++++++++++ .../com/example/hr/dto/EmployeeResponse.java | 9 ++ .../com/example/hr/orm/EmployeeEntity.java | 128 ++++++++++++++++++ .../hr/repository/EmployeeJpaRepository.java | 9 ++ .../src/main/resources/application.properties | 4 + 11 files changed, 360 insertions(+), 14 deletions(-) create mode 100644 hr-microservice-hexagonal/src/main/java/com/example/hr/config/SwaggerConfig.java create mode 100644 hr-microservice-hexagonal/src/main/java/com/example/hr/orm/EmployeeEntity.java create mode 100644 hr-microservice-hexagonal/src/main/java/com/example/hr/repository/EmployeeJpaRepository.java diff --git a/hr-microservice-hexagonal/pom.xml b/hr-microservice-hexagonal/pom.xml index fa43ac4..bd9c023 100644 --- a/hr-microservice-hexagonal/pom.xml +++ b/hr-microservice-hexagonal/pom.xml @@ -39,6 +39,21 @@ mysql-connector-java runtime + + io.springfox + springfox-swagger2 + 2.8.0 + + + io.swagger + swagger-annotations + 1.5.18 + + + io.springfox + springfox-swagger-ui + 2.8.0 + org.springframework.boot spring-boot-starter-test 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 e1609fb..637015b 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 @@ -2,31 +2,53 @@ import java.util.Optional; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.example.hr.domain.Employee; +import com.example.hr.domain.FullName; import com.example.hr.domain.TcKimlikNo; +import com.example.hr.orm.EmployeeEntity; +import com.example.hr.repository.EmployeeJpaRepository; import com.example.hr.repository.EmployeeRepository; @Repository public class EmployeeRepositoryAdapter implements EmployeeRepository { - //TODO: Spring Data Jpa + @Autowired + private EmployeeJpaRepository empJpaRepo; + @Override public Optional findByIdentity(TcKimlikNo identity) { - // TODO Auto-generated method stub - return null; + 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.empty(); } @Override public void save(Employee employee) { - // TODO Auto-generated method stub - + EmployeeEntity entity = new EmployeeEntity(); + entity.setIdentity(employee.getIdentityNo().getValue()); + FullName fullname = employee.getFullname(); + entity.setFullname(fullname.getFirst() + " " + fullname.getLast()); + entity.setSalary(employee.getSalary().getValue()); + entity.setIban(employee.getIban().getValue()); + entity.setBirthYear(employee.getBirthYear().getValue()); + entity.setDepartment(employee.getDepartment()); + entity.setPhoto(employee.getPhoto().getValue()); + entity.setFulltime(employee.isFulltime()); + empJpaRepo.save(entity); } @Override public void remove(Employee employee) { - // TODO Auto-generated method stub - + var identity = employee.getIdentityNo().getValue(); + empJpaRepo.deleteById(identity); } } 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 815186f..c0091b3 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 @@ -11,7 +11,7 @@ public class EventPuslisherAdapter implements EventPushlisher { @Override public void publishEvent(BusinessEvent event) { // TODO Auto-generated method stub - + } } 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 1213c71..e777551 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 @@ -12,10 +12,9 @@ public class AppConfig { @Bean - public EmployeeApplication employeeApplication( - EmployeeRepository employeeRepository, + public EmployeeApplication employeeApplication(EmployeeRepository employeeRepository, EventPushlisher eventPushlisher) { - SimpleEmployeeApplication employeeApplication= new SimpleEmployeeApplication(); + SimpleEmployeeApplication employeeApplication = new SimpleEmployeeApplication(); employeeApplication.setEmployeeRepository(employeeRepository); employeeApplication.setEventPushlisher(eventPushlisher); return employeeApplication; 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 new file mode 100644 index 0000000..5ab102e --- /dev/null +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/config/SwaggerConfig.java @@ -0,0 +1,69 @@ +package com.example.hr.config; + +import java.util.Date; + +import javax.servlet.ServletContext; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.paths.RelativePathProvider; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig implements WebMvcConfigurer { + @Value("${major.version}") + private String majorVersion; + @Value("${minor.version}") + private String minorVersion; + @Value("${timestamp}") + private long timestamp; + @Value("${server.servlet.context-path}") + private String contextPath; + @Value("${spring.mvc.servlet.path}") + private String servletPath; + + @Value("${server.address}") + private String host; + + @Value("${server.port}") + private long port; + + @Bean + public Docket api(ServletContext servletContext) { + return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()).build().host(host.concat(":").concat(Long.toString(port))) + .pathProvider(new RelativePathProvider(servletContext) { + @Override + public String getApplicationBasePath() { + return contextPath; + } + }).apiInfo(apiInfo()); + } + + private ApiInfo apiInfo() { + + return new ApiInfoBuilder().title("Market Service") + .description("Client FrontEnd API

Updated: [" + (new Date(timestamp)).toString() + + " ]" + " ") + .version(majorVersion + "." + minorVersion).build(); + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); + + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + } +} 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 5db82fb..60cb442 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 @@ -19,10 +19,10 @@ public class EmployeeController { @Autowired private EmployeeApplication employeeApplication; - + @PostMapping public EmployeeResponse hireEmployee(@RequestBody EmployeeRequest request) { - employeeApplication.hireEmployee(null); - return null; + employeeApplication.hireEmployee(request.toEmployee()); + return new EmployeeResponse("success"); } } 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 1ce7761..574f9fe 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 @@ -1,5 +1,96 @@ package com.example.hr.dto; +import com.example.hr.domain.Department; +import com.example.hr.domain.Employee; +import com.example.hr.domain.MoneyCurrency; + public class EmployeeRequest { + private String identity; + private String fullname; + private double salary; + private String iban; + private boolean fulltime; + private int birthYear; + private byte[] photo; + private Department department; + + public EmployeeRequest() { + } + + public String getIdentity() { + return identity; + } + + public void setIdentity(String identity) { + this.identity = identity; + } + + public String getFullname() { + return fullname; + } + + public void setFullname(String fullname) { + this.fullname = fullname; + } + + public double getSalary() { + return salary; + } + + public void setSalary(double salary) { + this.salary = salary; + } + + public String getIban() { + return iban; + } + + public void setIban(String iban) { + this.iban = iban; + } + + public boolean isFulltime() { + return fulltime; + } + + public void setFulltime(boolean fulltime) { + this.fulltime = fulltime; + } + + public int getBirthYear() { + return birthYear; + } + + public void setBirthYear(int birthYear) { + this.birthYear = birthYear; + } + + public byte[] getPhoto() { + return photo; + } + + public void setPhoto(byte[] photo) { + this.photo = photo; + } + + public Department getDepartment() { + return department; + } + + public void setDepartment(Department department) { + this.department = department; + } + + @Override + public String toString() { + return "EmployeeRequest [identity=" + identity + ", fullname=" + fullname + ", salary=" + salary + ", iban=" + + 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 f20fc0e..1fb01f9 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,14 @@ package com.example.hr.dto; public class EmployeeResponse { + private String status; + + public EmployeeResponse(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } } 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 new file mode 100644 index 0000000..a30eaa0 --- /dev/null +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/orm/EmployeeEntity.java @@ -0,0 +1,128 @@ +package com.example.hr.orm; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.Table; + +import com.example.hr.domain.Department; + +@Entity +@Table(name = "employees") +public class EmployeeEntity { + @Id + @Column(name = "identity") + private String identity; + private String fullname; + private double salary; + private String iban; + private boolean fulltime; + private int birthYear; + @Lob + @Column(columnDefinition = "longblob") + private byte[] photo; + @Enumerated(EnumType.STRING) + private Department department; + + public EmployeeEntity() { + } + + public String getIdentity() { + return identity; + } + + public void setIdentity(String identity) { + this.identity = identity; + } + + public String getFullname() { + return fullname; + } + + public void setFullname(String fullname) { + this.fullname = fullname; + } + + public double getSalary() { + return salary; + } + + public void setSalary(double salary) { + this.salary = salary; + } + + public String getIban() { + return iban; + } + + public void setIban(String iban) { + this.iban = iban; + } + + public boolean isFulltime() { + return fulltime; + } + + public void setFulltime(boolean fulltime) { + this.fulltime = fulltime; + } + + public int getBirthYear() { + return birthYear; + } + + public void setBirthYear(int birthYear) { + this.birthYear = birthYear; + } + + public byte[] getPhoto() { + return photo; + } + + public void setPhoto(byte[] photo) { + this.photo = photo; + } + + public Department getDepartment() { + return department; + } + + public void setDepartment(Department department) { + this.department = department; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((identity == null) ? 0 : identity.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + EmployeeEntity other = (EmployeeEntity) obj; + if (identity == null) { + if (other.identity != null) + return false; + } else if (!identity.equals(other.identity)) + return false; + return true; + } + + @Override + public String toString() { + return "EmployeeEntity [identity=" + identity + ", fullname=" + fullname + ", salary=" + salary + ", iban=" + + iban + ", fulltime=" + fulltime + ", birthYear=" + birthYear + ", department=" + department + "]"; + } + +} 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 new file mode 100644 index 0000000..697c078 --- /dev/null +++ b/hr-microservice-hexagonal/src/main/java/com/example/hr/repository/EmployeeJpaRepository.java @@ -0,0 +1,9 @@ +package com.example.hr.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.example.hr.orm.EmployeeEntity; + +public interface EmployeeJpaRepository extends JpaRepository { + +} diff --git a/hr-microservice-hexagonal/src/main/resources/application.properties b/hr-microservice-hexagonal/src/main/resources/application.properties index 780d201..65016f1 100644 --- a/hr-microservice-hexagonal/src/main/resources/application.properties +++ b/hr-microservice-hexagonal/src/main/resources/application.properties @@ -4,6 +4,10 @@ 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 +#http://localhost:7001/hr/api/v1/swagger-ui.html # Spring Data JPA - Data Source spring.datasource.url=jdbc:mysql://localhost:3306/hr?useSSL=false