https://github.com/leosimoes/alura-7daysofcode-backend-java-spring-imdb
Projeto do 7 Days of Code de Spring da Alura: Consumindo a API de filmes do IMDB e criando uma página HTML de exibição.
https://github.com/leosimoes/alura-7daysofcode-backend-java-spring-imdb
gson java json spring
Last synced: over 1 year ago
JSON representation
Projeto do 7 Days of Code de Spring da Alura: Consumindo a API de filmes do IMDB e criando uma página HTML de exibição.
- Host: GitHub
- URL: https://github.com/leosimoes/alura-7daysofcode-backend-java-spring-imdb
- Owner: leosimoes
- Created: 2023-11-03T15:35:37.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2023-11-10T12:46:56.000Z (over 2 years ago)
- Last Synced: 2025-01-30T01:16:45.608Z (over 1 year ago)
- Topics: gson, java, json, spring
- Language: Java
- Homepage:
- Size: 1.21 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Alura - 7 Days Of Code - Back-End - Java - Spring - IMDB
Projeto do 7 Days of Code de Spring da Alura:
Consumindo a API de filmes do IMDB e criando uma página HTML de exibição.
## Atividades
### Dia 1:
- Criar projeto com Spring Boot.


- ~~Cadastrar no site IMDB para obter chave da API.~~
- ~~Colocar a Chave da API em `application.properties` mas não compartilhá-la.~~
- Criar a classe RestTemplateConfig que tem um método com `@Bean` que retorna uma instância de RestTemplate.
- Criar a classe ImdbController e implementar método de getmapping para `/imdb` usando a url para o dados.

- Testar o endpoint `http://localhost:8080/imdb`
### Dia 2:
- Remover o campo `imdbApiKey` de ImdbController e seu valor de `application.properties`, já que os dados serão obtidas via url do github.
- Alterar classe de teste `Alura7DaysOfCodeBackEndJavaSpringImdbApplicationTests`:
* Anotar a classe com `@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)`.
* Criar atributo `porta` e anotá-lo com `@LocalServerPort`.
* Criar atributo `restTemplate` do tipo `TestRestTemplate` e anotá-lo com `@Autowired`.
* Criar método `testImdbEndpoint`para testar o endpoint `http://localhost:8080/imdb`.

### Dia 3:
- Criar classe Filme e usar Lombok para gerar getters, setters e construtores.

- Adicionar dependência do GSON `implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1'` em `build.gradle`.
- Alterar método da controller para que o retorno tenta uma List de Filmes ao invés de uma String.
- Alterar o método da classe de teste para verificar o retorno do tipo List e não String.
### Dia 4:
- Criar classe TemplateHTML com campos `INICIO_HTML`, `FILME_HTML` e `FIM_HTML`;

- Criar Classe GeradorHTML com método `gerarStringHTML()`;

- Refatorar a classe ImdbController:
* Tornar `fetchTopMoviesData()` privado e remover endpoint `http://localhost:8080/imdb`.
* Criar endpoint `http://localhost:8080/imdb/json` e testá-lo.
* Criar endpoint `http://localhost:8080/imdb/html` e testá-lo.
* Criar endpoint `http://localhost:8080/imdb/html-download` e testá-lo.

- Alterar classe de teste `Alura7DaysOfCodeBackEndJavaSpringImdbApplicationTests`:
* Deletar o método `testImdbEndpoint()`.
* Criar método `testImdbEndpoint_JSON()`para testar o endpoint `http://localhost:8080/imdb/json`.
* Criar método `testImdbEndpoint_HTML()`para testar o endpoint `http://localhost:8080/imdb/html`.
### Dia 5:
- Refatorar o código, delegando parte das responsabilidades de ImdbController para outras classes.
- Criar classe ImdbClientFetch:
* terá um atributo RestTemplate e um String (URL).
* terá o método `fetchTopFilmes()` extraido de `fetchTopMoviesData()` de ImdbController;
* anotada com `@Component`.

- Criar classe ImdbService:
* terá um atributo ImdbClientFetch e um GeradorHTML;
* terá métodos `jsonTopFilmes()`, `htmlTopFilmes()` e `downloadHtml()` extraídos dos métodos públicos de ImdbController;
* anotada com `@Service`.

- A classe ImdbController terá apenas um atributo, do tipo ImdbService.

### Dia 6:
- Adicionar 3 novos endpoints que serão similares aos já criados, mas recebem parte do título na url e retornam os correspondentes:
* Adicionar novos métodos para as classes ImdbController e ImdbService.

* Criar endpoint `http://localhost:8080/imdb/json/{titulo}` e testá-lo.
* Criar endpoint `http://localhost:8080/imdb/html/{titulo}` e testá-lo.
* Criar endpoint `http://localhost:8080/imdb/html-download/{titulo}` e testá-lo.
### Dia 7:
- Fazer com que ImdbClientFetch faça requisição dos dados apenas uma vez e os armazene em memória:
* Refatorar ImdbClientFetch: criar atributo `topFilmes` e método `loadTopFilmes()` e tornar o método `fetchTopFilmes()` privado.
* Refatorar ImdbService para que chame o método `loadTopFilmes()` de ImdbClientFetch, e não `fetchTopFilmes()`.

- Usar o Swagger:
* Adicionar dependência `implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webmvc-ui', version: '2.2.0'` ao build.gradle.
* Acessar `http://localhost:8080/swagger-ui.html`.
- Adicionar funcionalidades de favoritos por ids dos filmes:
* Adicionar favoritos
* Criar e testar endpoind (POST) `http://localhost:8080/imdb/favoritos/` para adicionar filme aos favoritos;
* Criar e testar endpoind (DELETE) `http://localhost:8080/imdb/favoritos/{id}` para remover filme dos favoritos;
* Criar e testar endpoind (GET) `http://localhost:8080/imdb/favoritos/json` para retornar os fimes favoritos em json;
* Criar e testar endpoind (GET) `http://localhost:8080/imdb/favoritos/html` para retornar os fimes favoritos em html;
* Criar e testar endpoind (GET) `http://localhost:8080/imdb/favoritos/html-download` para retornar os fimes favoritos em arquivo html;


## Resultados finais
- Classes:

- Endpoints:

- `http://localhost:8080/imdb/json`:

- `http://localhost:8080/imdb/html`:

- `http://localhost:8080/imdb/json/lord`

- `http://localhost:8080/imdb/html/lord`:

## Referências
Alura - 7 Days Of Code - Back-End - Java - Spring:
https://7daysofcode.io/matricula/spring
Spring Framework - Docs - Rest Template:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
Baeldung Rest Template:
https://www.baeldung.com/rest-template
Imdb Top Filmes:
https://raw.githubusercontent.com/alura-cursos/imersao-java-2-api/main/TopMovies.json