diff --git a/pom.xml b/pom.xml
index 17fd7ad..cca0729 100644
--- a/pom.xml
+++ b/pom.xml
@@ -37,18 +37,26 @@
flyway-core
runtime
-
+
+ org.projectlombok
+ lombok
+ 1.18.10
+
com.h2database
h2
runtime
-
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
org.springframework.boot
spring-boot-starter-test
test
+
diff --git a/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java b/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java
index 0114259..ccfc332 100644
--- a/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java
+++ b/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java
@@ -2,8 +2,10 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
+@EnableJpaRepositories({"com.zoomcare.candidatechallenge"})
public class CandidateChallengeApplication
{
diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java
new file mode 100644
index 0000000..2636451
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java
@@ -0,0 +1,28 @@
+package com.zoomcare.candidatechallenge;
+
+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 java.util.List;
+
+@RestController
+@RequestMapping("/employee")
+public class EmployeeController {
+
+ @Autowired
+ private EmployeeService employeeService;
+
+ @GetMapping("/all")
+ public List getAllEmployees() {
+ return employeeService.getAllEmployees();
+ }
+
+
+ @GetMapping("/{id}")
+ public EmployeeEntity getById(@PathVariable(name = "id") Long id){
+ return employeeService.getById(id);
+ }
+}
diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java
new file mode 100644
index 0000000..a15df62
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java
@@ -0,0 +1,19 @@
+package com.zoomcare.candidatechallenge;
+import lombok.Data;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Table;
+
+import javax.persistence.*;
+import java.util.List;
+import java.util.Set;
+
+@Data
+@Table("Employee")
+public class EmployeeEntity {
+ @Id
+ private Long id;
+ private Long supervisor_id;
+ private List employeeDetails;
+ private List reportees;
+
+}
diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeRepository.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeRepository.java
new file mode 100644
index 0000000..f136dc1
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeRepository.java
@@ -0,0 +1,8 @@
+package com.zoomcare.candidatechallenge;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface EmployeeRepository extends JpaRepository {
+}
diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java
new file mode 100644
index 0000000..30dffaa
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java
@@ -0,0 +1,120 @@
+package com.zoomcare.candidatechallenge;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.ResultSetExtractor;
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.stereotype.Service;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class EmployeeService {
+
+ @Autowired
+ private EmployeeRepository employeeRepository;
+ @Autowired
+ private JdbcTemplate jdbcTemplate;
+
+ public EmployeeEntity getById(Long id) {
+
+ String query = "select employee.*, property.* from employee LEFT OUTER JOIN property ON employee.id=property.employee_id";
+ return jdbcTemplate.query(query, new ResultSetExtractor() {
+ @Override
+ public EmployeeEntity extractData(ResultSet resultSet) throws SQLException, DataAccessException {
+ EmployeeEntity employee=null;
+ Map supList = new HashMap<>();
+ while(resultSet.next()){
+ Long empId = resultSet.getLong("id");
+ if(employee==null && empId==id){
+ employee = new EmployeeEntity();
+ employee.setId(empId);
+ employee.setSupervisor_id(resultSet.getLong("supervisor_id"));
+ }
+ if(resultSet.getLong("supervisor_id")==id){
+ supList.put(empId, empId);
+ }
+ Long propId = resultSet.getLong("employee_id");
+ if(propId>0 && empId==id){
+ PropertyEntity property = new PropertyEntity();
+ property.setEmployeeId(propId);
+ property.setKey(resultSet.getString("key"));
+ property.setValue(resultSet.getString("value"));
+ if(employee.getEmployeeDetails()!=null){
+ employee.getEmployeeDetails().add(property);
+ }else{
+ employee.setEmployeeDetails(new ArrayList<>());
+ employee.getEmployeeDetails().add(property);
+ }
+ }
+ }
+ employee.setReportees(new ArrayList<>());
+ employee.getReportees().addAll(supList.keySet());
+ return employee;
+ }
+ });
+ }
+
+ public List getAllEmployees() {
+ String query = "select employee.*, property.* from employee LEFT OUTER JOIN property ON employee.id=property.employee_id";
+ return jdbcTemplate.query(query, new ResultSetExtractor>() {
+ @Override
+ public List extractData(ResultSet resultSet) throws SQLException, DataAccessException {
+ List list = new ArrayList<>();
+ Map empMap = new HashMap<>();
+ Map> reportMap = new HashMap<>();
+ List pList = new ArrayList<>();
+ while(resultSet.next()){
+ Long empId = resultSet.getLong("id");
+ if(!empMap.containsKey(empId)){
+ EmployeeEntity emp = new EmployeeEntity();
+ emp.setId(empId);
+ Long supervisor_id = resultSet.getLong("supervisor_id");
+ emp.setSupervisor_id(supervisor_id);
+ if(reportMap.containsKey(supervisor_id)){
+ reportMap.get(supervisor_id).add(empId);
+ }else{
+ List l = new ArrayList<>();
+ l.add(empId);
+ reportMap.put(supervisor_id, l);
+ }
+ empMap.put(empId, emp);
+ }
+ Long empId2 = resultSet.getLong("employee_id");
+ if(empId2>0) {
+ PropertyEntity property = new PropertyEntity();
+ property.setEmployeeId(empId2);
+ property.setKey(resultSet.getString("key"));
+ property.setValue(resultSet.getString("value"));
+ if(empMap.get(empId2).getEmployeeDetails()!=null){
+ empMap.get(empId2).getEmployeeDetails().add(property);
+ }else{
+ empMap.get(empId2).setEmployeeDetails(new ArrayList<>());
+ empMap.get(empId2).getEmployeeDetails().add(property);
+ }
+ }
+ }
+ list.addAll(empMap.values());
+ for (EmployeeEntity emp:list) {
+ if(emp.getReportees()!=null) {
+ if(reportMap.get(emp.getId())!=null)
+ emp.getReportees().addAll(reportMap.get(emp.getId()));
+ }else{
+ if(reportMap.get(emp.getId())!=null) {
+ emp.setReportees(new ArrayList<>());
+ emp.getReportees().addAll(reportMap.get(emp.getId()));
+ }
+ }
+
+ }
+ return list;
+ }
+ });
+ }
+}
diff --git a/src/main/java/com/zoomcare/candidatechallenge/PropertyEntity.java b/src/main/java/com/zoomcare/candidatechallenge/PropertyEntity.java
new file mode 100644
index 0000000..3853b9e
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/PropertyEntity.java
@@ -0,0 +1,14 @@
+package com.zoomcare.candidatechallenge;
+
+import lombok.Data;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Table;
+
+@Data
+@Table("Property")
+public class PropertyEntity {
+ @Id
+ private Long employeeId;
+ private String key;
+ private String value;
+}
diff --git a/src/main/java/com/zoomcare/candidatechallenge/PropertyRepository.java b/src/main/java/com/zoomcare/candidatechallenge/PropertyRepository.java
new file mode 100644
index 0000000..cb7a01f
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/PropertyRepository.java
@@ -0,0 +1,8 @@
+package com.zoomcare.candidatechallenge;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PropertyRepository extends JpaRepository {
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 4408d17..4b9ab74 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -2,6 +2,17 @@ spring:
h2:
console:
enabled: true
+ datasource:
+ driverClassName: org.h2.Driver
+ url: jdbc:h2:mem:testdb
+ username: sa
+ password:
+ jpa:
+ show-sql: true
+ flyway:
+ baseline-on-migrate: true
+ main:
+ allow-bean-definition-overriding: true
management:
endpoints:
web:
@@ -9,4 +20,5 @@ management:
include: "*"
endpoint:
health:
- show-details: always
\ No newline at end of file
+ show-details: always
+