Este projeto foi desenvolvido como parte do processo seletivo para Desenvolvedor Back End Python na PowerOfData. Apresenta uma API Python, implementada como Google Cloud Function, focada em otimização e eficiência para consulta de dados da API pública do Star Wars (SWAPI).
A API está disponível e pode ser acessada através do seguinte endpoint:
https://case-swapi-742136354522.southamerica-east1.run.app/
- Filtragem Múltipla: Permite filtrar recursos (planetas, personagens, filmes, naves) usando múltiplos parâmetros via query params, com lógica de negócio isolada e reutilizável.
- Paginação Manual: Implementa paginação para gerenciar grandes volumes de dados, retornando metadados de navegação para facilitar a exploração dos resultados.
- Cache em Memória com TTL: Utiliza um cache em memória com Tempo de Vida (TTL) de 10 minutos para reduzir chamadas externas à SWAPI, otimizando a performance e a latência.
- Atualização Automática do Cache: O cache é automaticamente atualizado após a expiração ou se os dados não existirem, garantindo que as informações sejam sempre recentes.
- Transformação de Dados (DTO): Converte os dados brutos da SWAPI em um formato resumido e padronizado (DTO), enviando apenas informações essenciais e reduzindo o payload da resposta.
- Separação de Responsabilidades: A arquitetura é modular, com cada componente (roteamento, tratamento de caminhos, busca de dados, filtragem, paginação, transformação) tendo uma função clara e bem definida, o que facilita a manutenção e escalabilidade.
A API oferece acesso aos seguintes recursos da SWAPI, com suporte a busca por ID, filtragem e paginação. Para todos os endpoints, a paginação pode ser controlada pelo parâmetro page.
-
Busca por ID:
/planets/{id} -
Filtros via Query Params:
name: Filtra planetas pelo nome (busca parcial, case-insensitive).climate: Filtra planetas pelo clima (busca parcial, case-insensitive).terrain: Filtra planetas pelo terreno (busca parcial, case-insensitive).
-
Paginação:
page(número da página, padrão: 1).Exemplo:
/planets?name=tatooine&climate=arid&page=1
-
Busca por ID:
/people/{id} -
Filtros via Query Params:
name: Filtra personagens pelo nome (busca parcial, case-insensitive).gender: Filtra personagens pelo gênero (correspondência exata, case-insensitive).film: Filtra personagens que aparecem em um filme específico (pelo ID do filme).
-
Paginação:
page(número da página, padrão: 1).Exemplo:
/people?name=luke&gender=male&film=1&page=1
-
Busca por ID:
/films/{id} -
Filtros via Query Params:
title: Filtra filmes pelo título (busca parcial, case-insensitive).character: Filtra filmes que contêm um personagem específico (pelo ID do personagem).year: Filtra filmes pelo ano de lançamento (correspondência exata comrelease_date).
-
Paginação:
page(número da página, padrão: 1).Exemplo:
/films?title=hope&character=1&year=1977&page=1
-
Busca por ID:
/starships/{id} -
Filtros via Query Params:
name: Filtra naves estelares pelo nome (busca parcial, case-insensitive).model: Filtra naves estelares pelo modelo (busca parcial, case-insensitive).pilot: Filtra naves estelares que foram pilotadas por um personagem específico (pelo ID do personagem).
-
Paginação:
page(número da página, padrão: 1).Exemplo:
/starships?name=falcon&model=yt-1300&pilot=1&page=1
Testes unitários foram implementados com pytest para garantir a correção das funcionalidades de filtragem, paginação e transformação de dados. Para executá-los, instale pytest (pip install pytest) e execute pytest na raiz do projeto.
- Python 3.x
- Flask
- Google Cloud Functions
- requests
- pytest
- Clone o repositório:
git clone https://github.com/Gsn00/case-swapi.git cd case-swapi - Crie e ative um ambiente virtual (opcional, mas recomendado):
python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows
- Instale as dependências:
pip install -r requirements.txt
- Para simular o ambiente do Cloud Functions localmente, execute:
A API estará disponível em
functions-framework --target=hello_http --debug
http://localhost:8080.
Email: silvanovaesgabriel@gmail.com LinkedIn: https://www.linkedin.com/in/gabrielsnovais/