Skip to content

Painel Público de Status (kiosk)

O que é este documento — o mapa da quarta superfície do ionCLASS: o painel público de status, um kiosk exibido na portaria/recepção que mostra a fila de retirada ao vivo sem dados sensíveis. É autenticado por token de kiosk (não por sessão de usuário) e vive dentro do próprio backend (página Inertia). Superfícies irmãs: App do Responsável, Monitor de Portaria e Painel Administrativo.


1. Propósito

Uma tela pública (Chrome em fullscreen) na portaria/recepção que mostra, ao vivo, quais crianças já foram sinalizadas para retirada e em que status — para que responsáveis e crianças acompanhem a fila num telão, sem operador. Diferente do monitor de portaria, aqui ninguém opera: é somente leitura, e por ser uma tela pública não pode exibir dado sensível.

A página é forçada em dark para contraste/legibilidade a distância (pátio), exibe um relógio de parede e um card por criança na fila. Estado vazio: "Aguardando chegadas — Use o botão 'Estou Chegando' no aplicativo".

2. Autenticação por token de kiosk

Não há login de usuário. O acesso é por um token de kiosk — um token opaco (UUID), por escola, gerado no painel administrativo:

  • Cada token pertence a uma escola, tem um rótulo e uma validade opcional, registra quem o criou e quando foi usado pela última vez, e pode ser revogado. Um token é ativo quando não está revogado E não está expirado.
  • Um middleware de validação de token protege tanto a página quanto os endpoints de suporte. O token chega via querystring ?token=… (o kiosk é aberto com a URL contendo o token) ou pelo header X-Monitor-Token.
  • O kiosk faz um heartbeat a cada 5 min (GET /api/v1/public-monitor/{school}/heartbeat): 200 = ainda válido; 401 = token rotacionado/revogado/expirado → a tela mostra o overlay "Exibição expirada. Recarregue a página." (não reconecta sozinho, para não vazar estado com token morto). O heartbeat também registra o último uso do token.

2.1 Provisionamento (no painel admin)

Os tokens são gerenciados na aba "Configurações" do detalhe da escola (superfície Painel Administrativo), restritos à permissão de configurações da escola e ao escopo da própria escola. Ações:

AçãoRota
GerarPOST /admin/schools/{school}/public-monitor-tokens
RotacionarPOST /admin/schools/{school}/public-monitor-tokens/{token}/rotate
RevogarDELETE /admin/schools/{school}/public-monitor-tokens/{token}

O admin copia a URL com o ?token= e a abre no dispositivo do kiosk em fullscreen.

3. Payload privacy-safe (5 campos)

O cartão público é a fonte única do formato exibido e impõe o requisito de privacidade: somente estes cinco campos cruzam o canal público — nunca nome completo, foto, id interno, responsável ou coordenadas.

CampoConteúdo
card_idid do sinal de chegada (UUID opaco), nunca o id do aluno — updates/fades miram o mesmo card
student_first_nameSó o primeiro nome da criança
class_nameSó a 1ª turma (expor a lista completa vazaria a rotina/extracurriculares da criança)
statusO estado de retirada (mapeado para rótulo público na tela)
sinceISO-8601 de quando entrou nesse estado (exibido como tempo relativo)

4. Tempo real (canal público)

A página assina o canal school.{id}.public-monitor — um canal público (Reverb), porque os eventos que trafegam nele já são o cartão privacy-safe de 5 campos. As credenciais vêm de GET /api/v1/public-monitor/{school}/credentials ({ key, channel }). Três eventos:

Evento (wire)Payload
ArrivalSignalCreated{ cards: [card…] } — um card por irmão do sinal
StudentStateChangedum card (5 campos)
PickupConfirmedapenas { card_id } — a criança sai da tela (fade); nenhuma identidade cruza o canal

A autorização do canal é defesa em profundidade: só autoriza quando o contexto de escola resolvido pelo token bate com a escola pedida. O verdadeiro portão é a validação do token de kiosk na página e nos endpoints.

5. Onde o código vive

Diferente das superfícies mobile/monitor (repos próprios), o painel público é servido pelo próprio backend: uma página Inertia que renderiza os sinais ativos não terminados, mais os endpoints de suporte de heartbeat e credenciais.

6. Ver também

Documentação do ionCLASS