From c317b226fe7131a7c7b33076232fa74da2701e9e Mon Sep 17 00:00:00 2001 From: Phan Huy Tran Date: Wed, 2 Oct 2024 07:04:08 +0000 Subject: [PATCH] feat: Implement get project by ID Route (!25) Co-authored-by: Phan Huy Tran Reviewed-on: https://git.kjan.de/jank/LF8/pulls/25 Reviewed-by: Jan Gleytenhoover Co-authored-by: Phan Huy Tran Co-committed-by: Phan Huy Tran --- requests/getProject.http | 3 ++ .../lf8_starter/project/ProjectService.java | 12 +++++ .../{ => action}/CreateProjectAction.java | 5 +- .../GetAllProjectsAction.java} | 22 ++++---- .../project/action/GetProjectAction.java | 40 ++++++++++++++ .../project/FindProjectActionTest.java | 54 +++++++++++++++++++ 6 files changed, 126 insertions(+), 10 deletions(-) create mode 100644 requests/getProject.http rename src/main/java/de/szut/lf8_starter/project/{ => action}/CreateProjectAction.java (89%) rename src/main/java/de/szut/lf8_starter/project/{ProjectController.java => action/GetAllProjectsAction.java} (60%) create mode 100644 src/main/java/de/szut/lf8_starter/project/action/GetProjectAction.java create mode 100644 src/test/java/de/szut/lf8_starter/integration/project/FindProjectActionTest.java diff --git a/requests/getProject.http b/requests/getProject.http new file mode 100644 index 0000000..5758af5 --- /dev/null +++ b/requests/getProject.http @@ -0,0 +1,3 @@ +### GET request to example server +GET http://localhost:8080/projects/2 +Authorization: Bearer {{auth_token}} diff --git a/src/main/java/de/szut/lf8_starter/project/ProjectService.java b/src/main/java/de/szut/lf8_starter/project/ProjectService.java index 4dc8688..a815350 100644 --- a/src/main/java/de/szut/lf8_starter/project/ProjectService.java +++ b/src/main/java/de/szut/lf8_starter/project/ProjectService.java @@ -1,8 +1,10 @@ package de.szut.lf8_starter.project; +import de.szut.lf8_starter.exceptionHandling.ResourceNotFoundException; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Optional; @Service public class ProjectService { @@ -19,4 +21,14 @@ public class ProjectService { public List readAll() { return this.projectRepository.findAll(); } + + public ProjectEntity findById(Long id) { + Optional articleEntity = projectRepository.findById(id); + + if (articleEntity.isEmpty()) { + throw new ResourceNotFoundException("Project with id " + id + " not found"); + } + + return articleEntity.get(); + } } diff --git a/src/main/java/de/szut/lf8_starter/project/CreateProjectAction.java b/src/main/java/de/szut/lf8_starter/project/action/CreateProjectAction.java similarity index 89% rename from src/main/java/de/szut/lf8_starter/project/CreateProjectAction.java rename to src/main/java/de/szut/lf8_starter/project/action/CreateProjectAction.java index d54318b..3e636b5 100644 --- a/src/main/java/de/szut/lf8_starter/project/CreateProjectAction.java +++ b/src/main/java/de/szut/lf8_starter/project/action/CreateProjectAction.java @@ -1,5 +1,8 @@ -package de.szut.lf8_starter.project; +package de.szut.lf8_starter.project.action; +import de.szut.lf8_starter.project.ProjectEntity; +import de.szut.lf8_starter.project.ProjectMapper; +import de.szut.lf8_starter.project.ProjectService; import de.szut.lf8_starter.project.dto.CreateProjectDto; import de.szut.lf8_starter.project.dto.GetProjectDto; import io.swagger.v3.oas.annotations.Operation; diff --git a/src/main/java/de/szut/lf8_starter/project/ProjectController.java b/src/main/java/de/szut/lf8_starter/project/action/GetAllProjectsAction.java similarity index 60% rename from src/main/java/de/szut/lf8_starter/project/ProjectController.java rename to src/main/java/de/szut/lf8_starter/project/action/GetAllProjectsAction.java index 61ee843..039a104 100644 --- a/src/main/java/de/szut/lf8_starter/project/ProjectController.java +++ b/src/main/java/de/szut/lf8_starter/project/action/GetAllProjectsAction.java @@ -1,32 +1,36 @@ -package de.szut.lf8_starter.project; +package de.szut.lf8_starter.project.action; +import de.szut.lf8_starter.project.ProjectMapper; +import de.szut.lf8_starter.project.ProjectService; import de.szut.lf8_starter.project.dto.GetProjectDto; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping(value = "projects") -public class ProjectController { +public class GetAllProjectsAction { private final ProjectService service; private final ProjectMapper projectMapper; - public ProjectController(ProjectService service, ProjectMapper projectMapper) { + + public GetAllProjectsAction(ProjectService service, ProjectMapper projectMapper) { this.service = service; this.projectMapper = projectMapper; } @Operation(summary = "returns all projects") @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "all projects", - content = {@Content(mediaType = "application/json", - schema = @Schema(implementation = GetProjectDto.class))}), - @ApiResponse(responseCode = "401", description = "not authorized", - content = @Content)}) + @ApiResponse(responseCode = "200", description = "all projects", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = GetProjectDto.class)) + }), + @ApiResponse(responseCode = "401", description = "not authorized", content = @Content)}) @GetMapping public List findAll() { return this.service diff --git a/src/main/java/de/szut/lf8_starter/project/action/GetProjectAction.java b/src/main/java/de/szut/lf8_starter/project/action/GetProjectAction.java new file mode 100644 index 0000000..d04ac20 --- /dev/null +++ b/src/main/java/de/szut/lf8_starter/project/action/GetProjectAction.java @@ -0,0 +1,40 @@ +package de.szut.lf8_starter.project.action; + +import de.szut.lf8_starter.project.ProjectEntity; +import de.szut.lf8_starter.project.ProjectMapper; +import de.szut.lf8_starter.project.ProjectService; +import de.szut.lf8_starter.project.dto.GetProjectDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping(value = "projects") +public class GetProjectAction { + private final ProjectService projectService; + private final ProjectMapper projectMapper; + + public GetProjectAction(ProjectService projectService, ProjectMapper projectMapper) { + this.projectService = projectService; + this.projectMapper = projectMapper; + } + + @Operation(summary = "Find project by ID") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Project found", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = GetProjectDto.class)) + }), + @ApiResponse(responseCode = "404", description = "Project not found", content = @Content) + }) + @GetMapping("/{id}") + public ResponseEntity findArticleById(@PathVariable Long id) { + ProjectEntity project = this.projectService.findById(id); + + return new ResponseEntity<>(this.projectMapper.mapToGetDto(project), HttpStatus.OK); + } +} diff --git a/src/test/java/de/szut/lf8_starter/integration/project/FindProjectActionTest.java b/src/test/java/de/szut/lf8_starter/integration/project/FindProjectActionTest.java new file mode 100644 index 0000000..dacb171 --- /dev/null +++ b/src/test/java/de/szut/lf8_starter/integration/project/FindProjectActionTest.java @@ -0,0 +1,54 @@ +package de.szut.lf8_starter.integration.project; + +import de.szut.lf8_starter.project.ProjectEntity; +import de.szut.lf8_starter.project.ProjectRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +import java.time.LocalDate; +import java.util.List; + +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc(addFilters = false) +class FindProjectActionTest { + @Autowired + private MockMvc mockMvc; + @Autowired + private ProjectRepository projectRepository; + + @Test + void createProjectTest() throws Exception { + var project = new ProjectEntity(); + project.setId(1); + project.setComment("comment"); + project.setContractor(1); + project.setContractorName("contractorName"); + project.setEndDate(LocalDate.of(2024, 1, 1)); + project.setLeadingEmployee(1); + project.setName("name"); + project.setStartDate(LocalDate.of(2021, 1, 1)); + project.setEmployees(List.of(1L, 2L, 3L)); + this.projectRepository.save(project); + + this.mockMvc.perform(get("/projects/1")) + .andExpect(status().isOk()) + .andExpect(jsonPath("id").value(1)) + .andExpect(jsonPath("comment").value("comment")) + .andExpect(jsonPath("contractor").value(1)) + .andExpect(jsonPath("contractor_name").value("contractorName")) + .andExpect(jsonPath("end_date").value("01.01.2024")) + .andExpect(jsonPath("leading_employee").value(1)) + .andExpect(jsonPath("name").value("name")) + .andExpect(jsonPath("start_date").value("01.01.2021")) + .andExpect(jsonPath("employees").isArray()) + .andExpect(jsonPath("employees", hasSize(3))); + } +}