diff --git a/pom.xml b/pom.xml index 17fd7ad..591f0f5 100644 --- a/pom.xml +++ b/pom.xml @@ -25,30 +25,34 @@ org.springframework.boot - spring-boot-starter-data-jdbc + spring-boot-starter-web org.springframework.boot - spring-boot-starter-web + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-devtools + runtime + true - org.flywaydb flyway-core runtime - com.h2database h2 runtime - org.springframework.boot spring-boot-starter-test test + diff --git a/src/main/java/com/zoomcare/candidatechallenge/bean/EmployeeBean.java b/src/main/java/com/zoomcare/candidatechallenge/bean/EmployeeBean.java new file mode 100644 index 0000000..2de2319 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/bean/EmployeeBean.java @@ -0,0 +1,103 @@ +package com.zoomcare.candidatechallenge.bean; + +import java.util.ArrayList; +import java.util.List; + +import com.zoomcare.candidatechallenge.entity.Employee; +import com.zoomcare.candidatechallenge.entity.Property; + +public class EmployeeBean { + + private Long id; + private List properties; + private List directReporties; + + public EmployeeBean() { + } + + public EmployeeBean(Employee employee) { + + this.id = employee.getId(); + for (Property property : employee.getProperties()) { + PropertyBean propertyBean = new PropertyBean(property); + this.addPropertyBean(propertyBean); + } + } + + public EmployeeBean(Employee employee, List directReports) { + + this.id = employee.getId(); + for (Property property : employee.getProperties()) { + PropertyBean propertyBean = new PropertyBean(property); + this.addPropertyBean(propertyBean); + } + for (Employee employeeIt : directReports) { + EmployeeBean directReport = new EmployeeBean(); + directReport.setId(employeeIt.getId()); + directReport.addProperties(employeeIt.getProperties()); + this.addDirectReport(directReport); + } + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + public List getDirectReporties() { + return directReporties; + } + + public void setDirectReporties(List directReporties) { + this.directReporties = directReporties; + } + + public void addPropertyBean(PropertyBean propertyBean) { + + if(this.properties == null) { + this.properties = new ArrayList<>(); + } + this.properties.add(propertyBean); + } + + public void addDirectReport(EmployeeBean employeeBean) { + + if(this.directReporties == null) { + this.directReporties = new ArrayList<>(); + } + this.directReporties.add(employeeBean); + + } + + public void addProperties(List properties) { + + for (Property property : properties) { + if(this.properties == null) { + this.properties = new ArrayList<>(); + } + this.addProperty(property); + } + + } + + private void addProperty(Property property) { + + if(this.properties == null) { + this.properties = new ArrayList<>(); + } + this.properties.add(new PropertyBean(property)); + + } + +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/bean/PropertyBean.java b/src/main/java/com/zoomcare/candidatechallenge/bean/PropertyBean.java new file mode 100644 index 0000000..47a2172 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/bean/PropertyBean.java @@ -0,0 +1,31 @@ +package com.zoomcare.candidatechallenge.bean; + +import com.zoomcare.candidatechallenge.entity.Property; + +public class PropertyBean { + + private String key; + private String value; + + public PropertyBean(Property property) { + this.key = property.getKey(); + this.value = property.getValue(); + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = 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..f0db161 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/controller/EmployeeController.java @@ -0,0 +1,30 @@ +package com.zoomcare.candidatechallenge.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +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 com.zoomcare.candidatechallenge.bean.EmployeeBean; +import com.zoomcare.candidatechallenge.service.EmployeeService; + +@RestController +@RequestMapping("/employee") +public class EmployeeController { + + @Autowired + private EmployeeService service; + + @GetMapping("/topLevel") + public List getTopLevelEmployees() { + return this.service.findTopLevelEmployee(); + } + + @GetMapping("{id}") + public EmployeeBean getEmployeeById(@PathVariable Long id) { + return this.service.findById(id); + } +} \ No newline at end of file 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..850a446 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/entity/Employee.java @@ -0,0 +1,63 @@ +package com.zoomcare.candidatechallenge.entity; + +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +@Entity +@Table(name = "employee") +public class Employee { + + @Id + private Long id; + + @Column(name = "supervisor_id") + private Long supervisorId; + + @OneToMany + @JoinColumn(name = "employee_id") + private List properties; + + @OneToMany(fetch = FetchType.LAZY) + @JoinColumn(name = "supervisor_id") + private List directReports; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSupervisorId() { + return supervisorId; + } + + public void setSupervisorId(Long supervisorId) { + this.supervisorId = supervisorId; + } + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + public List getDirectReports() { + return directReports; + } + + public void setDirectReports(List directReports) { + this.directReports = directReports; + } + +} 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..89d1dcf --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/entity/Property.java @@ -0,0 +1,51 @@ +package com.zoomcare.candidatechallenge.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "property") +public class Property implements Serializable { + + private static final long serialVersionUID = -2812137338249932294L; + + @Id + @Column(name = "employee_id") + private Long employeeId; + + @Id + @Column(name = "key") + private String key; + + @Column(name = "value") + private String value; + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + +} \ No newline at end of file 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..a0f99cc --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/repository/EmployeeRepository.java @@ -0,0 +1,15 @@ +package com.zoomcare.candidatechallenge.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.zoomcare.candidatechallenge.entity.Employee; + +@Repository +public interface EmployeeRepository extends JpaRepository { + + List findEmployeeBySupervisorIdAndId(Long superviorId, Long id); + +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeService.java b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeService.java new file mode 100644 index 0000000..38e05f0 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeService.java @@ -0,0 +1,12 @@ +package com.zoomcare.candidatechallenge.service; + +import java.util.List; + +import com.zoomcare.candidatechallenge.bean.EmployeeBean; + +public interface EmployeeService { + + EmployeeBean findById(Long id); + List findTopLevelEmployee(); + +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/service/impl/EmployeeServiceImpl.java b/src/main/java/com/zoomcare/candidatechallenge/service/impl/EmployeeServiceImpl.java new file mode 100644 index 0000000..9d2d7c6 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/service/impl/EmployeeServiceImpl.java @@ -0,0 +1,53 @@ +package com.zoomcare.candidatechallenge.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.zoomcare.candidatechallenge.bean.EmployeeBean; +import com.zoomcare.candidatechallenge.bean.PropertyBean; +import com.zoomcare.candidatechallenge.entity.Employee; +import com.zoomcare.candidatechallenge.entity.Property; +import com.zoomcare.candidatechallenge.repository.EmployeeRepository; +import com.zoomcare.candidatechallenge.service.EmployeeService; + +@Service +public class EmployeeServiceImpl implements EmployeeService { + + @Autowired + private EmployeeRepository repository; + + @Override + public EmployeeBean findById(Long id) { + + Employee employeeEntity = this.repository.findById(id).get(); + EmployeeBean employeeBean = new EmployeeBean(); + employeeBean.setId(employeeEntity.getId()); + for (Property property : employeeEntity.getProperties()) { + employeeBean.addPropertyBean(new PropertyBean(property)); + } + for (Employee employee : employeeEntity.getDirectReports()) { + EmployeeBean directReport = new EmployeeBean(); + directReport.setId(employee.getId()); + directReport.addProperties(employee.getProperties()); + employeeBean.addDirectReport(directReport); + } + + return employeeBean; + } + + @Override + public List findTopLevelEmployee() { + + List employeeBeans = new ArrayList<>(); + List employees = this.repository.findAll(); + for (Employee employee : employees) { + employeeBeans.add(new EmployeeBean(employee, employee.getDirectReports())); + } + + return employeeBeans; + } + +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..e836a68 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +spring.main.allow-bean-definition-overriding=true +spring.jpa.properties.hibernate.show_sql = false +spring.jpa.properties.hibernate.format_sql = false \ No newline at end of file