Skip to content

Qualidade: consolidar o clamp de maxPlayers num único helper testado (clampInt) — fim do Math.min(Math.max(...)) triplicado #51

Description

@caioross

Contexto

room.ts já exporta um helper testável para clampar inteiros: clampInt(n, min, max) (src/lib/room.ts:107) — arredonda, trata NaNmin e prende em [min,max]. Mas o clamp de maxPlayers está reinventado inline em 3 pontos com Math.min(Math.max(...)):

  • src/app/api/rooms/route.ts:46Math.min(Math.max(Number(settings.maxPlayers) || 6, 2), 12)
  • src/app/api/rooms/[code]/route.ts (action settings) — Math.min(Math.max(Number(s.maxPlayers) || room.max_players, 2), 12)

Além da duplicação, há uma divergência sutil de contrato: o inline usa Number(x) || <default> (então 0/NaN/ausente caem no default 6 ou room.max_players), enquanto clampInt levaria NaNmin (2). Consolidar exige preservar a semântica "valor inválido → default, fora de faixa → clampa".

Escopo

  • Centralizar o clamp de capacidade da sala num único ponto testado, reusando clampInt, com o default explícito no chamador. Ex.: uma constante DEFAULT_MAX_PLAYERS = 6 + clampInt(settings.maxPlayers ?? DEFAULT_MAX_PLAYERS, MIN_PLAYERS, ABSOLUTE_MAX_PLAYERS) (o teto 12/ABSOLUTE_MAX_PLAYERS já existe em room.ts:104).
  • Remover o Math.min(Math.max(...)) inline dos dois arquivos de rota.

Acceptance criteria (verificáveis)

  • Nenhum Math.min(Math.max( referente a maxPlayers sobra em src/app/api/rooms/**.
  • Comportamento preservado: ausente/0/NaN/"abc" → default (6 no create; room.max_players no settings); 1→2; 99→12; 8→8. Coberto por teste Vitest sobre a função de clamp (direto no clampInt já basta se o default ficar no chamador).
  • ABSOLUTE_MAX_PLAYERS (12) e um novo MIN_PLAYERS/DEFAULT_MAX_PLAYERS como constantes nomeadas — nada de números mágicos repetidos.
  • pnpm typecheck + pnpm build verdes.

Dica de abordagem

clampInt já cobre arredondar + faixa; o único cuidado é o default para valor inválido, que fica no chamador via ?? DEFAULT. Refactor puro, sem tocar na área sagrada nem no banco.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3Algum dia / baixo impactoarea:infraCI/CD, build, tooling, deploy, deps

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions