Convenções
- Base:
https://mathmaker.tricagono.com (todos os caminhos abaixo são relativos a essa base).
- Formato: JSON em
application/json. Erros retornam { "erro": "mensagem" }.
- Autenticação web: cookie de sessão
mathmaker.sid (httpOnly). O cliente usa credentials: 'include' e nunca lê o cookie diretamente.
- Autenticação do tablet: headers
x-bancada-id e x-kiosk-token (token kiosk da bancada).
- Papéis:
superadmin (Tricagono), admin (escola) e professor. Cada papel determina o escopo de leitura/escrita.
- Multi-tenant: o escopo da escola (
tenant) é derivado da sessão ou do token; os dados nunca cruzam entre escolas.
- Paginação: listagens aceitam
?limit= e ?offset= (máximo 500 por página).
Autenticação — /api/auth
| Método | Caminho | Acesso | Descrição |
POST | /api/auth/login | Público | Autentica com { email, senha } e retorna o usuário público. |
POST | /api/auth/logout | Autenticado | Encerra a sessão e retorna { ok: true }. |
GET | /api/auth/me | Autenticado | Retorna o usuário autenticado atual. |
O usuário público tem a forma { id, nome, email, papel, tenantId }.
Tenants — /api/tenants superadmin
| Método | Caminho | Descrição |
GET | /api/tenants | Lista as escolas. |
POST | /api/tenants | Cria uma escola com { nome, slug }. |
GET | /api/tenants/:id | Detalha uma escola. |
Usuários — /api/users
| Método | Caminho | Acesso | Descrição |
GET | /api/users | Autenticado | Superadmin vê todos; admin/professor veem o próprio tenant. |
POST | /api/users | Autenticado | Cria usuário { nome, email, senha, papel } (papel: admin ou professor). Superadmin informa tenantId. |
Turmas — /api/turmas
| Método | Caminho | Acesso | Descrição |
GET | /api/turmas | Autenticado | Admin vê todas; professor vê só as suas. |
POST | /api/turmas | Admin | Cria { nome, professorId? }. |
GET | /api/turmas/:id | Autenticado | Detalha a turma (professor só a própria). |
GET | /api/turmas/:id/painel | Autenticado | Grade de bancadas { turma, bancadas } (estado inicial). |
PUT | /api/turmas/:id | Admin | Atualiza { nome?, professorId? }. |
DELETE | /api/turmas/:id | Admin | Remove (204). |
Alunos — /api/alunos
| Método | Caminho | Acesso | Descrição |
GET | /api/alunos?turma=&limit=&offset= | Autenticado | Lista alunos do tenant, filtráveis por turma. |
POST | /api/alunos | Admin | Cria { nome, turmaId?, serie?, foto? }. |
GET | /api/alunos/:id | Autenticado | Detalha o aluno. |
GET | /api/alunos/:id/portfolio | Autenticado | Linha do tempo de fotos do aluno (professor só da própria turma). |
PUT | /api/alunos/:id | Admin | Atualiza o aluno. |
DELETE | /api/alunos/:id | Admin | Remove (204). |
Bancadas — /api/bancadas
| Método | Caminho | Acesso | Descrição |
GET | /api/bancadas?limit=&offset= | Autenticado | Lista bancadas do tenant. |
POST | /api/bancadas | Admin | Cria { nome } e retorna o token kiosk (única vez). |
GET | /api/bancadas/:id | Autenticado | Detalha a bancada. |
PUT | /api/bancadas/:id | Admin | Atualiza { nome?, status? }. |
POST | /api/bancadas/:id/token | Admin | Regenera o token kiosk (revoga o anterior). |
POST | /api/bancadas/:id/atribuir | Admin/Professor | Atribui { alunoId, pecaId } e cria a sessão. |
DELETE | /api/bancadas/:id | Admin | Remove (204). |
Peças — /api/pecas admin · professor
| Método | Caminho | Descrição |
GET | /api/pecas?status=&limit=&offset= | Lista peças (status: rascunho, publicada, arquivada). |
POST | /api/pecas | Cria { nome, desenho_svg?, descricao? }. |
GET | /api/pecas/:id | Detalha a peça. |
PUT | /api/pecas/:id | Atualiza a peça. |
DELETE | /api/pecas/:id | Remove (204). |
POST | /api/pecas/:id/publicar | Publica (versiona se já usada em sessão). |
GET | /api/pecas/:id/etapas | Lista etapas ordenadas. |
POST | /api/pecas/:id/etapas | Cria etapa vinculada à peça. |
Etapa: { ordem, titulo, instrucao?, desenho?, tipo_acao, criterio_validacao?, medida_esperada_json?, aprovacao_modo, conteudo_matematico?, exige_epi }. tipo_acao ∈ medir, marcar, serrar, aplainar, encaixar, conferir. aprovacao_modo ∈ auto, humano, auto_com_revisao.
Etapas — /api/etapas admin · professor
| Método | Caminho | Descrição |
PUT | /api/etapas/:id | Atualiza a etapa. |
DELETE | /api/etapas/:id | Remove (204). |
Tablet — /api/tablet kiosk
Todas as rotas exigem x-bancada-id + x-kiosk-token.
| Método | Caminho | Descrição |
POST | /api/tablet/bootstrap | Descobre a bancada e a sessão ativa; marca online. |
POST | /api/tablet/sessao | Retorna a sessão ativa (409 se não atribuída). |
POST | /api/tablet/sessao/finalizar | Encerra a sessão como concluída. |
POST | /api/tablet/etapas/:id/iniciar | Marca a etapa como em andamento. |
POST | /api/tablet/validar | Multipart: foto + etapaSessaoId. Cria a validação. |
POST | /api/tablet/epi | Multipart: foto (+ tipo_epi). Verifica EPI via CV (503 se indisponível). |
Revisão — /api/revisao admin · professor
| Método | Caminho | Descrição |
GET | /api/revisao/pendentes | Fila de validações aguardando decisão humana. |
POST | /api/revisao/:id/decisao | Decide { decisao: aprovado | reprovado, comentario? }. |
Relatórios — /api/relatorios
| Método | Caminho | Acesso | Descrição |
GET | /api/relatorios/turma/:id | Autenticado | Desempenho agregado da turma. |
GET | /api/relatorios/turma/:id/pdf | Autenticado | Relatório da turma em PDF. |
GET | /api/relatorios/aluno/:id | Autenticado | Desempenho individual (uma linha por sessão). |
GET | /api/relatorios/aluno/:id/pdf | Autenticado | Relatório do aluno em PDF. |
GET | /api/relatorios/seguranca | Autenticado | Log de EPI (paginado) + resumo ok/falha. |
GET | /api/relatorios/custo | Admin | Auditoria de custo CV vs LLM. |
Fotos — /api/fotos
| Método | Caminho | Descrição |
GET | /api/fotos/:tenantId/:sessaoId/:arquivo | Serve a foto da validação (autenticada; escopo professor↔turma). |
Health
| Método | Caminho | Descrição |
GET | /health | Retorna { ok: true, ts }. |
Socket.io — eventos em tempo real
O cliente web se autentica pelo cookie de sessão (mesmo domínio); o tablet pelos headers x-bancada-id + x-kiosk-token.
Servidor → cliente
| Evento | Payload | Room |
sessao:iniciada | sessão | bancada:{id}, turma:{id} |
sessao:finalizada | sessão | bancada:{id}, turma:{id} |
etapa:atualizada | etapa_sessao | bancada:{id}, turma:{id} |
validacao:resultado | validação | bancada:{id}, turma:{id} |
revisao:pendente | validação | bancada:{id}, turma:{id} |
Cliente → servidor
| Evento | Uso |
bancada:ping | Heartbeat → marca a bancada como online. |