/ Referência
Utilitários e regras de negócio
Regras de negócio compartilhadas em utils/.
10 min de leitura Editar no GitHub
A pasta utils/ reúne funções e regras de negócio compartilhadas entre páginas, componentes, hooks e rotas da aplicação.
A organização por domínio reduz a duplicação de lógica, centraliza cálculos e mantém as regras da plataforma separadas da camada visual.
1. Visão geral dos módulos
| Diretório ou arquivo | Responsabilidade |
|---|---|
utils/competitions/ |
Configuração, navegação e regras das competições. |
utils/competitions/fll/ |
Fluxos e dados específicos da FIRST LEGO League. |
utils/competitions/obr/ |
Pontuação e cronômetro do round da OBR Resgate. |
utils/data/ |
Leitura dos dados estáticos das temporadas (servidor e navegador). |
utils/EmpathyMap/ |
Análise heurística e exportação do mapa de empatia. |
utils/heatmap/ |
Gerenciamento de pontos, intensidade, estatísticas e exportação de mapas de calor. |
utils/institutional/ |
Notícias, documentos legais, comunidade e releases. |
utils/labtest/ |
Catálogo, modos de teste e estatísticas. |
utils/quickbrick/ |
Pontuação de missões, caderno do robô, cliente do R2, ArenaBuilder e StageMap. |
utils/thinklab/ |
Bibliotecas, modelos, renderização e exportação dos quadros do ThinkLab. |
utils/stagebook/ |
Escopo, permissões, validação, ordenação e ações do Stagebook. |
utils/audio.ts |
Reprodução de sons utilizados pelos cronômetros. |
utils/scores.ts |
Cálculos compartilhados de pontuação. |
utils/format-bytes.ts |
Formata tamanhos de arquivo em pt-BR. |
2. Competições
O diretório utils/competitions/ centraliza configurações utilizadas na navegação e na composição das páginas de cada competição.
Arquivos principais
| Arquivo | Responsabilidade |
|---|---|
competicoes.ts |
Define o catálogo de competições suportadas. |
competicoes-map.ts |
Associa competições aos componentes correspondentes. |
navigation.ts |
Define grupos e itens de navegação. |
hero.ts |
Centraliza a configuração visual das páginas de competição. |
routes.ts |
Lista única das rotas públicas: COMPETITION_PAGES, isPublicPath(), publicSitemapPaths(). Veja Arquitetura das rotas. |
docs.ts |
Carrega e agrupa os documentos de cada competição (/{competicao}/docs). |
bastidores.ts |
Catálogo de materiais da página Bastidores da OBR (livros, vídeos, cursos e sites). |
site.ts |
URL base do site (SITE_URL), usada no sitemap. |
Essa camada permite que a rota dinâmica /{competicao} selecione o conteúdo adequado sem distribuir condicionais específicas de cada competição pela interface.
3. Ferramentas da FIRST LEGO League
O diretório utils/competitions/fll/ concentra regras e funções reutilizáveis pelas ferramentas relacionadas à FIRST LEGO League (FLL).
3.1. Confere AI
Diretório: confere-ai/
O módulo gerencia os dados dos checklists, incluindo a criação do estado inicial, a combinação de itens padrão e personalizados, o cálculo do progresso e a persistência no navegador.
Funções principais:
createDefaultConfereAIStatemergeChecklistItemscalculateProgressfindNextPendingItemgetChecklistsForModegetConfereAIStatesetConfereAIStateresetConfereAIState
3.2. Guia de missões
Diretório: mission-guide/
Fornece tipos, normalização de dados e funções auxiliares para preparar as informações das missões para apresentação no guia.
3.3. Partiu Mesa
Diretório: partiu-mesa/
Reúne funções para o planejamento de mesa, incluindo:
- cálculos e normalização de dados;
- armazenamento local;
- geração de documentos Markdown;
- exportação em PDF;
- sincronização do relógio com a interface por meio do hook
useClockTick.
A centralização dessas operações permite reutilizar a lógica de planejamento sem concentrar todas as responsabilidades nos componentes visuais.
4. Empathy Map
Diretório: utils/EmpathyMap/
O módulo reúne funções para analisar e exportar os dados do mapa de empatia.
| Função | Responsabilidade |
|---|---|
generateHeuristicAnalysis |
Agrupa e interpreta notas relacionadas a pensamentos, sentimentos, falas e ações. |
exportMapToMarkdown |
Gera uma representação legível em Markdown. |
exportMapToCSV |
Converte os dados para um formato tabular CSV. |
downloadFile |
Inicia o download de um arquivo no navegador. |
A separação entre análise, exportação e interface permite reutilizar as operações em diferentes contextos da aplicação.
5. Heatmap
Diretório: utils/heatmap/
O módulo fornece funções para renderização, análise espacial e exportação de mapas de calor.
Funções principais
| Função | Responsabilidade |
|---|---|
renderHeatmap |
Desenha a intensidade dos pontos no mapa. |
renderTable |
Renderiza a representação da mesa. |
computeStats |
Calcula estatísticas dos dados. |
getLocalIntensity |
Consulta a intensidade próxima a uma posição. |
findNearestPoint |
Localiza o ponto mais próximo. |
getMissions |
Carrega as zonas de missão de uma temporada. |
exportCanvasPNG |
Exporta o conteúdo do canvas como PNG. |
getCanvasDataURL |
Obtém uma representação do canvas em formato Data URL. |
O hook useHeatmap utiliza essa camada para gerenciar o estado e as interações da ferramenta.
Consulte também a documentação de contextos React e hooks.
6. Pontuação e missões
6.1. Cálculos compartilhados
Arquivo: utils/scores.ts
Implementa cálculos gerais de pontuação, detalhamento por missão e soma do resultado final.
6.2. Pontuação do QuickBrick
Arquivo: utils/quickbrick/scoring.ts
O módulo converte os dados JSON brutos de uma temporada em um modelo consistente para a tabela de missões.
O processamento contempla as seguintes etapas:
- Interpretação dos tipos
switcherange. - Normalização de missões e sub-missões.
- Avaliação de pré-requisitos.
- Cálculo dos pontos obtidos e da pontuação máxima.
- Atualização de uma missão sem modificar o objeto original.
Essa estrutura permite trabalhar com missões que utilizam valores booleanos, opções, contadores, dependências e missões personalizadas.
7. LabTest
Diretório: utils/labtest/
Os módulos fornecem configurações, dados e cálculos utilizados pelas funcionalidades do LabTest.
| Arquivo | Responsabilidade |
|---|---|
catalog.ts |
Define o catálogo e os campos dos testes e identifica a variante de run (FLL, Future Edition, OBR). |
fll.ts |
Reúne regras e dados relacionados à FLL. |
future-edition.ts |
Partidas da Future Edition registradas como eventos com carimbo de tempo. O placar é recalculado reproduzindo os eventos. |
obr.ts |
Rodada da OBR Resgate: usa a pontuação de utils/competitions/obr/scoring.ts e guarda tentativas de perigos, falhas e a linha do tempo da sala. |
kit-ia.ts, obr-presets.ts |
Testes prontos do CalibraBot (kit LEGO CS & AI e OBR Resgate). |
calc.ts |
Campos calculados dos presets: calculados ao vivo no formulário e de novo no servidor. |
chart-data.ts |
Funções puras para montar e formatar os dados dos gráficos. |
mission-images.ts |
Gerado por npm run data:mission-images. Não edite à mão. |
modes.tsx |
Define as configurações dos modos de teste. |
stats.ts |
Calcula métricas e estatísticas das execuções. |
anatix/ |
Telemetria: protocol.ts (decodifica o protocolo Anatix v1), store.ts (acumula os frames) e analysis.ts (séries, mapas e estados). |
A função computeFieldStats considera o tipo de campo para produzir métricas apropriadas:
- Booleanos: métricas relacionadas a valores verdadeiro/falso.
- Numéricos: estatísticas de valores e resultados.
- Duração: métricas específicas para tempos registrados.
O módulo complementa os hooks documentados em Contextos React e hooks.
8. Stagebook: escopo, permissões e validação
Diretório: utils/stagebook/
O Stagebook utiliza regras compartilhadas para gerenciar o espaço pessoal e os espaços de equipe. Essa camada concentra verificações de escopo, permissões e integridade dos dados.
8.1. Resolução de escopo
Arquivo: scope.ts
Resolve informações relacionadas ao usuário autenticado, ao espaço atual e ao papel do membro.
Os papéis documentados são:
ownermentorcompetidorcolaborador
8.2. Controle de permissões
Arquivo: permissions.ts
| Função | Responsabilidade |
|---|---|
scopeWhere |
Vincula consultas ao usuário ou à equipe correspondente. |
requireRole |
Restringe ações conforme o papel exigido. |
assertSameScope |
Impede relacionar recursos pertencentes a espaços diferentes. |
Regra de segurança: não confie exclusivamente no identificador de um recurso recebido do cliente. As operações no servidor devem validar a autenticação, o escopo e as permissões aplicáveis antes de consultar ou modificar dados.
8.3. Validação e ordenação
| Arquivo ou módulo | Responsabilidade |
|---|---|
validation.ts |
Limpa e valida textos, UUIDs e datas; utiliza ValidationError para entradas inválidas. |
position.ts |
Calcula posições para inserir itens sem exigir a reordenação completa. |
actions/teams.ts |
Implementa operações de criação, listagem e troca de equipe. |
actions/notifications.ts |
Implementa operações de criação, listagem e marcação de notificações. |
action-result.ts |
ActionResult<T>, runAction() e unwrapAction(): erros esperados viram { ok: false, error } com mensagem em português (veja Tipagem). |
actions/tags.ts, actions/milestones.ts, actions/preferences.ts, actions/account.ts, actions/team-resources.ts |
Server Actions compartilhadas entre as ferramentas. |
team-queries.ts |
Leituras da página da equipe. Recebem um teamId já validado por requireStagebookAccess. |
league-features.ts |
O que cada liga libera no Dashboard (veja Competições). |
persona.ts |
Tipos de conta e a regra de quem pode criar equipe (personaCanCreateTeam). |
user-leagues.ts |
Ligas que o usuário acompanha, ordenadas por código. |
usage.ts |
Consumo do usuário: quantos itens tem e quanto espaço ocupam. |
preferences-core.ts |
Leituras de preferências usadas pelo servidor, fora de arquivos "use server". |
A centralização dessas regras favorece a consistência entre as operações e reduz a duplicação de verificações.
9. Conteúdo institucional
Diretório: utils/institutional/
Os módulos abstraem o carregamento de informações institucionais, permitindo que diferentes páginas reutilizem as mesmas fontes de dados.
| Arquivo | Responsabilidade |
|---|---|
news.ts |
Lista notícias e busca uma notícia pelo slug. |
legal.ts |
Lista documentos legais e carrega documentos específicos. |
github.ts |
Consulta releases do GitHub. |
community.ts |
Disponibiliza os canais da comunidade. |
As páginas institucionais e o sitemap reutilizam essas funções para manter uma única fonte de verdade para o conteúdo correspondente.
10. Áudio
Arquivo: utils/audio.ts
A função playSound(type) centraliza a reprodução dos sons utilizados pelos cronômetros.
Os tipos documentados são:
startwarningendtick
Com essa abstração, os cronômetros podem solicitar a reprodução de um som sem precisar conhecer os caminhos dos arquivos de áudio.
11. OBR
Diretório: utils/competitions/obr/
| Arquivo | Responsabilidade |
|---|---|
scoring.ts |
Regras de pontuação do Resgate: HAZARD_DEFS, checkpointRate(), multiplicadores de vítimas e breakdown(round), que devolve base, multiplicador, total e tempo de desempate. |
types.ts |
Round, Hazards e Checkpoint. |
roundTimer.ts |
Estado do cronômetro do round: 2 min de calibração, 5 min de round e −1 min por desistência de checkpoint. |
scoring.test.ts |
Testes da pontuação. |
O Pontuador (components/competicoes/OBR/score/) e o LabTest (utils/labtest/obr.ts) chamam o mesmo breakdown(), então os dois sempre dão o mesmo resultado. Mudanças de regra devem acontecer só em scoring.ts.
Dica
breakdown()calcula em décimos inteiros (13,11,15) em vez de1.3,1.1e1.5, para evitar erros de ponto flutuante. Mantenha esse padrão ao adicionar multiplicadores.
12. Dados estáticos
Diretório: utils/data/
| Arquivo | Onde roda | Responsabilidade |
|---|---|---|
static-data.ts |
Servidor | Importa os JSON de public/data/ (MISSIONS_CATALOG, FUTURE_EDITION_DATA, TOOLS_ABOUT). Como são importados, entram no bundle do servidor no build, sem ler o disco a cada requisição. |
missions-client.ts |
Navegador | Ponto único para componentes cliente carregarem missões: loadMissionCatalog(), loadSeasonMissions(season), loadMissionSource(). Usa as rotas /api/data/missions/*. |
Importante
Componentes cliente não devem importar
missions.jsondiretamente. Isso colocaria todas as temporadas no JavaScript da página. UseloadSeasonMissions(), que baixa só a temporada necessária.
13. QuickBrick: caderno, ArenaBuilder e StageMap
Caderno do robô
| Arquivo | Responsabilidade |
|---|---|
notebook.ts |
Tipos e limites compartilhados por cliente e servidor: NOTEBOOK_MAX_PHOTOS, PHOTO_MAX_BYTES, STUDIO_MAX_BYTES, PHOTO_TYPES, DIAGRAM_KINDS. |
r2.ts |
Cliente mínimo do Cloudflare R2 (aws4fetch). Assina URLs para upload direto e confere o objeto com HEAD. Só no servidor (server-only). |
ArenaBuilder (OBR Prática)
Diretório: utils/quickbrick/ArenaBuilder/
| Arquivo | Responsabilidade |
|---|---|
types.ts |
Shape, Hazard, Rot (0–3, em passos de 90°), Tile, Board, Wall. |
tiles.ts |
Ladrilhos de 30 cm, formatos, perigos e conexões. |
rescue.ts |
Geometria da sala de resgate: paredes, porta, cantos, vítimas. |
project.ts |
Colisões entre tablados e com a sala, posição livre para a sala e sanitizeProject() para dados vindos do cliente. |
analysis.ts |
analyzePath() e analyzeRescue(): conferências do percurso (tablados sobrepostos, elementos obrigatórios) e linhas de pontuação. |
export.ts |
Exporta a arena em SVG e PNG, sem as camadas de interação. |
StageMap (OBR Artística)
Diretório: utils/quickbrick/StageMap/
| Arquivo | Responsabilidade |
|---|---|
types.ts |
Pontos em cm (origem no canto superior esquerdo do palco; a borda de baixo é a plateia), marcações de chão, desenhos e atores. |
stage.ts |
Medidas e regras tiradas do manual da OBR Robótica Artística 2026, além de cores e tamanhos padrão dos atores. |
14. ThinkLab
Diretório: utils/thinklab/
| Arquivo | Responsabilidade |
|---|---|
templates.ts |
Modelos prontos (DIAGRAM_TEMPLATES): Ishikawa, 5W2H, mapa de empatia, fluxogramas. |
component-library.ts |
Blocos de fluxograma, arquitetura e dados (COMPONENT_LIBRARY). |
graphic-assets.ts |
Elementos gráficos prontos, como mockups de interface. |
icon-library.tsx |
Ícones Lucide inseríveis. O elemento guarda só a chave (iconName); getIconSvgMarkup() e getIconDataUrl() geram a imagem. |
emoji-library.ts |
Catálogo de emojis por categoria. |
mission-cards.ts |
Cartões de missões liberados pelas ligas do usuário. |
rough-renderer.ts |
Traço "à mão" com roughjs: setas, curvas de Bézier e formas especiais. |
smart-snapping.ts |
Guias de alinhamento ao arrastar elementos (computeSmartSnapping()). |
media-cache.ts |
Cache das imagens usadas pelo canvas. |
svg-exporter.ts |
Exporta o quadro em SVG e PNG (exportToSvgString(), downloadSvg(), downloadPng()). |
jsonb-exporter.ts |
Formato jsonb usado para salvar o quadro no Postgres e a validação desse formato. |
utils.ts |
cn(), que junta classes CSS. |
15. Formatação
Arquivo: utils/format-bytes.ts
formatBytes(bytes) formata tamanhos em B, KB, MB e GB (base 1024), no padrão pt-BR. É usado no caderno do robô e no consumo de armazenamento.
16. Onde colocar um utilitário novo
| Se a função… | Coloque em |
|---|---|
| implementa uma regra de uma competição (pontuação, tempo) | utils/competitions/<competicao>/ |
| é usada por uma única ferramenta | utils/<ferramenta>/ |
| lê ou grava no banco com escopo e permissão | utils/stagebook/ (ou o actions.ts da rota) |
| só roda no servidor | importe server-only no topo do arquivo |
| é usada por cliente e servidor | mantenha sem dependências de servidor (sem db, cookies, fs) |
| é um formato compartilhado entre domínios | o tipo vai para types/ (veja Tipagem) |
17. Boas práticas para novos utilitários
Ao adicionar ou modificar regras compartilhadas no RoboStage:
- Organize por domínio: mantenha a lógica no módulo correspondente à funcionalidade.
- Prefira funções puras: para cálculos que não dependem de estado ou efeitos colaterais.
- Valide dados externos: verifique entradas antes de normalizar ou processar os dados.
- Preserve a segurança no servidor: não dependa de verificações executadas exclusivamente em componentes do cliente para autorizar operações.
- Evite mutações desnecessárias: preserve os objetos de entrada quando a operação puder retornar uma nova estrutura.
- Atualize a documentação: inclua novos módulos nesta página quando passarem a fazer parte da arquitetura compartilhada.
18. Documentação relacionada
- Páginas e rotas — catálogo das páginas e dos caminhos da aplicação.
- Referência de APIs — endpoints utilizados pelo sistema.
- Contextos React e hooks — estado compartilhado e lógica reutilizável da interface.
- Tipagem — tipos, validação e padrões de TypeScript.
- Competições — o que cada competição oferece.
Algo errado ou faltando nesta página? Sugira uma edição.