Aceito Data: 2026-03-06
O sistema precisa suportar tanto rotas publicas (ex: listar listings) quanto rotas protegidas (ex: criar property). Anteriormente, o contextPlugin rejeitava qualquer request sem JWT, exceto rotas numa allowlist hardcoded (PUBLIC_PREFIXES). Esse padrao fazia o plugin global decidir quais rotas sao publicas, o que e fragil e escala mal.
Alem disso, existem tres niveis de acesso distintos:
O contextPlugin nunca rejeita requests por falta de token. Ele sempre popula o ApplicationContext:
user = AuthenticatedUseruser = nullA autenticacao e autorizacao sao aplicadas por rota via hooks onRequest, nao globalmente:
authGuard — exige user !== null (login obrigatorio, qualquer role)roleGuard('HOST') — exige autenticacao + role especifica (verifica null implicitamente)Como user e nullable no contexto, uma funcao utilitaria getAuthenticatedUser() faz o narrowing seguro, retornando AuthenticatedUser (non-null) ou lancando 401. Isso evita non-null assertions (!) e centraliza a logica num unico ponto reutilizavel.
ApplicationContext.user e AuthenticatedUser | null, forcando o TypeScript a exigir tratamento de null em qualquer acesso ao usuarioonRequest: [authGuard] ou onRequest: [roleGuard('HOST')]