diff --git a/src/main/java/de/szut/lf8_starter/config/SampleDataCreator.java b/src/main/java/de/szut/lf8_starter/config/SampleDataCreator.java index 9a7b889..373ea11 100644 --- a/src/main/java/de/szut/lf8_starter/config/SampleDataCreator.java +++ b/src/main/java/de/szut/lf8_starter/config/SampleDataCreator.java @@ -1,33 +1,33 @@ -package de.szut.lf8_starter.config; - - -import de.szut.lf8_starter.hello.HelloEntity; -import de.szut.lf8_starter.hello.HelloRepository; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; - -@Component -public class SampleDataCreator implements ApplicationRunner { - - private HelloRepository repository; - - public SampleDataCreator(HelloRepository repository) { - this.repository = repository; - } - - public void run(ApplicationArguments args) { - repository.save(new HelloEntity("Hallo Welt!")); - repository.save(new HelloEntity("Schöner Tag heute")); - repository.save(new HelloEntity("FooBar")); - - } - - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } - -} +package de.szut.lf8_starter.config; + + +import de.szut.lf8_starter.hello.HelloEntity; +import de.szut.lf8_starter.hello.HelloRepository; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +@Component +public class SampleDataCreator implements ApplicationRunner { + + private HelloRepository repository; + + public SampleDataCreator(HelloRepository repository) { + this.repository = repository; + } + + public void run(ApplicationArguments args) { + repository.save(new HelloEntity("Hallo Welt!")); + repository.save(new HelloEntity("Schöner Tag heute")); + repository.save(new HelloEntity("FooBar")); + + } + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + +} diff --git a/src/main/java/de/szut/lf8_starter/hello/HelloController.java b/src/main/java/de/szut/lf8_starter/hello/HelloController.java index 0f665f2..d856c2e 100644 --- a/src/main/java/de/szut/lf8_starter/hello/HelloController.java +++ b/src/main/java/de/szut/lf8_starter/hello/HelloController.java @@ -1,99 +1,99 @@ -package de.szut.lf8_starter.hello; - - -import de.szut.lf8_starter.exceptionHandling.ResourceNotFoundException; -import de.szut.lf8_starter.hello.dto.HelloCreateDto; -import de.szut.lf8_starter.hello.dto.HelloGetDto; -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 jakarta.validation.Valid; -import org.springframework.http.HttpStatus; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.stream.Collectors; - -@RestController -@RequestMapping(value = "hello") -@PreAuthorize("hasAnyAuthority('user')") -public class HelloController { - private final HelloService service; - private final HelloMapper helloMapper; - - public HelloController(HelloService service, HelloMapper mappingService) { - this.service = service; - this.helloMapper = mappingService; - } - - @Operation(summary = "creates a new hello with its id and message") - @ApiResponses(value = { - @ApiResponse(responseCode = "201", description = "created hello", - content = {@Content(mediaType = "application/json", - schema = @Schema(implementation = HelloGetDto.class))}), - @ApiResponse(responseCode = "400", description = "invalid JSON posted", - content = @Content), - @ApiResponse(responseCode = "401", description = "not authorized", - content = @Content)}) - @PostMapping - public HelloGetDto create(@RequestBody @Valid HelloCreateDto helloCreateDto) { - HelloEntity helloEntity = this.helloMapper.mapCreateDtoToEntity(helloCreateDto); - helloEntity = this.service.create(helloEntity); - return this.helloMapper.mapToGetDto(helloEntity); - } - - @Operation(summary = "delivers a list of hellos") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "list of hellos", - content = {@Content(mediaType = "application/json", - schema = @Schema(implementation = HelloGetDto.class))}), - @ApiResponse(responseCode = "401", description = "not authorized", - content = @Content)}) - @GetMapping - public List findAll() { - return this.service - .readAll() - .stream() - .map(e -> this.helloMapper.mapToGetDto(e)) - .collect(Collectors.toList()); - } - - @Operation(summary = "deletes a Hello by id") - @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "delete successful"), - @ApiResponse(responseCode = "401", description = "not authorized", - content = @Content), - @ApiResponse(responseCode = "404", description = "resource not found", - content = @Content)}) - @DeleteMapping("/{id}") - @ResponseStatus(code = HttpStatus.NO_CONTENT) - public void deleteHelloById(@PathVariable long id) { - var entity = this.service.readById(id); - if (entity == null) { - throw new ResourceNotFoundException("HelloEntity not found on id = " + id); - } else { - this.service.delete(entity); - } - } - - @Operation(summary = "find hellos by message") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "List of hellos who have the given message", - content = {@Content(mediaType = "application/json", - schema = @Schema(implementation = HelloGetDto.class))}), - @ApiResponse(responseCode = "404", description = "qualification description does not exist", - content = @Content), - @ApiResponse(responseCode = "401", description = "not authorized", - content = @Content)}) - @GetMapping("/findByMessage") - public List findAllEmployeesByQualification(@RequestParam String message) { - return this.service - .findByMessage(message) - .stream() - .map(e -> this.helloMapper.mapToGetDto(e)) - .collect(Collectors.toList()); - } -} +package de.szut.lf8_starter.hello; + + +import de.szut.lf8_starter.exceptionHandling.ResourceNotFoundException; +import de.szut.lf8_starter.hello.dto.HelloCreateDto; +import de.szut.lf8_starter.hello.dto.HelloGetDto; +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 jakarta.validation.Valid; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping(value = "hello") +@PreAuthorize("hasAnyAuthority('user')") +public class HelloController { + private final HelloService service; + private final HelloMapper helloMapper; + + public HelloController(HelloService service, HelloMapper mappingService) { + this.service = service; + this.helloMapper = mappingService; + } + + @Operation(summary = "creates a new hello with its id and message") + @ApiResponses(value = { + @ApiResponse(responseCode = "201", description = "created hello", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = HelloGetDto.class))}), + @ApiResponse(responseCode = "400", description = "invalid JSON posted", + content = @Content), + @ApiResponse(responseCode = "401", description = "not authorized", + content = @Content)}) + @PostMapping + public HelloGetDto create(@RequestBody @Valid HelloCreateDto helloCreateDto) { + HelloEntity helloEntity = this.helloMapper.mapCreateDtoToEntity(helloCreateDto); + helloEntity = this.service.create(helloEntity); + return this.helloMapper.mapToGetDto(helloEntity); + } + + @Operation(summary = "delivers a list of hellos") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "list of hellos", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = HelloGetDto.class))}), + @ApiResponse(responseCode = "401", description = "not authorized", + content = @Content)}) + @GetMapping + public List findAll() { + return this.service + .readAll() + .stream() + .map(e -> this.helloMapper.mapToGetDto(e)) + .collect(Collectors.toList()); + } + + @Operation(summary = "deletes a Hello by id") + @ApiResponses(value = { + @ApiResponse(responseCode = "204", description = "delete successful"), + @ApiResponse(responseCode = "401", description = "not authorized", + content = @Content), + @ApiResponse(responseCode = "404", description = "resource not found", + content = @Content)}) + @DeleteMapping("/{id}") + @ResponseStatus(code = HttpStatus.NO_CONTENT) + public void deleteHelloById(@PathVariable long id) { + var entity = this.service.readById(id); + if (entity == null) { + throw new ResourceNotFoundException("HelloEntity not found on id = " + id); + } else { + this.service.delete(entity); + } + } + + @Operation(summary = "find hellos by message") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "List of hellos who have the given message", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = HelloGetDto.class))}), + @ApiResponse(responseCode = "404", description = "qualification description does not exist", + content = @Content), + @ApiResponse(responseCode = "401", description = "not authorized", + content = @Content)}) + @GetMapping("/findByMessage") + public List findAllEmployeesByQualification(@RequestParam String message) { + return this.service + .findByMessage(message) + .stream() + .map(e -> this.helloMapper.mapToGetDto(e)) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/de/szut/lf8_starter/hello/HelloEntity.java b/src/main/java/de/szut/lf8_starter/hello/HelloEntity.java index 1b42cfc..f238e2f 100644 --- a/src/main/java/de/szut/lf8_starter/hello/HelloEntity.java +++ b/src/main/java/de/szut/lf8_starter/hello/HelloEntity.java @@ -1,27 +1,27 @@ -package de.szut.lf8_starter.hello; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Setter -@Entity -@Table(name = "hello") -public class HelloEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; - - private String message; - - public HelloEntity(String message) { - this.message = message; - } -} - +package de.szut.lf8_starter.hello; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "hello") +public class HelloEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + private String message; + + public HelloEntity(String message) { + this.message = message; + } +} + diff --git a/src/main/java/de/szut/lf8_starter/hello/HelloMapper.java b/src/main/java/de/szut/lf8_starter/hello/HelloMapper.java index d4feb7e..5639671 100644 --- a/src/main/java/de/szut/lf8_starter/hello/HelloMapper.java +++ b/src/main/java/de/szut/lf8_starter/hello/HelloMapper.java @@ -1,20 +1,20 @@ -package de.szut.lf8_starter.hello; - - -import de.szut.lf8_starter.hello.dto.HelloCreateDto; -import de.szut.lf8_starter.hello.dto.HelloGetDto; -import org.springframework.stereotype.Service; - -@Service -public class HelloMapper { - - public HelloGetDto mapToGetDto(HelloEntity entity) { - return new HelloGetDto(entity.getId(), entity.getMessage()); - } - - public HelloEntity mapCreateDtoToEntity(HelloCreateDto dto) { - var entity = new HelloEntity(); - entity.setMessage(dto.getMessage()); - return entity; - } -} +package de.szut.lf8_starter.hello; + + +import de.szut.lf8_starter.hello.dto.HelloCreateDto; +import de.szut.lf8_starter.hello.dto.HelloGetDto; +import org.springframework.stereotype.Service; + +@Service +public class HelloMapper { + + public HelloGetDto mapToGetDto(HelloEntity entity) { + return new HelloGetDto(entity.getId(), entity.getMessage()); + } + + public HelloEntity mapCreateDtoToEntity(HelloCreateDto dto) { + var entity = new HelloEntity(); + entity.setMessage(dto.getMessage()); + return entity; + } +} diff --git a/src/main/java/de/szut/lf8_starter/hello/HelloRepository.java b/src/main/java/de/szut/lf8_starter/hello/HelloRepository.java index 77c76e4..a030a27 100644 --- a/src/main/java/de/szut/lf8_starter/hello/HelloRepository.java +++ b/src/main/java/de/szut/lf8_starter/hello/HelloRepository.java @@ -1,12 +1,12 @@ -package de.szut.lf8_starter.hello; - - -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface HelloRepository extends JpaRepository { - - - List findByMessage(String message); -} +package de.szut.lf8_starter.hello; + + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface HelloRepository extends JpaRepository { + + + List findByMessage(String message); +} diff --git a/src/main/java/de/szut/lf8_starter/hello/HelloService.java b/src/main/java/de/szut/lf8_starter/hello/HelloService.java index eb254e8..b608ee2 100644 --- a/src/main/java/de/szut/lf8_starter/hello/HelloService.java +++ b/src/main/java/de/szut/lf8_starter/hello/HelloService.java @@ -1,40 +1,40 @@ -package de.szut.lf8_starter.hello; - -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -@Service -public class HelloService { - private final HelloRepository repository; - - public HelloService(HelloRepository repository) { - this.repository = repository; - } - - public HelloEntity create(HelloEntity entity) { - return this.repository.save(entity); - } - - public List readAll() { - return this.repository.findAll(); - } - - public HelloEntity readById(long id) { - Optional optionalQualification = this.repository.findById(id); - if (optionalQualification.isEmpty()) { - return null; - } - return optionalQualification.get(); - } - - - public void delete(HelloEntity entity) { - this.repository.delete(entity); - } - - public List findByMessage(String message) { - return this.repository.findByMessage(message); - } -} +package de.szut.lf8_starter.hello; + +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class HelloService { + private final HelloRepository repository; + + public HelloService(HelloRepository repository) { + this.repository = repository; + } + + public HelloEntity create(HelloEntity entity) { + return this.repository.save(entity); + } + + public List readAll() { + return this.repository.findAll(); + } + + public HelloEntity readById(long id) { + Optional optionalQualification = this.repository.findById(id); + if (optionalQualification.isEmpty()) { + return null; + } + return optionalQualification.get(); + } + + + public void delete(HelloEntity entity) { + this.repository.delete(entity); + } + + public List findByMessage(String message) { + return this.repository.findByMessage(message); + } +} diff --git a/src/main/java/de/szut/lf8_starter/hello/dto/HelloCreateDto.java b/src/main/java/de/szut/lf8_starter/hello/dto/HelloCreateDto.java index fe47d1e..e0622d5 100644 --- a/src/main/java/de/szut/lf8_starter/hello/dto/HelloCreateDto.java +++ b/src/main/java/de/szut/lf8_starter/hello/dto/HelloCreateDto.java @@ -1,20 +1,20 @@ -package de.szut.lf8_starter.hello.dto; - -import com.fasterxml.jackson.annotation.JsonCreator; -import jakarta.validation.constraints.Size; -import lombok.Getter; -import lombok.Setter; - - -@Getter -@Setter -public class HelloCreateDto { - - @Size(min = 3, message = "at least length of 3") - private String message; - - @JsonCreator - public HelloCreateDto(String message) { - this.message = message; - } -} +package de.szut.lf8_starter.hello.dto; + +import com.fasterxml.jackson.annotation.JsonCreator; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class HelloCreateDto { + + @Size(min = 3, message = "at least length of 3") + private String message; + + @JsonCreator + public HelloCreateDto(String message) { + this.message = message; + } +} diff --git a/src/main/java/de/szut/lf8_starter/hello/dto/HelloGetDto.java b/src/main/java/de/szut/lf8_starter/hello/dto/HelloGetDto.java index babac4f..1cc51b2 100644 --- a/src/main/java/de/szut/lf8_starter/hello/dto/HelloGetDto.java +++ b/src/main/java/de/szut/lf8_starter/hello/dto/HelloGetDto.java @@ -1,17 +1,17 @@ -package de.szut.lf8_starter.hello.dto; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -@AllArgsConstructor -@Getter -@Setter -public class HelloGetDto { - - private long id; - - private String message; - -} - +package de.szut.lf8_starter.hello.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@AllArgsConstructor +@Getter +@Setter +public class HelloGetDto { + + private long id; + + private String message; + +} + diff --git a/src/main/java/de/szut/lf8_starter/project/action/UpdateProjectAction.java b/src/main/java/de/szut/lf8_starter/project/action/UpdateProjectAction.java index 1e94754..e145837 100644 --- a/src/main/java/de/szut/lf8_starter/project/action/UpdateProjectAction.java +++ b/src/main/java/de/szut/lf8_starter/project/action/UpdateProjectAction.java @@ -5,6 +5,11 @@ import de.szut.lf8_starter.project.ProjectMapper; import de.szut.lf8_starter.project.ProjectService; import de.szut.lf8_starter.project.dto.GetProjectDto; import de.szut.lf8_starter.project.dto.UpdateProjectDto; +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 jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -23,6 +28,12 @@ public class UpdateProjectAction { this.projectMapper = mappingService; } + @Operation(summary = "Update a project by ID") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Project updated successfully", + content = @Content(mediaType = "application/json", schema = @Schema(implementation = GetProjectDto.class))), + @ApiResponse(responseCode = "404", description = "Project not found", content = @Content) + }) @PutMapping("/{id}") public ResponseEntity updateSupplier(@PathVariable Long id, @Valid @RequestBody UpdateProjectDto updateProjectDto) { Optional project = this.projectService.findById(id); diff --git a/src/test/java/de/szut/lf8_starter/integration/project/UpdateProjectActionTest.java b/src/test/java/de/szut/lf8_starter/integration/project/UpdateProjectActionTest.java new file mode 100644 index 0000000..795d0bb --- /dev/null +++ b/src/test/java/de/szut/lf8_starter/integration/project/UpdateProjectActionTest.java @@ -0,0 +1,87 @@ +package de.szut.lf8_starter.integration.project; + +import de.szut.lf8_starter.project.ProjectEntity; +import de.szut.lf8_starter.project.ProjectRepository; +import org.json.JSONObject; +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.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.is; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +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 UpdateProjectActionTest { + @Autowired + private MockMvc mockMvc; + @Autowired + private ProjectRepository projectRepository; + + @Test + void updateProjectTest() throws Exception { + ProjectEntity 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); + + String content = """ + { + "name": "updatedName", + "leading_employee": 2, + "employees": [3, 4, 5], + "contractor": 6, + "contractor_name": "Updated Contractor name", + "comment": "new goal of project", + "start_date": "01.01.2021", + "planned_end_date": "01.01.2022" + } + """; + + final var contentAsString = this.mockMvc.perform( + put("/projects/1").content(content).contentType(MediaType.APPLICATION_JSON) + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("name", is("updatedName"))) + .andExpect(jsonPath("leading_employee", is(2))) + .andExpect(jsonPath("employees", is(Arrays.asList(3, 4, 5)))) + .andExpect(jsonPath("contractor", is(6))) + .andExpect(jsonPath("contractor_name", is("Updated Contractor name"))) + .andExpect(jsonPath("comment", is("new goal of project"))) + .andExpect(jsonPath("start_date", is("01.01.2021"))) + .andExpect(jsonPath("planned_end_date", is("01.01.2022"))) + .andReturn() + .getResponse() + .getContentAsString(); + + final var id = Long.parseLong(new JSONObject(contentAsString).get("id").toString()); + + final var existingProject = this.projectRepository.findById(id); + assertThat(existingProject.get().getName()).isEqualTo("updatedName"); + assertThat(existingProject.get().getLeadingEmployee()).isEqualTo(2); + assertThat(existingProject.get().getContractor()).isEqualTo(6); + assertThat(existingProject.get().getContractorName()).isEqualTo("Updated Contractor name"); + assertThat(existingProject.get().getComment()).isEqualTo("new goal of project"); + assertThat(existingProject.get().getStartDate()).isEqualTo(LocalDate.of(2021, 1, 1)); + assertThat(existingProject.get().getPlannedEndDate()).isEqualTo(LocalDate.of(2022, 1, 1)); + + } +}