diff options
Diffstat (limited to 'src/main/java/br')
4 files changed, 173 insertions, 0 deletions
diff --git a/src/main/java/br/com/alura/DaysOfCodeSpring/ApiController.java b/src/main/java/br/com/alura/DaysOfCodeSpring/ApiController.java new file mode 100644 index 0000000..7111c5d --- /dev/null +++ b/src/main/java/br/com/alura/DaysOfCodeSpring/ApiController.java @@ -0,0 +1,69 @@ +package br.com.alura.DaysOfCodeSpring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; + +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/imdb") +public class ApiController { + + @Autowired + private imdbApiClient apiClient; + + @Value("${imdb.apiKey}") + private String apiKey; + + private List<Filme> favoritos = new ArrayList<>(); + + @GetMapping + public ModelAndView getFilmesHTML() throws Exception { + List<Filme> filmes = apiClient.getBody(apiKey); + + PrintWriter writer = new PrintWriter("src/main/resources/static/content.html"); + new HTMLGenerator(writer).generate(filmes); + writer.close(); + + return new ModelAndView("content.html"); + } + + @GetMapping("/api") + public List<Filme> getFilmes(@RequestParam(required = false) String titulo) throws Exception { + if (titulo != null) { + return apiClient.getBody(apiKey).stream().filter(f -> titulo.toLowerCase().contains(f.title.toLowerCase())).toList(); + } + return apiClient.getBody(apiKey); + } + + @PostMapping("/favoritos/{id}") + public ResponseEntity addFilmeFavorito(@PathVariable String id) throws Exception { + favoritos.addAll(apiClient.getBody(apiKey).stream().filter(f -> id.equals(f.id)).toList()); + return ResponseEntity.ok().build(); + } + + @GetMapping("/favoritos") + public List<Filme> getFilmesFavoritos() { + return favoritos; + } + + @GetMapping("/favoritos/{id}") + public List<Filme> getFilmeFavorito(@PathVariable String id) { + List<Filme> filme = favoritos.stream().filter(f -> id.equals(f.id)).toList(); + return filme; + } + + @DeleteMapping("/favoritos/{id}") + public List<Filme> deleteFilmeFavoritos(@PathVariable String id) { + favoritos.removeAll(favoritos.stream().filter(f -> id.equals(f.id)).toList()); + return favoritos; + } + + record Filme(String id, Long rank, String title, String fullTitle, String year, String image, String crew, String imDbRating, Long imDbRatingCount){} + +} diff --git a/src/main/java/br/com/alura/DaysOfCodeSpring/Application.java b/src/main/java/br/com/alura/DaysOfCodeSpring/Application.java new file mode 100644 index 0000000..c016fa1 --- /dev/null +++ b/src/main/java/br/com/alura/DaysOfCodeSpring/Application.java @@ -0,0 +1,22 @@ +package br.com.alura.DaysOfCodeSpring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +@SpringBootApplication +public class Application { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/src/main/java/br/com/alura/DaysOfCodeSpring/HTMLGenerator.java b/src/main/java/br/com/alura/DaysOfCodeSpring/HTMLGenerator.java new file mode 100644 index 0000000..9e3e42b --- /dev/null +++ b/src/main/java/br/com/alura/DaysOfCodeSpring/HTMLGenerator.java @@ -0,0 +1,55 @@ +package br.com.alura.DaysOfCodeSpring; + +import java.io.PrintWriter; +import java.util.List; + +public class HTMLGenerator { + private PrintWriter writer; + + public HTMLGenerator(PrintWriter writer) { + this.writer = writer; + } + + private String head = + """ + <html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous"s> + <link href="./main.css" rel="stylesheet"> + </head> + """; + + private String card = + """ + <div class="card text-white bg-dark mb-3" style="max-width: 12rem;"> + <h4 class="card-header">%s</h4> + <div class="card-body"> + <img class="card-img" src="%s" alt="%ss"> + <p class="card-text mt-2">Nota: %s - Ano: %s</p> + </div> + </div> + """; + + public void generate(List<ApiController.Filme> filmes) { + writer.println(head); + + writer.println(""" + <body> + <h1 class="title">IMDb</h1> + <div class="content"> + """); + + filmes.forEach(filme -> { + writer.println(String.format(card, filme.title(), filme.image(), filme.title(), filme.imDbRating(), filme.year())); + }); + + writer.println( + """ + </div> + </body> + </html> + """); + } +} diff --git a/src/main/java/br/com/alura/DaysOfCodeSpring/imdbApiClient.java b/src/main/java/br/com/alura/DaysOfCodeSpring/imdbApiClient.java new file mode 100644 index 0000000..d7db714 --- /dev/null +++ b/src/main/java/br/com/alura/DaysOfCodeSpring/imdbApiClient.java @@ -0,0 +1,27 @@ +package br.com.alura.DaysOfCodeSpring; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import java.util.Arrays; +import java.util.List; + +@Component +public class imdbApiClient { + + @Autowired + public RestTemplate restTemplate; + + public List<ApiController.Filme> getBody(String apiKey) throws JsonProcessingException { + String url = "https://imdb-api.com/en/API/Top250Movies/"; + ResponseEntity<String> response = restTemplate.getForEntity(url + apiKey, String.class); + String parsed = response.getBody().substring(9,response.getBody().length() - 19); + + ObjectMapper objectMapper = new ObjectMapper(); + return Arrays.stream(objectMapper.readValue(parsed, ApiController.Filme[].class)).toList(); + } +} |
