diff --git a/pom.xml b/pom.xml index 17fd7ad..ee6d255 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,14 @@ spring-boot-starter-test test + + org.projectlombok + lombok + + + org.springframework.boot + spring-boot-starter-data-jpa + 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..4e7f44c --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/controller/EmployeeController.java @@ -0,0 +1,33 @@ +package com.zoomcare.candidatechallenge.controller; +import com.zoomcare.candidatechallenge.model.Employee; +import com.zoomcare.candidatechallenge.service.EmployeeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping(path = "/employees") +public class EmployeeController { + private final EmployeeService employeeService; + @Autowired + public EmployeeController(EmployeeService employeeService) { + this.employeeService = employeeService; + } + + @ResponseStatus(code = HttpStatus.OK) + @RequestMapping(value = {"", "/toplevel"}, method = RequestMethod.GET) + public ResponseEntity> getAllEmployees(){ + List employees = employeeService.topEmployees(); + return new ResponseEntity<>(employees, HttpStatus.OK); + } + + @ResponseStatus(code = HttpStatus.OK) + @GetMapping("/{id}") + public ResponseEntity findEmployeeById(@PathVariable("id") Long id){ + Employee employee = employeeService.getEmployeeById(id); + return new ResponseEntity<>(employee, HttpStatus.OK); + } +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/controller/PropertyController.java b/src/main/java/com/zoomcare/candidatechallenge/controller/PropertyController.java new file mode 100644 index 0000000..cdc37e2 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/controller/PropertyController.java @@ -0,0 +1,28 @@ +package com.zoomcare.candidatechallenge.controller; +import com.zoomcare.candidatechallenge.model.Property; +import com.zoomcare.candidatechallenge.service.PropertyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping(path = "properties") +public class PropertyController { + + private final PropertyService propertiesService; + @Autowired + public PropertyController(PropertyService propertiesService) { + this.propertiesService = propertiesService; + } + + @ResponseStatus(code = HttpStatus.OK) + @GetMapping("") + public ResponseEntity> getAllEmployees(){ + List employees = propertiesService.topProperties(); + return new ResponseEntity<>(employees, HttpStatus.OK); + } + +} 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..f97ea5b --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/model/Employee.java @@ -0,0 +1,29 @@ +package com.zoomcare.candidatechallenge.model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.List; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Table(name="employee") + +public class Employee implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id",nullable = false, updatable = false) + private Long id; + + @Column(name = "supervisor_id") + private Long supervisorId; + + @OneToMany + @JoinColumn(name = "employee_id") + private List properties; + +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/model/EmployeePropertyCompositeKey.java b/src/main/java/com/zoomcare/candidatechallenge/model/EmployeePropertyCompositeKey.java new file mode 100644 index 0000000..b329d96 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/model/EmployeePropertyCompositeKey.java @@ -0,0 +1,30 @@ +package com.zoomcare.candidatechallenge.model; + +import lombok.Data; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serializable; +import java.util.Objects; + +@Data +@Embeddable +public class EmployeePropertyCompositeKey implements Serializable { + @Column(name = "key") + private String key; + @Column(name = "employee_id") + private Long employeeId; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof EmployeePropertyCompositeKey)) return false; + EmployeePropertyCompositeKey that = (EmployeePropertyCompositeKey) o; + return key == that.key && Objects.equals(employeeId, that.employeeId); + } + + @Override + public int hashCode() { + return Objects.hash(key, employeeId); + } +} 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..bf315a9 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/model/Property.java @@ -0,0 +1,19 @@ +package com.zoomcare.candidatechallenge.model; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.io.Serializable; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Table(name="property") +public class Property implements Serializable { + + private String value; + @EmbeddedId + private EmployeePropertyCompositeKey id; +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/repo/EmployeeRepo.java b/src/main/java/com/zoomcare/candidatechallenge/repo/EmployeeRepo.java new file mode 100644 index 0000000..dcc026e --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/repo/EmployeeRepo.java @@ -0,0 +1,11 @@ +package com.zoomcare.candidatechallenge.repo; + +import com.zoomcare.candidatechallenge.model.Employee; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +@Repository +public interface EmployeeRepo extends JpaRepository { + Optional findEmployeeById(Long id); +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/repo/PropertyRepo.java b/src/main/java/com/zoomcare/candidatechallenge/repo/PropertyRepo.java new file mode 100644 index 0000000..9996095 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/repo/PropertyRepo.java @@ -0,0 +1,9 @@ +package com.zoomcare.candidatechallenge.repo; + +import com.zoomcare.candidatechallenge.model.Property; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PropertyRepo extends JpaRepository { +} 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..fd4f357 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeService.java @@ -0,0 +1,32 @@ +package com.zoomcare.candidatechallenge.service; + +import com.zoomcare.candidatechallenge.model.Employee; +import com.zoomcare.candidatechallenge.repo.EmployeeRepo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class EmployeeService { + private final EmployeeRepo employeeRepo; + + @Autowired + public EmployeeService(EmployeeRepo employeeRepo) { + this.employeeRepo = employeeRepo; + } + + public List topEmployees(){ + List employeeList = employeeRepo.findAll(); + return employeeList; + } + + public Employee getEmployeeById(Long id){ + Optional employeeOptional = employeeRepo.findEmployeeById(id); + if(employeeOptional.isPresent()){ + return employeeOptional.get(); + } + return null; + } +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/service/PropertyService.java b/src/main/java/com/zoomcare/candidatechallenge/service/PropertyService.java new file mode 100644 index 0000000..fac35d6 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/service/PropertyService.java @@ -0,0 +1,21 @@ +package com.zoomcare.candidatechallenge.service; +import com.zoomcare.candidatechallenge.model.Property; +import com.zoomcare.candidatechallenge.repo.PropertyRepo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class PropertyService { + public final PropertyRepo propertiesRepo; + + @Autowired + public PropertyService(PropertyRepo propertiesRepo) { + this.propertiesRepo = propertiesRepo; + } + + public List topProperties(){ + List propertiesList = propertiesRepo.findAll(); + return propertiesList; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4408d17..e607eaa 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,6 +2,8 @@ spring: h2: console: enabled: true + main: + allow-bean-definition-overriding: 'true' management: endpoints: web: