Este projeto implementa uma API REST para um jogo de perguntas e respostas matemáticas em tempo real. Ele foi desenvolvido para auxiliar no reforço escolar em matemática na cidade de Jaraguá do Sul.
- Python 3.12
- Flask 3.1.0 – microframework web.
- SQLAlchemy 2.0 + Flask-SQLAlchemy 3.1.1 – ORM para manipulação do banco.
- PostgreSQL – banco de dados relacional (utilizado via Supabase).
Crie um arquivo .env
na raiz do projeto com as variáveis de ambiente:
DATABASE_URL=postgresql://<usuario>:<senha>@<host>:<porta>/<database>?sslmode=require
SECRET_KEY=sua_chave_secreta_aqui
URL base: http://127.0.0.1:5000
Autentica um usuário e retorna o token JWT.
Request:
{
"username": "seu_usuario",
"password": "sua_senha"
}
Response:
{
"token": "<JWT>"
}
Cria um novo usuário (não requer autenticação):
{
"username": "usuario",
"password": "senha",
"name": "Nome Completo",
"email": "email@exemplo.com"
}
Lista todos os usuários cadastrados.
Retorna os dados de um usuário específico.
Atualiza os dados do usuário autenticado.
Remove a conta do usuário autenticado.
Retorna o histórico de partidas do usuário.
Cria uma nova partida (modo pareamento).
{
"categories": ["Álgebra", "Geometria"]
}
Response:
{
"message": "Game created. Waiting for another player.",
"game_id": 5
}
Finaliza uma partida e salva os dados.
{
"game_id": 5,
"total_time": 80,
"winner_id": 2,
"stats": [
{
"player_id": 1,
"correct_answers": 4,
"wrong_answers": 6,
"time_played": 80,
"result": "lose"
},
{
"player_id": 2,
"correct_answers": 7,
"wrong_answers": 3,
"time_played": 80,
"result": "win"
}
]
}
Response:
{
"message": "Game finished successfully"
}
Obtém uma nova pergunta para o jogador responder.
Response:
{
"question_id": 12,
"question": "Quanto é 8 × 7?",
"options": {
"A": "54",
"B": "56",
"C": "64",
"D": "58"
}
}
Envia a resposta de uma pergunta.
Request:
{
"game_id": 5,
"question_id": 12,
"answer": "B"
}
Response:
{
"correct": true,
"time_update": 2,
"opponent_time_update": -2,
"message": "Resposta correta!"
}
Retorna o top 10 jogadores:
[
{
"username": "player1",
"points": 320,
"icon": "static/icons/player1.png"
},
...
]