diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 65a2f44..f100c6e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,6 +4,8 @@ name: Build and Test Spring Boot HATEOAS on: push: branches: [ main ] + pull_request: + branches: [ main ] workflow_dispatch: jobs: diff --git a/.gitignore b/.gitignore index 98b42d1..f85b508 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ target/ .mvn/ mvnw mvnw.cmd +bin/ ### STS ### .apt_generated diff --git a/README.md b/README.md index d7f8204..d9fe604 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,14 @@ Demonstração do uso de HATEOAS para um projeto Springboot REST +## Frontend + +### Home Message + +* Indice + + http://localhost:8080/ + ## Endpoints API ### Home Message diff --git a/pom.xml b/pom.xml index a249a4f..cc509b6 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,12 @@ runtime + + + org.springframework.boot + spring-boot-starter-thymeleaf + + org.projectlombok lombok diff --git a/src/main/java/com/pro/api/HomeApi.java b/src/main/java/com/pro/api/HomeApi.java index 67cdfcc..7573e0f 100644 --- a/src/main/java/com/pro/api/HomeApi.java +++ b/src/main/java/com/pro/api/HomeApi.java @@ -38,7 +38,7 @@ public class HomeApi { @GetMapping({ "", "/", "/index" }) public EntityModel index() { - HomeDTO homeDto = new HomeDTO("Springboot HATEOAS Home | Index"); + HomeDTO homeDto = new HomeDTO("Springboot HATEOAS API Home | Index"); return EntityModel.of(homeDto, WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(HomeApi.class).index()).withSelfRel()); @@ -69,10 +69,10 @@ public CollectionModel> getAllMessagesAssembler() { } @GetMapping("/messages/pag") - public CollectionModel> getAllMessages(@RequestParam int page, @RequestParam int size) { + public CollectionModel> getAllMessages(@RequestParam String searchText, @RequestParam int page, @RequestParam int size) { Pageable pageable = PageRequest.of(page, size); - Page pageResult = homeService.getAllMessages(pageable); + Page pageResult = homeService.getAllMessages(pageable, searchText); List> userResources = pageResult.stream().map(homeDTOAssembler::toModel) .collect(Collectors.toList()); @@ -81,15 +81,15 @@ public CollectionModel> getAllMessages(@RequestParam int pa //lembrar de adicionar o self a paginação tambem collectionModel.add(WebMvcLinkBuilder.linkTo( - WebMvcLinkBuilder.methodOn(HomeApi.class).getAllMessages(page, size)).withSelfRel()); + WebMvcLinkBuilder.methodOn(HomeApi.class).getAllMessages(searchText, page, size)).withSelfRel()); if (pageResult.hasNext()) { collectionModel.add(WebMvcLinkBuilder.linkTo( - WebMvcLinkBuilder.methodOn(HomeApi.class).getAllMessages(page + 1, size)).withRel("next")); + WebMvcLinkBuilder.methodOn(HomeApi.class).getAllMessages(searchText, page + 1, size)).withRel("next")); } if (pageResult.hasPrevious()) { collectionModel.add(WebMvcLinkBuilder.linkTo( - WebMvcLinkBuilder.methodOn(HomeApi.class).getAllMessages(page - 1, size)).withRel("prev")); + WebMvcLinkBuilder.methodOn(HomeApi.class).getAllMessages(searchText, page - 1, size)).withRel("prev")); } return collectionModel; diff --git a/src/main/java/com/pro/controller/HomeController.java b/src/main/java/com/pro/controller/HomeController.java new file mode 100644 index 0000000..db6356d --- /dev/null +++ b/src/main/java/com/pro/controller/HomeController.java @@ -0,0 +1,53 @@ +package com.pro.controller; + +import java.util.Map; + +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.RestTemplate; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Controller +@RequestMapping({ "", "/" }) +public class HomeController { + + private final RestTemplate restTemplate; + + public HomeController(RestTemplateBuilder builder) { + this.restTemplate = builder.build(); + } + + @RequestMapping(value = { "", "/", "/home", "/index" }, method = { RequestMethod.GET, RequestMethod.POST }) + public String index(Model model, + @RequestParam(defaultValue = "") String searchText, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "3") int size) { + log.info("----- Springboot HATEOAS Controller Home | Index -----"); + + String url = "http://localhost:8080/api/messages/pag?page="+ page + "&size=" + size + "&searchText=" + searchText; + +// if (searchText != null && !searchText.isEmpty()) { +// url += "&searchText=" + searchText; +// } + + ParameterizedTypeReference> typeRef = new ParameterizedTypeReference>() {}; + + ResponseEntity> response = restTemplate.exchange(url, HttpMethod.GET ,null ,typeRef); + + Map body = response.getBody(); + + model.addAttribute("apiResponse", body); + model.addAttribute("searchText", searchText); + model.addAttribute("index", true); + return "web/home/home"; + } +} \ No newline at end of file diff --git a/src/main/java/com/pro/dto/assembler/HomeCollectionAssembler.java b/src/main/java/com/pro/dto/assembler/HomeCollectionAssembler.java index 3d14176..25b03ee 100644 --- a/src/main/java/com/pro/dto/assembler/HomeCollectionAssembler.java +++ b/src/main/java/com/pro/dto/assembler/HomeCollectionAssembler.java @@ -22,13 +22,13 @@ public HomeCollectionAssembler(HomeDTOAssembler homeDTOAssembler) { this.homeDTOAssembler = homeDTOAssembler; } - public CollectionModel> toCollectionModel(Iterable entities, int page, int size) { + public CollectionModel> toCollectionModel(Iterable entities, String searchText, int page, int size) { List> entityModels = StreamSupport.stream(entities.spliterator(), false) .map(homeDTOAssembler::toModel) // Usa o assembler do item para cada item .collect(Collectors.toList()); // Link 'self' para a coleção de recursos return CollectionModel.of(entityModels, - WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(HomeApi.class).getAllMessages(page, size)).withSelfRel()); + WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(HomeApi.class).getAllMessages(searchText, page, size)).withSelfRel()); } } \ No newline at end of file diff --git a/src/main/java/com/pro/service/HomeService.java b/src/main/java/com/pro/service/HomeService.java index f4a2beb..c61fc95 100644 --- a/src/main/java/com/pro/service/HomeService.java +++ b/src/main/java/com/pro/service/HomeService.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -15,15 +16,22 @@ public class HomeService { private List homeDtoList; - public HomeService() { - init(); - } +// public HomeService() { +// init(); +// } public List getAllMessages() { return homeDtoList; } - public Page getAllMessages(Pageable pageable) { + public Page getAllMessages(Pageable pageable, String searchText) { + init(); + if (searchText != null && !searchText.isEmpty()) { + homeDtoList = homeDtoList.stream() + .filter(homeDTO -> homeDTO.getMessage().toLowerCase().contains(searchText.toLowerCase())) + .collect(Collectors.toList()); + } + int start = (int) pageable.getOffset(); int end = Math.min((start + pageable.getPageSize()), homeDtoList.size()); @@ -34,27 +42,10 @@ public Page getAllMessages(Pageable pageable) { private void init() { homeDtoList = new ArrayList(); - - HomeDTO m1 = new HomeDTO("mensagem 1"); - HomeDTO m2 = new HomeDTO("mensagem 2"); - HomeDTO m3 = new HomeDTO("mensagem 3"); - HomeDTO m4 = new HomeDTO("mensagem 4"); - HomeDTO m5 = new HomeDTO("mensagem 5"); - HomeDTO m6 = new HomeDTO("mensagem 6"); - HomeDTO m7 = new HomeDTO("mensagem 7"); - HomeDTO m8 = new HomeDTO("mensagem 8"); - HomeDTO m9 = new HomeDTO("mensagem 9"); - HomeDTO m10 = new HomeDTO("mensagem 10"); - - homeDtoList.add(m1); - homeDtoList.add(m2); - homeDtoList.add(m3); - homeDtoList.add(m4); - homeDtoList.add(m5); - homeDtoList.add(m6); - homeDtoList.add(m7); - homeDtoList.add(m8); - homeDtoList.add(m9); - homeDtoList.add(m10); + + for (int i=1; i<=10; i++) { + HomeDTO m = new HomeDTO("mensagem " + i); + homeDtoList.add(m); + } } } \ No newline at end of file diff --git a/src/main/resources/templates/web/home/home-old.html b/src/main/resources/templates/web/home/home-old.html new file mode 100644 index 0000000..ff05c13 --- /dev/null +++ b/src/main/resources/templates/web/home/home-old.html @@ -0,0 +1,89 @@ + + + + + + + + + + + + Home | Inicio + + + + + + +
+

Home | Início

+
+ +
+ +
+

Lista de Mensagens

+ + +
+
+ +
+
+ +
+
+ + +
    +
  • + + +
  • +
+ + +
+ Nenhuma mensagem encontrada. +
+ + + +
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/web/home/home.html b/src/main/resources/templates/web/home/home.html new file mode 100644 index 0000000..14547af --- /dev/null +++ b/src/main/resources/templates/web/home/home.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + Home | Inicio + + + + + + +
+

Home | Início

+
+ +
+ + +
+ +

Lista de Mensagens

+ + +
+ +
+ +
+ +
+ +
+ +
+ + +
    + +
  • + + + + +
  • + +
+ + +
+ Nenhuma mensagem encontrada. +
+ + + + +
+
+ + \ No newline at end of file