diff --git a/README.md b/README.md index d9fe604..0ebbd66 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,12 @@ Demonstração do uso de HATEOAS para um projeto Springboot REST http://localhost:8080/ +### Products + +* CRUD Products + + http://localhost:8080/products + ## Endpoints API ### Home Message diff --git a/src/main/java/com/pro/api/ProductController.java b/src/main/java/com/pro/api/ProductApi.java similarity index 85% rename from src/main/java/com/pro/api/ProductController.java rename to src/main/java/com/pro/api/ProductApi.java index 9fbcc34..a768cc3 100644 --- a/src/main/java/com/pro/api/ProductController.java +++ b/src/main/java/com/pro/api/ProductApi.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -23,7 +24,7 @@ @RestController @RequestMapping("/api/products") -public class ProductController { +public class ProductApi { @Autowired private ProductRepository productRepository; @@ -46,7 +47,13 @@ public CollectionModel> getAllProducts() { List> products = productRepository.findAll().stream().map(productDTOAssembler::toModel) .collect(Collectors.toList()); - return CollectionModel.of(products); + CollectionModel> collection = CollectionModel.of(products); + + collection.add(WebMvcLinkBuilder.linkTo( + WebMvcLinkBuilder.methodOn( + ProductApi.class).getAllProducts()).withSelfRel()); + + return collection; } // READ - Obter um produto específico @@ -79,7 +86,8 @@ public ResponseEntity deleteProduct(@PathVariable Long id) { .orElseThrow(() -> new RuntimeException("Produto não encontrado")); productRepository.delete(product); - //return ResponseEntity.ok("Produto excluído com sucesso"); - return null; + //return ResponseEntity.ok("Produto excluído com sucesso"); alterar para ResponseEntity + //return null; + return ResponseEntity.noContent().build(); // Retorna 204 sem conteúdo } } \ No newline at end of file diff --git a/src/main/java/com/pro/controller/ProductController.java b/src/main/java/com/pro/controller/ProductController.java new file mode 100644 index 0000000..eb9e5b1 --- /dev/null +++ b/src/main/java/com/pro/controller/ProductController.java @@ -0,0 +1,63 @@ +package com.pro.controller; + +import java.util.Map; + +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.RestTemplate; + +import com.pro.model.Product; + +@Controller +@RequestMapping("/products") +public class ProductController { + + private final RestTemplate restTemplate; + + public ProductController(RestTemplateBuilder builder) { + this.restTemplate = builder.build(); + } + + @GetMapping({"", "/"}) + public String listProducts(Model model) { + + String apiUrl = "http://localhost:8080/api/products"; + + ResponseEntity response = restTemplate.getForEntity(apiUrl, Map.class); + + model.addAttribute("apiResponse", response.getBody()); + + return "web/product/list"; + } + + @GetMapping("/edit") + public String editProduct(@RequestParam String href, Model model) { + + ResponseEntity response = restTemplate.getForEntity(href, Map.class); + + model.addAttribute("product", response.getBody()); + + return "web/product/form"; + } + + @PostMapping("/edit") + public String updateProduct(@RequestParam String href, @ModelAttribute Product product) { + restTemplate.put(href, product); // Atualiza o produto via PUT na API + return "redirect:/products"; // Redireciona para a lista de produtos + } + + @GetMapping("/delete") + public String deleteProduct(@RequestParam String href) { + + restTemplate.delete(href); + + return "redirect:/products"; + } +} \ No newline at end of file diff --git a/src/main/java/com/pro/dto/assembler/ProductDTOAssembler.java b/src/main/java/com/pro/dto/assembler/ProductDTOAssembler.java index 4a7c06c..dc1bbed 100644 --- a/src/main/java/com/pro/dto/assembler/ProductDTOAssembler.java +++ b/src/main/java/com/pro/dto/assembler/ProductDTOAssembler.java @@ -5,7 +5,7 @@ import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import org.springframework.stereotype.Component; -import com.pro.api.ProductController; +import com.pro.api.ProductApi; import com.pro.dto.ProductDTO; import com.pro.model.Product; @@ -24,18 +24,18 @@ public EntityModel toModel(Product product) { // Link self (auto referenciado) productResource.add(WebMvcLinkBuilder - .linkTo(WebMvcLinkBuilder.methodOn(ProductController.class).getProduct(product.getId())).withSelfRel()); + .linkTo(WebMvcLinkBuilder.methodOn(ProductApi.class).getProduct(product.getId())).withSelfRel()); // Link para todos os produtos productResource.add(WebMvcLinkBuilder - .linkTo(WebMvcLinkBuilder.methodOn(ProductController.class).getAllProducts()).withRel("all-products")); + .linkTo(WebMvcLinkBuilder.methodOn(ProductApi.class).getAllProducts()).withRel("all-products")); // Link para atualizar o produto (update) - productResource.add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(ProductController.class) + productResource.add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(ProductApi.class) .updateProduct(product.getId(), product)).withRel("update-product")); // Link para deletar o produto (delete) - productResource.add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(ProductController.class) + productResource.add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(ProductApi.class) .deleteProduct(product.getId())).withRel("delete-product")); return productResource; diff --git a/src/main/resources/templates/web/product/form.html b/src/main/resources/templates/web/product/form.html new file mode 100644 index 0000000..3a362be --- /dev/null +++ b/src/main/resources/templates/web/product/form.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + Home | Inicio + + + + + + +
+

Product | Início

+
+ +
+ + +
+ +

Editar Produto

+ + +
+ +

Detalhes do Produto

+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ +
+ +
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/web/product/list.html b/src/main/resources/templates/web/product/list.html new file mode 100644 index 0000000..c5b5ac0 --- /dev/null +++ b/src/main/resources/templates/web/product/list.html @@ -0,0 +1,62 @@ + + + + + + + + + + + + Home | Inicio + + + + + + +
+

Product | Início

+
+ +
+ + +
+ +

Lista de Produtos

+ +
+ Nenhum produto encontrado. +
+ +
+ +
+ +
+
+ + \ No newline at end of file