diff --git a/pom.xml b/pom.xml
index 17fd7ad..8098d29 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,24 +31,30 @@
org.springframework.boot
spring-boot-starter-web
-
org.flywaydb
flyway-core
runtime
-
com.h2database
h2
runtime
-
org.springframework.boot
spring-boot-starter-test
test
+
+ org.projectlombok
+ lombok
+ 1.18.26
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
diff --git a/src/main/java/com/zoomcare/candidatechallenge/.DS_Store b/src/main/java/com/zoomcare/candidatechallenge/.DS_Store
new file mode 100644
index 0000000..e75b544
Binary files /dev/null and b/src/main/java/com/zoomcare/candidatechallenge/.DS_Store differ
diff --git a/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java b/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java
index 0114259..e5f98cb 100644
--- a/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java
+++ b/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java
@@ -4,12 +4,8 @@
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
-public class CandidateChallengeApplication
-{
-
- public static void main(String[] args)
- {
- SpringApplication.run(CandidateChallengeApplication.class, args);
- }
-
+public class CandidateChallengeApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(CandidateChallengeApplication.class, args);
+ }
}
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..d9b1915
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/controller/EmployeeController.java
@@ -0,0 +1,29 @@
+package com.zoomcare.candidatechallenge.controller;
+
+import com.zoomcare.candidatechallenge.model.Employee;
+import com.zoomcare.candidatechallenge.service.EmployeeService;
+import lombok.AllArgsConstructor;
+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 javax.validation.constraints.NotNull;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/v1/employees")
+@AllArgsConstructor
+public class EmployeeController {
+ private EmployeeService service;
+
+ @GetMapping("/{id}")
+ public Employee getEmployee(@PathVariable @NotNull Long id) {
+ return service.getEmployee(id);
+ }
+
+ @GetMapping
+ public List getEmployees() {
+ return service.getEmployees();
+ }
+}
diff --git a/src/main/java/com/zoomcare/candidatechallenge/model/Employee.java b/src/main/java/com/zoomcare/candidatechallenge/model/Employee.java
new file mode 100644
index 0000000..429c96d
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/model/Employee.java
@@ -0,0 +1,28 @@
+package com.zoomcare.candidatechallenge.model;
+
+import lombok.Data;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import java.util.List;
+
+@Data
+@Entity
+@Table(name= "employee")
+public class Employee {
+
+ @Id
+ @Column
+ private Long id;
+ @Column(name="supervisor_id")
+ private Long supervisorId;
+
+ @OneToMany(mappedBy = "employee", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
+ private List propertyList;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zoomcare/candidatechallenge/model/Property.java b/src/main/java/com/zoomcare/candidatechallenge/model/Property.java
new file mode 100644
index 0000000..23864a2
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/model/Property.java
@@ -0,0 +1,28 @@
+package com.zoomcare.candidatechallenge.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Data
+@Entity
+@Table(name= "property")
+public class Property {
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "employee_id")
+ @JsonIgnore
+ private Employee employee;
+ @Id
+ @Column
+ private String key;
+ @Column
+ private String value;
+}
+
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..2cab4a9
--- /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.model.Employee;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import javax.transaction.Transactional;
+
+@Repository
+@Transactional
+public interface EmployeeRepository extends JpaRepository {
+}
\ No newline at end of file
diff --git a/src/main/java/com/zoomcare/candidatechallenge/repository/PropertyRepository.java b/src/main/java/com/zoomcare/candidatechallenge/repository/PropertyRepository.java
new file mode 100644
index 0000000..cbd640d
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/repository/PropertyRepository.java
@@ -0,0 +1,12 @@
+package com.zoomcare.candidatechallenge.repository;
+
+import com.zoomcare.candidatechallenge.model.Property;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import javax.transaction.Transactional;
+
+@Repository
+@Transactional
+public interface PropertyRepository extends JpaRepository {
+}
\ No newline at end of file
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..133c5cd
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeService.java
@@ -0,0 +1,10 @@
+package com.zoomcare.candidatechallenge.service;
+
+import com.zoomcare.candidatechallenge.model.Employee;
+
+import java.util.List;
+
+public interface EmployeeService {
+ Employee getEmployee(Long id);
+ List getEmployees();
+}
diff --git a/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImpl.java b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImpl.java
new file mode 100644
index 0000000..6e95995
--- /dev/null
+++ b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImpl.java
@@ -0,0 +1,30 @@
+package com.zoomcare.candidatechallenge.service;
+
+import com.zoomcare.candidatechallenge.model.Employee;
+import com.zoomcare.candidatechallenge.repository.EmployeeRepository;
+import com.zoomcare.candidatechallenge.repository.PropertyRepository;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@AllArgsConstructor
+public class EmployeeServiceImpl implements EmployeeService {
+ EmployeeRepository employeeRepository;
+ PropertyRepository propertyRepository;
+
+ @Override
+ public Employee getEmployee(Long id) {
+ Optional employeeOptional = employeeRepository.findById(id);
+ Employee employee = employeeOptional.isPresent() ? employeeOptional.get() : new Employee();
+ return employee;
+ }
+
+ @Override
+ public List getEmployees() {
+ List employeeList = employeeRepository.findAll();
+ return employeeList;
+ }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 4408d17..d6bd5c9 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -2,6 +2,11 @@ spring:
h2:
console:
enabled: true
+ datasource:
+ url: jdbc:h2:mem:testdb
+ username: sa
+ main:
+ allow-bean-definition-overriding: true
management:
endpoints:
web:
@@ -9,4 +14,4 @@ management:
include: "*"
endpoint:
health:
- show-details: always
\ No newline at end of file
+ show-details: always
diff --git a/src/test/java/com/zoomcare/candidatechallenge/controller/EmployeeControllerTest.java b/src/test/java/com/zoomcare/candidatechallenge/controller/EmployeeControllerTest.java
new file mode 100644
index 0000000..ca538ff
--- /dev/null
+++ b/src/test/java/com/zoomcare/candidatechallenge/controller/EmployeeControllerTest.java
@@ -0,0 +1,68 @@
+package com.zoomcare.candidatechallenge.controller;
+
+import com.zoomcare.candidatechallenge.model.Employee;
+import com.zoomcare.candidatechallenge.model.Property;
+import com.zoomcare.candidatechallenge.service.EmployeeService;
+import com.zoomcare.candidatechallenge.service.EmployeeServiceImpl;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class EmployeeControllerTest {
+
+ private EmployeeController controller;
+ EmployeeService service;
+
+ @Before
+ public void setUp() {
+ service = Mockito.mock(EmployeeServiceImpl.class);
+ controller = new EmployeeController(service);
+ }
+
+ @Test
+ public void test_getEmployee_success() {
+ Employee employee = getEmployee(1L, null,"title", "CEO");
+ Mockito.when(service.getEmployee(Mockito.any())).thenReturn(employee);
+ Employee controllerResponse = controller.getEmployee(1L);
+ assertNotNull(employee);
+ assertEquals(employee, controllerResponse);
+ }
+
+ @Test
+ public void test_getEmployees_success() {
+ List employeesResponse = new ArrayList<>();
+ Mockito.when(service.getEmployees()).thenReturn(employeesResponse);
+ List controllerResponse = controller.getEmployees();
+ assertNotNull(employeesResponse);
+ assertEquals(employeesResponse, controllerResponse);
+ }
+
+ @Test
+ public void test_getEmployee_notFound() {
+ Employee Employee = getEmployee(0L, null, null, null);
+ Mockito.when(service.getEmployee(Mockito.any())).thenReturn(Employee);
+ Employee controllerResponse = controller.getEmployee(0L);
+ assertNotNull(Employee);
+ assertEquals(Employee, controllerResponse);
+ }
+
+ private static Employee getEmployee(Long id, Long supervisorId, String key, String title) {
+ Employee employee = new Employee();
+ employee.setId(id);
+ employee.setSupervisorId(supervisorId);
+ Property property = new Property();
+ property.setEmployee(employee);
+ property.setKey(key);
+ property.setValue(title);
+ List propertyByEmployeeId = new ArrayList<>();
+ propertyByEmployeeId.add(property);
+ return employee;
+ }
+
+}
\ No newline at end of file
diff --git a/src/test/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImplTest.java b/src/test/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImplTest.java
new file mode 100644
index 0000000..5cb21e2
--- /dev/null
+++ b/src/test/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImplTest.java
@@ -0,0 +1,43 @@
+package com.zoomcare.candidatechallenge.service;
+
+import com.zoomcare.candidatechallenge.model.Employee;
+import com.zoomcare.candidatechallenge.repository.EmployeeRepository;
+import com.zoomcare.candidatechallenge.repository.PropertyRepository;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.Assert.assertNotNull;
+
+public class EmployeeServiceImplTest {
+
+ private EmployeeServiceImpl service;
+ EmployeeRepository employeeRepository;
+ PropertyRepository propertyRepository;
+
+ @Before
+ public void setUp() {
+ employeeRepository = Mockito.mock(EmployeeRepository.class);
+ propertyRepository = Mockito.mock(PropertyRepository.class);
+ service = new EmployeeServiceImpl(employeeRepository, propertyRepository);
+ }
+
+ @Test
+ public void test_getEmployee_success() {
+ Optional employeeOptional = Optional.of(new Employee());
+ Mockito.when(employeeRepository.findById(Mockito.any())).thenReturn(employeeOptional);
+ Employee employee = service.getEmployee(5L);
+ assertNotNull(employee);
+ }
+
+ @Test
+ public void test_getEmployees_success() {
+ Optional employeeOptional = Optional.of(new Employee());
+ Mockito.when(employeeRepository.findById(Mockito.any())).thenReturn(employeeOptional);
+ List employeeResponseList = service.getEmployees();
+ assertNotNull(employeeResponseList);
+ }
+}
\ No newline at end of file