diff --git a/pom.xml b/pom.xml index 17fd7ad..a3215a5 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ org.springframework.boot - spring-boot-starter-data-jdbc + spring-boot-starter-data-jpa org.springframework.boot @@ -49,7 +49,20 @@ spring-boot-starter-test test - + + org.modelmapper + modelmapper-module-jsr310 + 1.2.2 + + + + org.projectlombok + lombok + 1.18.24 + provided + + + diff --git a/src/main/java/com/zoomcare/candidatechallenge/BO/EmployeeBO.java b/src/main/java/com/zoomcare/candidatechallenge/BO/EmployeeBO.java new file mode 100644 index 0000000..4a7b20f --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/BO/EmployeeBO.java @@ -0,0 +1,17 @@ +package com.zoomcare.candidatechallenge.BO; + +import com.zoomcare.candidatechallenge.entity.Property; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.Set; + +@Getter +@Setter +public class EmployeeBO { + private Long id ; + private List properties ; + private Set employeeDirectReportee; + +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/BO/PropertyBO.java b/src/main/java/com/zoomcare/candidatechallenge/BO/PropertyBO.java new file mode 100644 index 0000000..4e9a11f --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/BO/PropertyBO.java @@ -0,0 +1,11 @@ +package com.zoomcare.candidatechallenge.BO; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PropertyBO { + private String key ; + private String value ; +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/controller/EmployeeController.java b/src/main/java/com/zoomcare/candidatechallenge/controller/EmployeeController.java new file mode 100644 index 0000000..696cb83 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/controller/EmployeeController.java @@ -0,0 +1,39 @@ +package com.zoomcare.candidatechallenge.controller; + +import com.zoomcare.candidatechallenge.BO.EmployeeBO; +import com.zoomcare.candidatechallenge.entity.Employee; +import com.zoomcare.candidatechallenge.service.EmployeeServices; +import org.modelmapper.ModelMapper; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/employees/v1") +public class EmployeeController { + EmployeeServices employeeServices ; + ModelMapper mapper; + public EmployeeController (EmployeeServices employeeServices ,ModelMapper mapper ){ + this.employeeServices = employeeServices; + this.mapper= mapper; + } + + @GetMapping(path = "/{empId}",produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getEmployeeById(@PathVariable(value="empId") Long employeeId) { + Employee employee = employeeServices.getEmployeebyId(employeeId); + EmployeeBO employeeBO= mapper.map(employee, EmployeeBO.class); + return ResponseEntity.ok(employeeBO); + } + @GetMapping(path = "/topLevelEmployees",produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> getTopLevelEmployees() { + List topLevelEmployees = employeeServices.getTopLevelEmployee(); + List topLevelEmployeesBO = topLevelEmployees.stream().map(e -> mapper.map(e, EmployeeBO.class)).collect(Collectors.toList()); + return ResponseEntity.ok(topLevelEmployeesBO); + } +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/entity/Employee.java b/src/main/java/com/zoomcare/candidatechallenge/entity/Employee.java new file mode 100644 index 0000000..441c046 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/entity/Employee.java @@ -0,0 +1,26 @@ +package com.zoomcare.candidatechallenge.entity; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; +import java.util.List; +import java.util.Set; + +@Entity +@Table(name="employee") +@Getter +@Setter +public class Employee { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id ; + @ManyToOne + Employee supervisor ; + @OneToMany + @JoinColumn(name="employee_id") + List properties ; + @OneToMany(mappedBy = "supervisor") + Set employeeDirectReportee; + +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/entity/Property.java b/src/main/java/com/zoomcare/candidatechallenge/entity/Property.java new file mode 100644 index 0000000..718d245 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/entity/Property.java @@ -0,0 +1,23 @@ +package com.zoomcare.candidatechallenge.entity; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; + +@Entity +@Table(name="property") +@IdClass(PropertyKey.class) +@Getter +@Setter +public class Property { + @Id + @Column(name ="employee_id") + Long employeeId ; + @Id + @Column(name="key") + String key ; + @Column(name="value") + String value ; + +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/entity/PropertyKey.java b/src/main/java/com/zoomcare/candidatechallenge/entity/PropertyKey.java new file mode 100644 index 0000000..ca61229 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/entity/PropertyKey.java @@ -0,0 +1,17 @@ +package com.zoomcare.candidatechallenge.entity; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Objects; + +@Getter +@Setter +@EqualsAndHashCode +public class PropertyKey implements Serializable { + private Long employeeId; + private String key; + +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/repository/EmployeeRepository.java b/src/main/java/com/zoomcare/candidatechallenge/repository/EmployeeRepository.java new file mode 100644 index 0000000..8f7f43d --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/repository/EmployeeRepository.java @@ -0,0 +1,12 @@ +package com.zoomcare.candidatechallenge.repository; + +import com.zoomcare.candidatechallenge.entity.Employee; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface EmployeeRepository extends JpaRepository { + List findAllBySupervisorIsNull(); +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeServices.java b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeServices.java new file mode 100644 index 0000000..0dadc81 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeServices.java @@ -0,0 +1,26 @@ +package com.zoomcare.candidatechallenge.service; + +import com.zoomcare.candidatechallenge.entity.Employee; +import com.zoomcare.candidatechallenge.repository.EmployeeRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class EmployeeServices { + + EmployeeRepository employeeRepository; + public EmployeeServices(EmployeeRepository employeeRepository) { + this.employeeRepository = employeeRepository; + } + + public Employee getEmployeebyId(Long id) { + Employee dummy = new Employee(); + dummy.setId(189635L); + return employeeRepository.findById(id).orElse(dummy); + } + public List getTopLevelEmployee() { + return employeeRepository.findAllBySupervisorIsNull(); + } + +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/util/ConfigurationOfMapper.java b/src/main/java/com/zoomcare/candidatechallenge/util/ConfigurationOfMapper.java new file mode 100644 index 0000000..bd165d1 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/util/ConfigurationOfMapper.java @@ -0,0 +1,14 @@ +package com.zoomcare.candidatechallenge.util; + +import org.modelmapper.ModelMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ConfigurationOfMapper { + @Bean + public ModelMapper getModelMapper() { + ModelMapper mapper = new ModelMapper(); + return mapper; + } +}