summaryrefslogtreecommitdiff
path: root/src/main/java/br/com/alura
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/br/com/alura')
-rw-r--r--src/main/java/br/com/alura/DaysOfCodeSpring/ApiController.java69
-rw-r--r--src/main/java/br/com/alura/DaysOfCodeSpring/Application.java22
-rw-r--r--src/main/java/br/com/alura/DaysOfCodeSpring/HTMLGenerator.java55
-rw-r--r--src/main/java/br/com/alura/DaysOfCodeSpring/imdbApiClient.java27
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();
+ }
+}