O desafio é elaborar uma aplicação de backend utilizando a linguagem de programação Python que deverá conter uma API retornando os dados da previsão do tempo dos próximos dias. Para elaborar essa aplicação, utilizar a API de previsão do tempo de 5 dias do https://openweathermap.org/.
A minha proposta como desenvolvedor foi trazer o ambiente o mais próximo possivel da vida real, utilizando a base Mongo diretamente do servidor Atlas, simulando as configurações que um Devops deveria fazer, como a inserção do IP da maquina que esta hospedando os serviços, porém ja deixando configurado para aceiar qualquer ip.
Através desta Api, o sistema envia uma requisição para a url proposta no teste, recupera os dados da precisão do tempo para a cidade selecionada e salva o historico desta busca na base de dados.
Back-end:
- Python
Framework:
- FastApi
Bibliotecas:
- requests;
- pymongo;
- datetime;
- dotenv.
Nosso servidor Mongo esta configurado para aceitar qualquer IP, Caso seja preciso inserir o ip da sua maquina no servidor Mongo utilizado siga os passos abaixo
- Endereço de acesso: https://account.mongodb.com/account/login
- email de acesso: [email protected]
- Senha: raizen2024
- Após acessar o sistema vá no menu lateral esquerdo na parte de Network Access
- Selecione o botão ADD IP ADRESS
- Insira o ip da máquina que irá rodar o sistema
GET /api_url/get_weather/{city}
Recupera os dados da previsão do tempo para a cidade selecionada e salva os resultados na base de dados.
{
"city": "São Paulo",
"message": "Previsão do tempo salva com sucesso!",
"data": {
"cod": "200",
"message": 0,
"cnt": 40,
"list": [
{
"dt": 1704844800,
"main": {
"temp": 23.53,
"feels_like": 23.77,
"temp_min": 23.53,
"temp_max": 26.35,
"pressure": 1015,
"sea_level": 1015,
"grnd_level": 929,
"humidity": 70,
"temp_kf": -2.82
},
"weather": [
{
"id": 500,
"main": "Rain",
"description": "light rain",
"icon": "10n"
}
],
"clouds": {
"all": 75
},
"wind": {
"speed": 2.88,
"deg": 61,
"gust": 4.94
},
"visibility": 10000,
"pop": 0.42,
"rain": {
"3h": 0.22
},
"sys": {
"pod": "n"
},
"dt_txt": "2024-01-10 00:00:00"
}
],
"city": {
"id": 3448439,
"name": "São Paulo",
"coord": {
"lat": -23.5475,
"lon": -46.6361
},
"country": "BR",
"population": 10021295,
"timezone": -10800,
"sunrise": 1704788901,
"sunset": 1704837486
}
}
}
GET /api_url/get_weather_database
Recupera os dados do histórico de todas as previsões pesquisadas.
{
"city": "São Paulo",
"message": "Previsão do tempo salva com sucesso!",
"data": {
"cod": "200",
"message": 0,
"cnt": 40,
"list": [
{
"dt": 1704844800,
"main": {
"temp": 23.53,
"feels_like": 23.77,
"temp_min": 23.53,
"temp_max": 26.35,
"pressure": 1015,
"sea_level": 1015,
"grnd_level": 929,
"humidity": 70,
"temp_kf": -2.82
},
"weather": [
{
"id": 500,
"main": "Rain",
"description": "light rain",
"icon": "10n"
}
],
"clouds": {
"all": 75
},
"wind": {
"speed": 2.88,
"deg": 61,
"gust": 4.94
},
"visibility": 10000,
"pop": 0.42,
"rain": {
"3h": 0.22
},
"sys": {
"pod": "n"
},
"dt_txt": "2024-01-10 00:00:00"
}
],
"city": {
"id": 3448439,
"name": "São Paulo",
"coord": {
"lat": -23.5475,
"lon": -46.6361
},
"country": "BR",
"population": 10021295,
"timezone": -10800,
"sunrise": 1704788901,
"sunset": 1704837486
}
}
}
Para rodar esse projeto, você vai precisar adicionar as seguintes variáveis de ambiente no seu .env
API_KEY=c99e7cccfcf2e5e618e757b0a8b8b04f
DATABASE_URL=mongodb+srv://raizen:[email protected]/?retryWrites=true&w=majority
API_URL=http://api.openweathermap.org/data/2.5/forecast
Clone o projeto
git clone https://github.com/ridabe/weather-app-act
Entre no diretório do projeto
cd my-project
Para construir a imagem Docker a partir do Dockerfile, no terminal, navegue até o diretório onde está localizado o Dockerfile e execute o comando:
docker build -t minha-api .
Para executar um contêiner com a imagem criada:
docker run -p 8000:8000 minha-api
Utilize o postman ou outro app para acessar as rotas da api, acesse o endereço iniciado pelo servidor:
'http://127.0.0.1:8000/get_weather/São Paulo' (as cidade poderão ter espaços caso tenham nomes composto)
'http://127.0.0.1:8000/get_weather_database'
** Dentro da pasta do projeto tera uma arquivo com as collections para serem usadas no postman **
Melhorias propostas para uma segunda versão (Code Review):
- Refatorações;
- Criação de arquivo de rotas;
- Melhorias de performance trabalhando com concurrent.futures(multithreading);
- Tratamento de erros(try);
- Aplicação do Pylint
- Testes Unitários;
- Endpoint para get por cidades;
- Ajustes de Typo.
Para suporte, mande um email para [email protected] ou entre em nosso whatsapp (11)94522-4263 (Ricardo Bene).
Esse projeto é parte do processo seletivo da:
- Raízen