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