{"id":22191684,"url":"https://github.com/leosimoes/alura-7daysofcode-backend-java-spring-imdb","last_synced_at":"2025-03-24T20:43:50.028Z","repository":{"id":205346877,"uuid":"713954124","full_name":"leosimoes/Alura-7DaysOfCode-BackEnd-Java-Spring-IMDB","owner":"leosimoes","description":"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.","archived":false,"fork":false,"pushed_at":"2023-11-10T12:46:56.000Z","size":1273,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-30T01:16:45.608Z","etag":null,"topics":["gson","java","json","spring"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leosimoes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-11-03T15:35:37.000Z","updated_at":"2023-11-06T13:23:47.000Z","dependencies_parsed_at":"2023-11-08T15:43:03.823Z","dependency_job_id":null,"html_url":"https://github.com/leosimoes/Alura-7DaysOfCode-BackEnd-Java-Spring-IMDB","commit_stats":null,"previous_names":["leosimoes/alura-7daysofcode-backend-java-spring-imdb"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leosimoes%2FAlura-7DaysOfCode-BackEnd-Java-Spring-IMDB","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leosimoes%2FAlura-7DaysOfCode-BackEnd-Java-Spring-IMDB/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leosimoes%2FAlura-7DaysOfCode-BackEnd-Java-Spring-IMDB/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leosimoes%2FAlura-7DaysOfCode-BackEnd-Java-Spring-IMDB/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leosimoes","download_url":"https://codeload.github.com/leosimoes/Alura-7DaysOfCode-BackEnd-Java-Spring-IMDB/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245351761,"owners_count":20601089,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gson","java","json","spring"],"created_at":"2024-12-02T12:17:18.095Z","updated_at":"2025-03-24T20:43:50.004Z","avatar_url":"https://github.com/leosimoes.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Alura - 7 Days Of Code - Back-End - Java - Spring - IMDB\n\nProjeto do 7 Days of Code de Spring da Alura: \nConsumindo a API de filmes do IMDB e criando uma página HTML de exibição.\n\n\n## Atividades\n\n\n### Dia 1:\n- Criar projeto com Spring Boot.\n\n![IntelliJ-Spring-Initializr-Directories](imgs/IntelliJ-Spring-Initializr-1.jpg)\n\n![IntelliJ-Spring-Initializr-Dependences](imgs/IntelliJ-Spring-Initializr-2.jpg)\n\n- ~~Cadastrar no site IMDB para obter chave da API.~~\n- ~~Colocar a Chave da API em `application.properties` mas não compartilhá-la.~~\n- Criar a classe RestTemplateConfig que tem um método com `@Bean` que retorna uma instância de RestTemplate.\n- Criar a classe ImdbController e implementar método de getmapping para `/imdb` usando a url para o dados. \n\n![UML-Classe-Controller](imgs/UML-Classe-ImdbController-v1.jpg)\n\n- Testar o endpoint `http://localhost:8080/imdb`\n\n\n### Dia 2:\n- Remover o campo `imdbApiKey` de ImdbController e seu valor de `application.properties`, já que os dados serão obtidas via url do github.\n- Alterar classe de teste `Alura7DaysOfCodeBackEndJavaSpringImdbApplicationTests`:\n  * Anotar a classe com `@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)`.\n  * Criar atributo `porta` e anotá-lo com `@LocalServerPort`.\n  * Criar atributo `restTemplate` do tipo `TestRestTemplate` e anotá-lo com `@Autowired`.\n  * Criar método `testImdbEndpoint`para testar o endpoint `http://localhost:8080/imdb`.\n\n![Test-1-Endpoint](imgs/test1-endpoint.jpg)\n\n\n### Dia 3:\n- Criar classe Filme e usar Lombok para gerar getters, setters e construtores.\n\n![UML-Classe-Filme](imgs/UML-Classe-Filme.jpg)\n\n- Adicionar dependência do GSON `implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1'` em `build.gradle`.\n- Alterar método da controller para que o retorno tenta uma List de Filmes ao invés de uma String.\n- Alterar o método da classe de teste para verificar o retorno do tipo List e não String.\n\n\n### Dia 4:\n- Criar classe TemplateHTML com campos `INICIO_HTML`, `FILME_HTML` e `FIM_HTML`;\n\n![UML-Classe-TemplateHTML](imgs/UML-Classe-TemplateHTML.jpg)\n\n- Criar Classe GeradorHTML com método `gerarStringHTML()`;\n\n![UML-Classe-GeradorHTML](imgs/UML-Classe-GeradorHTML.jpg)\n\n- Refatorar a classe ImdbController:\n  * Tornar `fetchTopMoviesData()` privado e remover endpoint `http://localhost:8080/imdb`.\n  * Criar endpoint `http://localhost:8080/imdb/json` e testá-lo.\n  * Criar endpoint `http://localhost:8080/imdb/html` e testá-lo.\n  * Criar endpoint `http://localhost:8080/imdb/html-download` e testá-lo.\n\n![UML-Classe-Controller-v2](imgs/UML-Classe-ImdbController-v2.jpg)\n\n- Alterar classe de teste `Alura7DaysOfCodeBackEndJavaSpringImdbApplicationTests`:\n  * Deletar o método `testImdbEndpoint()`.\n  * Criar método `testImdbEndpoint_JSON()`para testar o endpoint `http://localhost:8080/imdb/json`.\n  * Criar método `testImdbEndpoint_HTML()`para testar o endpoint `http://localhost:8080/imdb/html`.\n\n\n### Dia 5:\n- Refatorar o código, delegando parte das responsabilidades de ImdbController para outras classes.\n- Criar classe ImdbClientFetch:\n  * terá um atributo RestTemplate e um String (URL).\n  * terá o método `fetchTopFilmes()` extraido de `fetchTopMoviesData()` de ImdbController;\n  * anotada com `@Component`.\n\n![UML-Classe-ImdbClientFetch-v1](imgs/UML-Classe-ImdbClientFetch-v1.jpg)\n\n- Criar classe ImdbService:\n  * terá um atributo ImdbClientFetch e um GeradorHTML;\n  * terá métodos `jsonTopFilmes()`, `htmlTopFilmes()` e `downloadHtml()` extraídos dos métodos públicos de ImdbController;\n  * anotada com `@Service`.\n\n![UML-Classe-ImdbService-v1](imgs/UML-Classe-ImdbService-v1.jpg)\n\n- A classe ImdbController terá apenas um atributo, do tipo ImdbService.\n  \n![UML-Classe-Controller-v3](imgs/UML-Classe-ImdbController-v3.jpg)\n\n\n### Dia 6:\n\n- Adicionar 3 novos endpoints que serão similares aos já criados, mas recebem parte do título na url e retornam os correspondentes:\n  * Adicionar novos métodos para as classes ImdbController e ImdbService.\n\n![UML-Classe-Controller-v4-Service-v2](imgs/UML-Classe-ImdbController-v4-ImdbService-v2.jpg)\n\n  * Criar endpoint `http://localhost:8080/imdb/json/{titulo}` e testá-lo.\n  * Criar endpoint `http://localhost:8080/imdb/html/{titulo}` e testá-lo.\n  * Criar endpoint `http://localhost:8080/imdb/html-download/{titulo}` e testá-lo.\n\n\n### Dia 7:\n- Fazer com que ImdbClientFetch faça requisição dos dados apenas uma vez e os armazene em memória:\n  * Refatorar ImdbClientFetch: criar atributo `topFilmes` e método `loadTopFilmes()` e tornar o método `fetchTopFilmes()` privado.\n  * Refatorar ImdbService para que chame o método `loadTopFilmes()` de ImdbClientFetch, e não `fetchTopFilmes()`.\n\n![UML-Classe-ImdbClientFetch-v2](imgs/UML-Classe-ImdbClientFetch-v2.jpg)\n\n- Usar o Swagger:\n  * Adicionar dependência `implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webmvc-ui', version: '2.2.0'` ao build.gradle.\n  * Acessar `http://localhost:8080/swagger-ui.html`.\n- Adicionar funcionalidades de favoritos por ids dos filmes:\n  * Adicionar favoritos\n  * Criar e testar endpoind (POST) `http://localhost:8080/imdb/favoritos/` para adicionar filme aos favoritos;\n  * Criar e testar endpoind (DELETE) `http://localhost:8080/imdb/favoritos/{id}` para remover filme dos favoritos;\n  * Criar e testar endpoind (GET) `http://localhost:8080/imdb/favoritos/json` para retornar os fimes favoritos em json;\n  * Criar e testar endpoind (GET) `http://localhost:8080/imdb/favoritos/html` para retornar os fimes favoritos em html;\n  * Criar e testar endpoind (GET) `http://localhost:8080/imdb/favoritos/html-download` para retornar os fimes favoritos em arquivo html;\n\n![UML-Classe-ImdbService-v3](imgs/UML-Classe-ImdbService-v3.jpg)\n\n![UML-Classe-ImdbController-v5](imgs/UML-Classe-ImdbController-v5.jpg)\n\n\n## Resultados finais\n\n- Classes:\n\n![UML-Classes-Relacionamentos](/imgs/UML-Classes-Relacionamentos.jpg)\n\n\n- Endpoints:\n\n![Swagger-ui-endpoints](/imgs/Swagger-ui-endpoints.jpg)\n\n\n  - `http://localhost:8080/imdb/json`:\n\n![Resultado-json](imgs/Imdb-Resultado-json.jpg)\n\n\n  - `http://localhost:8080/imdb/html`:\n\n![Resultado-html](imgs/Imdb-Resultado-html.jpg)\n\n\n  - `http://localhost:8080/imdb/json/lord`\n\n![Resultado-html](imgs/Imdb-Resultado-json-lord.jpg)\n\n\n  - `http://localhost:8080/imdb/html/lord`:\n\n![Resultado-html](imgs/Imdb-Resultado-html-lord.jpg)\n\n\n## Referências\n\nAlura - 7 Days Of Code - Back-End - Java - Spring:\nhttps://7daysofcode.io/matricula/spring\n\nSpring Framework - Docs - Rest Template: \nhttps://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html\n\nBaeldung Rest Template:\nhttps://www.baeldung.com/rest-template\n\nImdb Top Filmes:\nhttps://raw.githubusercontent.com/alura-cursos/imersao-java-2-api/main/TopMovies.json","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleosimoes%2Falura-7daysofcode-backend-java-spring-imdb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleosimoes%2Falura-7daysofcode-backend-java-spring-imdb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleosimoes%2Falura-7daysofcode-backend-java-spring-imdb/lists"}