Git Product home page Git Product logo

weather-app-act's Introduction

Logo

Raízen Teste

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.

Etiquetas

MIT License GPLv3 License AGPL License

Resumo do sistema

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.

Stack utilizada

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

Configurando o ip da máquina no MongoAtlas

Configuração do IP

  • Após acessar o sistema vá no menu lateral esquerdo na parte de Network Access

image host

  • Selecione o botão ADD IP ADRESS

image host

  • Insira o ip da máquina que irá rodar o sistema

image host

Documentação da API

EndPoint de chamada

  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.

Exemplo do Retorno da Api

{
    "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.

Exemplo do Retorno da Api

{
    "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
                    }
            }
}

Variáveis de Ambiente

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

Rodando via container

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 Sugeridas

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.

Suporte

Para suporte, mande um email para [email protected] ou entre em nosso whatsapp (11)94522-4263 (Ricardo Bene).

Usado por

Esse projeto é parte do processo seletivo da:

  • Raízen

Logo

weather-app-act's People

Contributors

ridabe avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.