diff --git a/api/pmt.yml b/api/pmt.yml index e2318d9..0e803c0 100644 --- a/api/pmt.yml +++ b/api/pmt.yml @@ -210,3 +210,34 @@ paths: type: string 500: $ref: "#/components/responses/InternalError" + + /project/{id}/employee/{employeeId}: + delete: + operationId: "removeEmployeeFromProject" + description: "Removes an employee from a Project" + parameters: + - in: path + name: id + schema: + type: integer + format: int64 + required: true + - in: path + name: employeeId + schema: + type: integer + format: int64 + required: true + responses: + 204: + description: "Deletes the employee from the Project" + 401: + $ref: "#/components/responses/Unauthorized" + 404: + $ref: "#/components/responses/NotFound" + 409: + $ref: "#/components/responses/Conflict" + 500: + $ref: "#/components/responses/InternalError" + 503: + $ref: "#/components/responses/ServiceUnavailable" diff --git a/src/main/java/de/hmmh/pmt/ApiController.java b/src/main/java/de/hmmh/pmt/ApiController.java index 44205b5..5d2a8f4 100644 --- a/src/main/java/de/hmmh/pmt/ApiController.java +++ b/src/main/java/de/hmmh/pmt/ApiController.java @@ -1,12 +1,11 @@ package de.hmmh.pmt; import com.fasterxml.jackson.databind.ObjectMapper; -import de.hmmh.pmt.db.Allocation; -import de.hmmh.pmt.db.AllocationRepository; -import de.hmmh.pmt.db.Project; -import de.hmmh.pmt.db.ProjectRepository; + +import de.hmmh.pmt.db.*; import de.hmmh.pmt.dtos.*; import de.hmmh.pmt.employee.ApiClientFactory; +import de.hmmh.pmt.employee.api.EmployeeControllerApi; import de.hmmh.pmt.employee.dtos.EmployeeResponseDTO; import de.hmmh.pmt.oas.DefaultApi; import de.hmmh.pmt.util.Mapper; @@ -143,4 +142,15 @@ public class ApiController implements DefaultApi { return new ResponseEntity<>(HttpStatus.NO_CONTENT); } + + @Override + public ResponseEntity removeEmployeeFromProject(Long id, Long employeeId){ + Optional allocation = allocationRepository.findById(new AllocationId(id, employeeId)); + if (allocation.isEmpty()){ + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + allocationRepository.delete(allocation.get()); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } } diff --git a/src/main/java/de/hmmh/pmt/db/AllocationRepository.java b/src/main/java/de/hmmh/pmt/db/AllocationRepository.java index dcbc9d3..f10e765 100644 --- a/src/main/java/de/hmmh/pmt/db/AllocationRepository.java +++ b/src/main/java/de/hmmh/pmt/db/AllocationRepository.java @@ -7,4 +7,5 @@ import java.util.List; public interface AllocationRepository extends JpaRepository { List findAllByEmployeeId(Long employeeId); + List findAllByProjectId(Long projectId); } diff --git a/src/test/java/de/hmmh/pmt/IntegrationTest.java b/src/test/java/de/hmmh/pmt/IntegrationTest.java index 91852a4..65e98f0 100644 --- a/src/test/java/de/hmmh/pmt/IntegrationTest.java +++ b/src/test/java/de/hmmh/pmt/IntegrationTest.java @@ -164,6 +164,13 @@ public abstract class IntegrationTest { allocation1ToOverlapA.setEmployeeId(TEST_EMPLOYEE_A_ID); allocation1ToOverlapA.setRole(TEST_QUALIFICATION_A_ID); allocations.put("1>overlap-a", allocation1ToOverlapA); + + + Allocation allocation1ToSpaceStation = new Allocation(); + allocation1ToSpaceStation.setProject(allProjects.get("space-station")); + allocation1ToSpaceStation.setEmployeeId(TEST_EMPLOYEE_A_ID); + allocation1ToSpaceStation.setRole(TEST_QUALIFICATION_A_ID); + allocations.put("1>space-station", allocation1ToSpaceStation); allocationRepository.saveAllAndFlush(allocations.values()); return allocations; diff --git a/src/test/java/de/hmmh/pmt/project/DeleteEmployeeTest.java b/src/test/java/de/hmmh/pmt/project/DeleteEmployeeTest.java new file mode 100644 index 0000000..294dd90 --- /dev/null +++ b/src/test/java/de/hmmh/pmt/project/DeleteEmployeeTest.java @@ -0,0 +1,59 @@ +package de.hmmh.pmt.project; + +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.Map; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.RequestBuilder; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.web.client.HttpClientErrorException; + +import de.hmmh.pmt.IntegrationTest; +import de.hmmh.pmt.db.Allocation; +import de.hmmh.pmt.db.Project; +import de.hmmh.pmt.dtos.AddEmployeeDTO; + +public class DeleteEmployeeTest extends IntegrationTest { + @Test + void shouldNotDeleteEmployeeWhenProjectIsNotFound() throws Exception { + mvc + .perform(delete(baseUri + "/project/1")) + .andExpect(status().isNotFound()) + ; + } + + @Test + void shouldNotDeleteEmployeeWhenEmployeeIsNotAllocated() throws Exception { + when(this.mockEmployeeApi.findById(Mockito.anyLong())) + .thenThrow(new HttpClientErrorException(HttpStatus.NOT_FOUND)); + + Map allProjects = createTestProjectData(); + + this.mvc + .perform(getRequest(allProjects.get("research-lab").getId(), 0L)) + .andExpect(status().isNotFound()); + } + + @Test + void employeeSuccessfullyDeletedFromProject() throws Exception { + Map allProjects = createTestProjectData(); + Map allAllocations = createTestAllocationData(allProjects); + Allocation allocation = allAllocations.get("1>space-station"); + + this.mvc + .perform(getRequest(allocation.getProjectId(),allocation.getEmployeeId())) + .andExpect(status().isNoContent()); + + } + + private RequestBuilder getRequest(Long projectId, Long employeeId) { + return MockMvcRequestBuilders + .delete(baseUri + "/project/" + projectId + "/employee/" + employeeId); + } +}