API disonível em https://gtm.delary.dev/
Documentação:
- 🎯 Objetivo
- 📝 Descrição
- 📝 Instruções
- 🏗️ Como Rodar o Projeto Localmente?
- 🚀 Como Rodar o Projeto em Produção?
- 📐 Variáveis de Ambiente
O objetivo deste trabalho é desenvolver uma ferramenta capaz de decifrar a estrutura de um labirinto representado como um grafo.
Uma vez entendido o labirinto, você deve sugerir a sequência de movimentos otimizada para sair do labirinto a partir de um ponto inicial.
O labirinto é representado por um grafo onde cada vértice é um ponto que pode ser visitado pelo usuário. Para ajudá-lo a entender e navegar pelo labirinto, você terá acesso a uma API com três endpoints:
Permite ao usuário iniciar a exploração do labirinto.
{
"id": "usuario",
"labirinto": "nome_do_labirinto"
}
{
"pos_atual": 5,
"inicio": true,
"final": false,
"movimentos": [4, 6]
}
Permite ao usuário se mover pelo labirinto.
{
"id": "usuario",
"labirinto": "nome_do_labirinto",
"nova_posicao": 6
}
{
"pos_atual": 6,
"inicio": false,
"final": false,
"movimentos": [5, 7]
}
Valida se a sequência de movimentos fornecida é um caminho válido no labirinto.
{
"id": "usuario",
"labirinto": "nome_do_labirinto",
"todos_movimentos": [5, 6, 7]
}
{
"caminho_valido": true,
"quantidade_movimentos": 3
}
Utilize a API fornecida para entender o grafo que representa o labirinto. Seu código deve ser capaz de identificar todos os vértices e arestas.
Após entender a estrutura do labirinto, desenvolva um algoritmo que encontre o caminho mais curto (se existir) do ponto inicial até o ponto final.
Use o endpoint /valida_caminho para confirmar se o caminho encontrado é válido.
Desenvolva uma interface simples (ou utilize a saída padrão do console) para mostrar a sequência de movimentos que o usuário deve realizar para sair do labirinto.
O trabalho será avaliado com base na acurácia do algoritmo (se ele realmente encontra o melhor caminho), na clareza do código e na apresentação dos resultados.
Você pode usar algoritmos de busca em grafos, como o Dijkstra ou o BFS (Busca em Largura), para encontrar o caminho mais curto no labirinto.
Organize bem seu código, separando responsabilidades e documentando as funções.
Não esqueça de tratar possíveis erros que podem surgir durante as chamadas da API.
docker-compose
é necessário ter o Docker e o Docker Compose instalados.
- Clone o projeto em uma pasta de sua preferência:
git clone [email protected]:rambim/graph_theory_maze.git
- Entre na pasta do repositório que acabou de clonar:
cd graph_theory_maze
- Execute o comando:
docker-compose -f docker-compose.yaml -f docker-compose.local.yaml up
A API estará disponível em http://gtm.localhost/ e a documentação pode ser consultada em http://gtm.localhost/docs/ e http://gtm.localhost/redoc/.
Para rodar o projeto apenas utilizando o Python, é necessário já ter uma instância do Redis com RediGraph configurado e rodando. A maneiro mais fácil de subir o Redis com RedisGraph é via docker utilizando a imagem redislab/redisgraph.
Este projeto utiliza o Python 3.11.
- Clone o projeto em uma pasta de sua preferência:
git clone [email protected]:rambim/graph_theory_maze.git
- Entre na pasta do repositório que acabou de clonar:
cd graph_theory_maze
- Crie um ambiente virtual:
python -m venv .venv
- Ative o ambiente virtual:
- Linux (Bash ou Zsh):
source ./venv/bin/activate
- Windows (Powershell):
.venv\Scripts\Activate.ps1
- Instale as dependências:
pip install -r requirements.txt
- Configure as variáveis de ambiente com os dados da sua instância do Redis com RediGraph:
export GTM_REDIS_HOST=127.0.0.1
export GTM_REDIS_PORT=6379
- Para rodar a API, execute:
uvicorn api.main:api --host localhost --port 8080
A API estará disponível em (localhost:8080/) e a documentação pode ser consultada em (localhost:8080/docs) e (localhost:8080/redoc).
Antes de efetuar deploy em produção, é necessário adquirir certificado para que a comunicação com a API seja feita tanto em HTTP e HTTPS, principalmente para exposição das documentações (Swagger e Redoc), pois, a depender do domínio, só é possível acessá-lo no browser via HTTPS.
Leia mais:
Após obter os certificados de forma manual, eles devem estar em ./traefik/pki
com os nomes cert.pem
e privkey.key
.
O próximo passo é configurar as variáveis de ambiente antes de subir a aplicação:
GTM_DASH_SUBDOMAIN
: Subdomínio do Dashboard do Traefik, exemplo:dashboard
GTM_API_SUBDOMAIN
: Subdomínio da aplicação em si, exemplo:gtm
GTM_BASE_DOMAIN
: Domínio base da aplicação, exemplo:delary.dev
nivel2.nivel1
ou dashboard.gtm
.
Agora basta utilizar o Docker Compose
para subir a aplicação utilizando o yaml de produção: docker-compose -f docker-compose.yaml -f docker-compose.prod.yaml up
.
Obs: Não podem ser alteradas no arquvo yaml do docker compose, devem estar setadas no ambiente em tempo de deploy da aplicação.
GTM_BASE_DOMAIN
: Domínio base da aplicação, exemplo:delary.dev
.GTM_DASH_SUBDOMAIN
: Subdomínio do Dashboard no Traefik, exemplo:dashboard
.GTM_API_SUBDOMAIN
: Subdomínio da aplicação em si, exemplo:gtm
(assim como a API disponível,gtm.delary.dev
).
Obs: Podem ser alteradas no arquivo yaml do docker compose, na seção environment
.
GTM_REDIS_HOST
: Host do Redis. Exemplo:localhost
ou127.0.0.1
.GTM_REDIS_PORT
: Port do Redis. Exemplo:6379
.GTM_SESSION_TTL
: Tempo em segundos que a sessão do usuário fica salva no Redis. Valor padrão300
(5 minutos).