Merge pull request 'feat: Closes #50' (#91) from 3002833/Backend:main into restfull

Reviewed-on: Maradona/Backend#91
pull/1/head
David Hess 2024-11-11 18:30:01 +01:00
commit 09685f645c
6 changed files with 129 additions and 4 deletions

View File

@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.maradona.backend.entities.Employee;
import com.maradona.backend.entities.Project;
import com.maradona.backend.services.actions.ProjectActions;
import com.maradona.backend.services.details.ProjectDetails;
@ -24,10 +25,12 @@ import com.maradona.backend.services.details.ProjectDetails;
* List of endpoints:
* - GET /api/project
* - GET /api/project/all
* - GET /api/project/from-user
* - GET /api/project/participant/all
* - POST /api/project
* - PUT /api/project
* - PUT /api/project/participant
* - DELETE /api/project
* - DELETE /api/project/participant
*
* @see com.maradona.backend.entities.Project
* @see com.maradona.backend.services.actions.ProjectActions
@ -77,6 +80,18 @@ public class ProjectController {
return ResponseEntity.ok(projectDetails.getProjectsByEid(eid));
}
/**
* Returns a list of employees that participate in a given project.
*
* @param pid ID of the project
* @return list of employees
* @see com.maradona.backend.entities.Employee
*/
@GetMapping("/participant/all")
public ResponseEntity<Iterable<Employee>> getParticipants(@RequestParam Long pid) {
return ResponseEntity.ok(projectDetails.getProjectEmployees(pid));
}
/**
* Adds a new project to the database.
*
@ -103,6 +118,19 @@ public class ProjectController {
return ResponseEntity.ok(updatedProject);
}
/**
* Adds an employee to a project. The employee is identified by their ID.
*
* @param pid The ID of the project
* @param eid The ID of the employee
* @return
*/
@PutMapping("/participant")
public ResponseEntity<Void> addParticipant(@RequestParam Long pid, @RequestParam Long eid) {
projectActions.addEmployeeToProject(pid, eid);
return ResponseEntity.noContent().build();
}
/**
* Deletes a project from the database.
*
@ -115,4 +143,18 @@ public class ProjectController {
projectActions.deleteProject(pid);
return ResponseEntity.noContent().build();
}
/**
* Removes an employee from a project. The employee is identified by their ID.
*
* @param pid The ID of the project
* @param eid The ID of the employee
* @return HTTP status indicating the outcome of the operation
* @see com.maradona.backend.entities.Project
*/
@DeleteMapping("/participant")
public ResponseEntity<Void> removeParticipant(@RequestParam Long pid, @RequestParam Long eid) {
projectActions.removeEmployeeFromProject(pid, eid);
return ResponseEntity.noContent().build();
}
}

View File

@ -24,7 +24,7 @@ public class Employee {
private String lastName;
@ManyToOne
@JoinColumn(name = "fid")
@JoinColumn(name = "form_of_address_fid")
private FormOfAddress formOfAddress;
private LocalTime dStart;
@ -34,6 +34,10 @@ public class Employee {
@JsonManagedReference
private List<EmployeeSecondarySkill> secondarySkills;
@ManyToMany
@JoinTable(name = "employee_project", joinColumns = @JoinColumn(name = "employee_eid"), inverseJoinColumns = @JoinColumn(name = "project_pid"))
private List<Project> projects;
public void setEid(Long eid) {
this.eid = eid;
}

View File

@ -1,5 +1,7 @@
package com.maradona.backend.entities;
import java.util.List;
import jakarta.persistence.*;
import lombok.Data;
@ -14,6 +16,9 @@ public class FormOfAddress {
@Column(nullable = false, length = 50)
private String description;
@OneToMany(mappedBy = "formOfAddress")
private List<Employee> employees;
public void setFid(Long fid) {
this.fid = fid;
}
@ -29,4 +34,12 @@ public class FormOfAddress {
public String getDescription() {
return description;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
public List<Employee> getEmployees() {
return employees;
}
}

View File

@ -3,6 +3,7 @@ package com.maradona.backend.entities;
import jakarta.persistence.*;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
@Entity
@Data
@ -15,6 +16,9 @@ public class Project {
@Column(nullable = false, length = 255)
private String name;
@ManyToMany(mappedBy = "projects")
private List<Employee> employees;
private LocalDate startDate;
private LocalDate endDate;
@ -39,6 +43,14 @@ public class Project {
return name;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
public Iterable<Employee> getEmployees() {
return employees;
}
public void setStartDate(LocalDate startDate) {
this.startDate = startDate;
}

View File

@ -1,9 +1,15 @@
package com.maradona.backend.services.actions;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.maradona.backend.entities.Employee;
import com.maradona.backend.entities.Project;
import com.maradona.backend.repositories.ProjectRepository;
import com.maradona.backend.services.details.EmployeeDetails;
import com.maradona.backend.services.details.ProjectDetails;
@Service
public class ProjectActions {
@ -11,6 +17,12 @@ public class ProjectActions {
@Autowired
private ProjectRepository projectRepository;
@Autowired
private ProjectDetails projectDetails;
@Autowired
private EmployeeDetails employeeDetails;
public Project saveProject(Project project) {
return projectRepository.save(project);
}
@ -23,4 +35,28 @@ public class ProjectActions {
}
}
}
public void addEmployeeToProject(Long pid, Long eid) {
var project = projectDetails.getProjectByPid(pid).orElse(null);
var newEmployee = employeeDetails.getEmployeeByEid(eid).orElse(null);
var oldEmployees = project.getEmployees();
var employeeList = new ArrayList<Employee>();
for (Employee currentEmployee : oldEmployees) {
employeeList.add(currentEmployee);
}
employeeList.add(newEmployee);
project.setEmployees(employeeList);
}
public void removeEmployeeFromProject(Long pid, Long eid) {
var project = projectDetails.getProjectByPid(pid).orElse(null);
var oldEmployees = project.getEmployees();
var employeeList = new ArrayList<Employee>();
for (Employee currentEmployee : oldEmployees) {
if (!currentEmployee.getEid().equals(eid)) {
employeeList.add(currentEmployee);
}
}
project.setEmployees(employeeList);
}
}

View File

@ -2,9 +2,12 @@ package com.maradona.backend.services.details;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.maradona.backend.entities.Employee;
import com.maradona.backend.entities.Project;
import com.maradona.backend.repositories.ProjectRepository;
import java.util.ArrayList;
import java.util.Optional;
@Service
@ -27,8 +30,23 @@ public class ProjectDetails {
return projectRepository.findAll();
}
public Iterable<Employee> getProjectEmployees(Long pid) {
var project = getProjectByPid(pid).orElse(null);
var employees = project.getEmployees();
return employees;
}
public Iterable<Project> getProjectsByEid(Long eid) {
// TODO: Actually filter by user
return projectRepository.findAll();
var projects = projectRepository.findAll();
var employeeProjects = new ArrayList<Project>();
for (Project project : projects) {
var employees = project.getEmployees();
for (Employee employee : employees) {
if (employee.getEid().equals(eid)) {
employeeProjects.add(project);
}
}
}
return employeeProjects;
}
}