Esta aplicação foi desenvolvida como teste para um processo seletivo. O objetivo é utilizar a API do OpenWeather para exibir a previsão do tempo para uma cidade.
Antes de construir o projeto, verifique os pré-requisitos:
- Node 5.8.0
- Npm 3.7.3
- Gradle 2.12
- JDK 8 (necessário estar no PATH para o Gradle utilizar para realização do build)
- Mongo no ar (é utilizado a base padrão
testpara inserção dacollection)
Para construir este projeto, execute os passos abaixo:
-
Faça clone deste repositório.
-
Execute o comando:
mongod -
Execute o comando:
npm install -
Execute o comando:
bower install -
Execute o comando:
gradlew -
Acessar a URL http://localhost:8080.
PS: caso ocorra o problema Cannot find module 'npm\bin\node_modules\npm\bin\npm-cli.js', execute o comando npm install npm.
Para importar o projeto no Eclipse basta importar um projeto Gradle e apontar para o repositório. Necessário possuir o plugin Gradle Buildship ou similar.
Os requisitos técnicos são:
- Tela de cadastro de cidade e listagem das cidades cadastradas. Permitir o usuário cadastrar somente cidades validas na API (que retornem dados). Na listagem de cidades deve ter um link para visualizar os detalhes da previsão (Tela de detalhe das previsões).
- Tela de detalhe das previsões. Exibe um "forecast" de 5 dias para a cidade.
Para o projeto, foi feito a distinção clara entre frontend e backend.
Para o frontend, é utilizado a stack Angular + Bootstrap. O objetivo é possuir uma aplicação com frontend robusto e de fácil manuntenção. Não houve uma preocupação grande em deixar as telas com o melhor design possível, mas sim em mostrar o desenho de como elas interagem com o backend e um pouco de responsibilidade. É utilizado gulp para executar minificação de arquivos CSS e JS e BrowserSync. O Angular se comunica com o backend através de serviços REST.
Para a construção dos serviços REST é utilizado o Spring Boot. O objetivo é fornecer uma construção fácil da implementação evitando a dependência de um servidor de aplicação. Apesar de ser utilizado Spring, a troca para um JAX-RS puro é fácil de fazer pois só muda o nome das anotações utilizadas praticamente.
As cidades disponíveis para exibição da previsão são armazenadas no banco MongoDB. O objetivo é ter um banco de fácil uso para uma necessidade simples.
Para implementação, foi adotado de início o uso de scaffolding com o JHipster para geração do esqueleto do projeto. No final, o scaffolding gerado é verboso demais e foi feito a limpa de quase tudo, o legado do JHipster acabou sendo o arquivo gulpfile.js e todos as tarefas que nele possui.
As classes eram poucas, mas onde era possível foi feito uso da programação funcional do Java 8 afim de mostrar o seu uso.
Foi necessário uso somente de duas classes de domínio: City (representação de uma cidade) e Forecast (representação de uma previsão).
Os principais componentes que corresponde os serviços REST são:
Resource: endpoint dos serviço, onde é mapeado os serviços.Service: um resource se comunico com um serviço a fim de lhe oferecer informações sobre como resolver tal requisição. No caso da previsão, este é o ponto onde é feito o contato com a API do OpenWeather.Repository: no caso da cidade, esta classe se comunica com o repositório do MongoDB.DTO: classes que carregam a comunicação entre o backend e o frontend.
Para contato com a API do OpenWeather foi utilizado o recurso RestTemplate do Spring. O retorno do serviço foi mapeado para um classe de domínio que contém os campos necessários para utilização no front. Esta classe de domínio é traduzida para o DTO que é enviado para o front.
Foi feito um teste automatizado simples para exemplificar os testes do serviço de cidades. Pode ser executado através do comando:
gradlew test