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
19 changes: 13 additions & 6 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<version>2.7.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zoomcare</groupId>
Expand All @@ -23,6 +23,10 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
Expand All @@ -31,19 +35,22 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
Expand All @@ -60,4 +67,4 @@
</plugins>
</build>

</project>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package com.zoomcare.candidatechallenge.controller;

import com.zoomcare.candidatechallenge.entity.Employee;
import com.zoomcare.candidatechallenge.entity.Property;
import com.zoomcare.candidatechallenge.exception.EmployeeNotFoundException;
import com.zoomcare.candidatechallenge.exception.PropertyNotFoundException;
import com.zoomcare.candidatechallenge.repository.EmployeeRepository;
import com.zoomcare.candidatechallenge.repository.PropertiesRepository;
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.ArrayList;
import java.util.List;
import java.util.Optional;

@RestController
public class CrudController {
// , ;

@Autowired
private EmployeeRepository employeeRepository;

@Autowired
private PropertiesRepository propertiesRepository;

// Employee
@PostMapping("/api/employees")
public ResponseEntity<Employee> createEmployee(@RequestBody Employee employee) {

Employee _employee = employeeRepository.save(new Employee(employee.getSupervisor_id()));

return new ResponseEntity<>(_employee, HttpStatus.CREATED);
}

@GetMapping("/api/employees")
public ResponseEntity<List<Employee>> getAllEmployees() {
List<Employee> lemployees = new ArrayList<Employee>();
employeeRepository.findAll().forEach(lemployees::add);

if (lemployees.isEmpty()) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

return new ResponseEntity<>(lemployees, HttpStatus.OK);
}

@GetMapping("/api/employees/{id}")
public ResponseEntity<Employee> getEmployeeById(@PathVariable("id") long id) {

Optional<Employee> employee = employeeRepository.findById(id);

if(!employee.isPresent()) {
throw new EmployeeNotFoundException("Book with Id = " + id + " not found");
}

return new ResponseEntity<Employee>(employee.get(), HttpStatus.OK);
}

@PutMapping("/api/employees/{id}")
public ResponseEntity<Employee> updateEmployee(@PathVariable("id") long id, @RequestBody Employee employee) {

Optional<Employee> _employee = employeeRepository.findById(id);

if(!_employee.isPresent()) {
throw new EmployeeNotFoundException("Employee with Id = " + id + " not found.");
}

_employee.get().setSupervisor_id(employee.getSupervisor_id());

return new ResponseEntity<>(employeeRepository.save(_employee.get()), HttpStatus.OK);
}

@DeleteMapping("/api/books/{id}")
public ResponseEntity<HttpStatus> deleteEmployee(@PathVariable("id") long id) {

Optional employee = employeeRepository.findById(id);

if(!employee.isPresent()) {
throw new EmployeeNotFoundException("Employee id = " + id + " not found.");
}

employeeRepository.deleteById(id);

return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

//Properties
@PostMapping("/api/employees/{employeeId}/properties")
public ResponseEntity<Property> createProperty(@PathVariable(value = "employeeId") Long employeeId, @RequestBody Property properties) {

Property _properties = employeeRepository.findById(employeeId).map(emp -> { // Ojo con el map
properties.setEmployee(emp);
return propertiesRepository.save(properties);
}).orElseThrow(() -> new EmployeeNotFoundException("Not found Book with id = " + employeeId));

return new ResponseEntity<>(_properties, HttpStatus.CREATED);
}

@GetMapping("/api/properties/{id}")
public ResponseEntity<Property> getPropertiesById(@PathVariable(value = "id") Long id) {

Property _properties = propertiesRepository.findById(id)
.orElseThrow(() -> new PropertyNotFoundException("Property not found with id = " + id));

return new ResponseEntity<>(_properties, HttpStatus.OK);
}
}
42 changes: 42 additions & 0 deletions src/main/java/com/zoomcare/candidatechallenge/entity/Employee.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.zoomcare.candidatechallenge.entity;

import javax.persistence.*;

@Entity
@Table(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "employee_generator")
private Long id;
private Long supervisor_id;

public Employee() {}

public Employee(Long supervisor_id) {
this.supervisor_id = supervisor_id;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public Long getSupervisor_id() {
return supervisor_id;
}

public void setSupervisor_id(Long supervisor_id) {
this.supervisor_id = supervisor_id;
}

@Override
public String toString() {
return "Employee{" +
"id=" + id +
", supervisor_id=" + supervisor_id +
'}';
}
}
58 changes: 58 additions & 0 deletions src/main/java/com/zoomcare/candidatechallenge/entity/Property.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.zoomcare.candidatechallenge.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

import javax.persistence.*;

@Entity
@Table(name = "property")
public class Property {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "properties_generator")
private Long property_id;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "employee_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Employee employee;

private String mykey;
private String myvalue;

public Property() {}

public Long getProperty_id() {
return property_id;
}

public void setProperty_id(Long property_id) {
this.property_id = property_id;
}

public String getMykey() {
return mykey;
}

public void setMykey(String mykey) {
this.mykey = mykey;
}

public String getMyvalue() {
return myvalue;
}

public void setMyvalue(String myvalue) {
this.myvalue = myvalue;
}

public Employee getEmployee() {
return employee;
}

public void setEmployee(Employee employee) {
this.employee = employee;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.zoomcare.candidatechallenge.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.NOT_FOUND)
public class EmployeeNotFoundException extends RuntimeException {
public EmployeeNotFoundException(String msg) {
super(msg);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.zoomcare.candidatechallenge.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.NOT_FOUND)
public class PropertyNotFoundException extends RuntimeException {
public PropertyNotFoundException(String msg) {
super(msg);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.zoomcare.candidatechallenge.repository;

import com.zoomcare.candidatechallenge.entity.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

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

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

import com.zoomcare.candidatechallenge.entity.Property;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import javax.transaction.Transactional;
import java.util.List;

@Repository
public interface PropertiesRepository extends JpaRepository<Property, Long> {
List<Property> findByEmployeeId(Long id);

@Transactional
void deleteByEmployeeId(long id);
}
4 changes: 4 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
spring.datasource.url=jdbc:h2:mem:testdb
spring.data.jpa.repositories.bootstrap-mode=default
spring.jpa.show-sql=true
spring.h2.console.enabled=true
12 changes: 0 additions & 12 deletions src/main/resources/application.yml

This file was deleted.

14 changes: 0 additions & 14 deletions src/main/resources/db/migration/V1__init.sql

This file was deleted.

39 changes: 0 additions & 39 deletions src/main/resources/db/migration/V2__initial_data_structures.sql

This file was deleted.