package com.srh.api.controller; import com.srh.api.dto.resource.ItemDto; import com.srh.api.dto.resource.ProjectDto; import com.srh.api.dto.resource.ProjectForm; import com.srh.api.hypermedia.ItemModelAssembler; import com.srh.api.hypermedia.ProjectModelAssembler; import com.srh.api.model.Item; import com.srh.api.model.Project; import com.srh.api.service.ProjectService; import com.srh.api.utils.PageUtil; import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.data.web.PagedResourcesAssembler; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.PagedModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.util.UriComponentsBuilder; import javax.transaction.Transactional; import javax.validation.Valid; import java.net.URI; import static com.srh.api.dto.resource.ProjectDto.convert; @RestController @RequestMapping("/projects") public class ProjectController { @Autowired private ProjectService projectService; @Autowired private ProjectModelAssembler projectModelAssembler; @Autowired private PagedResourcesAssembler pagedResourcesAssembler; @Autowired private PagedResourcesAssembler itemDtoPagedResourcesAssembler; @GetMapping public PagedModel> listAll(@PageableDefault(page = 0, size = 5) Pageable pageInfo) { Page projects = projectService.findAll(pageInfo); return pagedResourcesAssembler.toModel(convert(projects)); } @GetMapping("/{id}") public EntityModel find(@PathVariable Integer id) { Project project = projectService.find(id); return projectModelAssembler.toModel(new ProjectDto(project)); } @PostMapping @SneakyThrows public ResponseEntity> create(@RequestBody @Valid ProjectForm projectForm, UriComponentsBuilder uriBuilder) { Project project = projectForm.build(); Project projectPersist = projectService.save(project); URI uri = uriBuilder.path("/projects/{id}").buildAndExpand(project.getId()).toUri(); return ResponseEntity.created(uri) .body(projectModelAssembler.toModel(new ProjectDto(projectPersist))); } @PutMapping("/{id}") @Transactional @SneakyThrows public EntityModel update(@RequestBody @Valid ProjectForm projectForm, @PathVariable Integer id) { Project project = projectForm.build(); project.setId(id); project = projectService.update(project); return projectModelAssembler.toModel(new ProjectDto(project)); } @DeleteMapping("/{id}") @Transactional public ResponseEntity delete(@PathVariable Integer id) { projectService.delete(id); return ResponseEntity.noContent().build(); } @GetMapping("/{projectId}/itens") public PagedModel> findItensByProject( @PathVariable Integer projectId, @PageableDefault(page = 0, size = 5) Pageable pageInfo ) { Project project = projectService.find(projectId); PageUtil pageUtil = new PageUtil<>(pageInfo, project.getItens()); return itemDtoPagedResourcesAssembler.toModel(ItemDto.convert(pageUtil.getPage())); } }