mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-14 08:53:11 +00:00
3.5 KiB
3.5 KiB
Impl: P6-2 — page-gate dodge on /campanha/perfil
Status: aprovado Atualizado em: 2026-08-25 Intenção: docs/plans/entrega-engenharia-p6.md Appetite restante: 0.5 dia
Leitura da intenção
- Outcome:
perfil/page.tsxpassa a obter o ator pelorequireCampaignPageActor(P3-I), e o guard de convenção deixa de ser dodge-ável por variante de nome degetCampaignUser*. - O que NÃO negociar: sem migration, sem mudança de URL (
/campanha/perfil), guard classe 3, líder "as good or better" (nunca tela em branco). - O que reavaliar: gate
noLeaderem /perfil quebraria reset de senha e self-service do líder (redefinir-senha/page.tsx:31,esqueci-senha/page.tsx:20,actions/password.ts:137redirecionam para/campanha/perfil) — sem gate (precedentemeus-contatos/page.tsx:16).
Abordagem recomendada
Opções consideradas: A | B | C
Recomendação: C — requireCampaignPageActor ganha opção withAvatar?: boolean; a página chama só o helper e o guard alarga o regex sem allowlist.
Rejeitadas: A (mantém a chamada variante na página — exige allowlist + 1 leitura extra por request); B (manter só getCampaignUserWithAvatar + redirect hand-rolled — perpetua a divergência P3-I).
Componentes / mudanças
requireCampaignPageActor(src/utilities/campaignPageActor.ts): opçãowithAvatar?: boolean—const getter = options.withAvatar ? getCampaignUserWithAvatar : getCampaignUser. Ambos retornamAuthenticatedCampaignUser | null; avatar só populado em runtime. Comentário justificando (shell de perfil renderizaavatarUrl; avatar depth-0 vira número ID). Atualizar doc-block das gates.perfil/page.tsx:requireCampaignPageActor({ withAvatar: true }); removeredirectmanual, checkif (!user)e import degetCampaignUserWithAvatar. VERIFICAR antes: nenhum outropage.tsxde(app)casa o regex alargado (grep -rn "getCampaignUser[A-Za-z0-9]*(" src/app/\(campaign\)/campanha/\(app\) --include="page.tsx").- Guard (
tests/unit/codebaseConventions.unit.spec.ts:528-548): regex →/getCampaignUser[A-Za-z0-9]*\(/+ prosa atualizada;allowlistcontinua vazia. - Testes: caso unit novo no spec de gate de página/ator (
withAvatar: trueusa o getter de avatar e redireciona quando null). - Migration: sem migration. Access/Consent: sem mudança.
Fases verificáveis
- Helper + página —
withAvatar+ troca na página + caso unit. - Guard — alargar regex;
pnpm vitest run tests/unit/codebaseConventions.unit.spec.tsbare. - Gates —
pnpm gate:fast; push viapnpm push.
Rabbit holes / Não escopo
- Migrar o layout para
requireCampaignPageActor(layout não é route page; fora do finding). - Gate
noLeaderem /perfil (decisão de produto, não engenharia). - Derivar
getCampaignUserWithAvatardegetCampaignUserviadepthopcional (refactor além do finding).
Riscos e mitigação
- Dois getters, mesmo tipo de retorno —
tsc --noEmitvalida. - Guard alargado pegando página futura legítima: fail-closed é desejado; saída = allowlist com razão.
- Regressão de avatar:
withAvatar: truepreserva o comportamento atual.
Aceite de engenharia
- Aceite de produto coberto (perfil alcançável por todos os roles autenticados)
- Invariantes AGENTS/engineering-standards (sem migration, URL intacta, prologue único)
- Testes previstos: caso unit
withAvatar+ spec de convenção verde
Self-score decision-quality: 5/5