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;
+ }
+}