Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,18 @@
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
Expand All @@ -49,6 +54,18 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>

</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.zoomcare.candidatechallenge.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket challengeApi() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("Candidate Challenge").select()
.apis(RequestHandlerSelectors.basePackage("com.zoomcare.candidatechallenge.controllers")).build();

}

private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("Challenge Api").description("The resulting services should allow users to get a list of all top-level employees or to specify an employee by id to return just that employee.")
.contact(new Contact("Gabriel Leoni","","")).version("1.0").build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.zoomcare.candidatechallenge.controllers;

import java.math.BigInteger;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.zoomcare.candidatechallenge.map.EmployeeData;
import com.zoomcare.candidatechallenge.service.EmployeeService;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

@Autowired
private EmployeeService employeeService;

@GetMapping
public ResponseEntity<EmployeeData> getEmployee(BigInteger id) {
return employeeService.getEmployeeData(id);
}

@GetMapping("/topLevel")
public ResponseEntity<List<EmployeeData>> getTopLevelEmployee() {
return employeeService.getTopLevelEmployee();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.zoomcare.candidatechallenge.entities;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

import lombok.Data;

@Entity
@Data
public class Employee {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private BigInteger id;

@Column(name = "supervisor_id")
private BigInteger supervisorid;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.zoomcare.candidatechallenge.entities;

import java.math.BigInteger;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.zoomcare.candidatechallenge.repositories.CompositeKey;

import lombok.Data;

@Data
@Entity
@IdClass(CompositeKey.class)
public class Property {

@Id
@JsonIgnore
@Column(name = "employee_id")
private BigInteger employeeId;

@Id
private String key;

@Id
private String value;


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.zoomcare.candidatechallenge.map;

import java.util.List;

import com.zoomcare.candidatechallenge.entities.Employee;
import com.zoomcare.candidatechallenge.entities.Property;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class EmployeeData {

private Employee employee;

private List<Property> properties;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.zoomcare.candidatechallenge.repositories;

import java.io.Serializable;
import java.math.BigInteger;

public class CompositeKey implements Serializable {

private BigInteger employeeId;

private String key;

private String value;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.zoomcare.candidatechallenge.repositories;

import java.math.BigInteger;
import java.util.List;
import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.zoomcare.candidatechallenge.entities.Employee;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, BigInteger>{

Optional<Employee> findById(BigInteger id);

Optional<List<Employee>> findAllBySupervisoridIsNull();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.zoomcare.candidatechallenge.repositories;

import java.math.BigInteger;
import java.util.List;
import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.zoomcare.candidatechallenge.entities.Property;

@Repository
public interface PropertyRepository extends JpaRepository<Property, BigInteger>{

Optional<Property> findByEmployeeId(BigInteger employeeId);

Optional<List<Property>> findAllByEmployeeId(BigInteger employeeId);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.zoomcare.candidatechallenge.service;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import com.zoomcare.candidatechallenge.entities.Employee;
import com.zoomcare.candidatechallenge.entities.Property;
import com.zoomcare.candidatechallenge.map.EmployeeData;
import com.zoomcare.candidatechallenge.repositories.EmployeeRepository;
import com.zoomcare.candidatechallenge.repositories.PropertyRepository;

import lombok.extern.log4j.Log4j2;

@Service
@Log4j2
public class EmployeeService {

@Autowired
private EmployeeRepository empRepo;

@Autowired
private PropertyRepository propRepo;

public ResponseEntity<EmployeeData> getEmployeeData(BigInteger id) {

Optional<Employee> emp = empRepo.findById(id);

if(emp.isPresent()) {
Optional<List<Property>> props = propRepo.findAllByEmployeeId(id);

return new ResponseEntity<EmployeeData>(EmployeeData.builder().employee(emp.get()).properties(props.get()).build(), HttpStatus.OK);
}else {
log.error("The emploee with id {} does not exist.", id);
return new ResponseEntity<EmployeeData>(HttpStatus.NOT_FOUND);
}

}

public ResponseEntity<List<EmployeeData>> getTopLevelEmployee() {

Optional<List<Employee>> topEmpList = empRepo.findAllBySupervisoridIsNull();

if(topEmpList.isPresent()) {
List<EmployeeData> finalList = new ArrayList<>();

topEmpList.get().forEach(employee -> {
Optional<List<Property>> props = propRepo.findAllByEmployeeId(employee.getId());

finalList.add(EmployeeData.builder().employee(employee).properties(props.get()).build());
});

return new ResponseEntity<List<EmployeeData>>(finalList, HttpStatus.OK);
}else {

log.error("There are no top-level employees");
return new ResponseEntity<List<EmployeeData>>(HttpStatus.NOT_FOUND);
}

}

}
6 changes: 6 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@ spring:
h2:
console:
enabled: true
datasource:
url: jdbc:h2:mem:testdb
username: sa
password: sa
driverClassName: org.h2.Driver

management:
endpoints:
web:
Expand Down