# Relatório de Auditoria Completa – API e Frontend

**Data:** 10/03/2025  
**Escopo:** `api/`, `frontend/` (Next.js App Router + API v2 PHP)

---

## 1. Resumo executivo

- **Frontend:** Next.js (App Router), 138 páginas (`app/**/page.tsx`), 22 módulos de API em `lib/api/`.
- **Backend:** API v2 em PHP com roteador customizado em `api/src/Http/Router.php`, 50+ controllers, serviços e DAOs.
- **Sintaxe PHP:** Todos os arquivos PHP da API verificados com `php -l` — **nenhum erro de sintaxe**.
- **Rotas frontend:** Nenhuma rota quebrada ou duplicada identificada; imports `@/` consistentes.
- **Chamadas API vs backend:** Todas as rotas chamadas pelo frontend existem no `Router.php`; um ajuste de tipo e um de URL base foram feitos no frontend.

---

## 2. Rotas do frontend (Next.js App Router)

As rotas são definidas por arquivos em `app/`. Não há React Router; o roteamento é file-based.

### 2.1 Listagem das rotas (principais)

| Rota | Arquivo | Observação |
|------|---------|------------|
| `/` | `app/page.tsx` | Home |
| `/login` | `app/login/page.tsx` | |
| `/cadastro` | `app/cadastro/page.tsx` | |
| `/recuperar-senha` | `app/recuperar-senha/page.tsx` | |
| `/confirmar-email` | `app/confirmar-email/page.tsx` | |
| `/minha-conta` | `app/minha-conta/page.tsx` | Redireciona para `/conta/saldo` |
| `/conta/saldo` | `app/conta/saldo/page.tsx` | |
| `/conta/jogos` | `app/conta/jogos/page.tsx` | |
| `/conta/perfil` | `app/conta/perfil/page.tsx` | |
| `/conta/resgate` | `app/conta/resgate/page.tsx` | |
| `/conta/lembretes` | `app/conta/lembretes/page.tsx` | |
| `/conta/creditos` | `app/conta/creditos/page.tsx` | |
| `/conta/assinaturas` | `app/conta/assinaturas/page.tsx` | |
| `/conta/fidelidade` | `app/conta/fidelidade/page.tsx` | |
| `/conta/preferencias-comunicacao` | `app/conta/preferencias-comunicacao/page.tsx` | |
| `/carrinho` | `app/carrinho/page.tsx` | |
| `/comprar-creditos` | `app/comprar-creditos/page.tsx` | |
| `/loterias` | `app/loterias/page.tsx` | |
| `/premios` | `app/premios/page.tsx` | |
| `/parceiros` | `app/parceiros/page.tsx` | |
| `/depoimentos` | `app/depoimentos/page.tsx` | |
| `/noticias` | `app/noticias/page.tsx` | |
| `/noticias/[slug]` | `app/noticias/[slug]/page.tsx` | |
| `/instantaneas` | `app/instantaneas/page.tsx` | |
| `/quem-somos` | `app/quem-somos/page.tsx` | |
| `/como-funciona` | `app/como-funciona/page.tsx` | |
| `/termos` | `app/termos/page.tsx` | |
| `/politica-privacidade` | `app/politica-privacidade/page.tsx` | |
| `/atendimento` | `app/atendimento/page.tsx` | |
| `/ajuda` | `app/ajuda/page.tsx` | |
| `/cookies` | `app/cookies/page.tsx` | |
| `/indique` | `app/indique/page.tsx` | |
| `/criar-bolao` | `app/criar-bolao/page.tsx` | |
| `/em-construcao` | `app/em-construcao/page.tsx` | |
| `/loteca` | `app/loteca/page.tsx` | (fora de escopo v2) |
| `/campanha` | `app/campanha/page.tsx` | |
| `/afiliado` | `app/afiliado/page.tsx` | |
| `/doctor` | `app/doctor/page.tsx` | |
| `/doctor/erre-4` | `app/doctor/erre-4/page.tsx` | |
| `/doctor/erre-5` | `app/doctor/erre-5/page.tsx` | |
| `/doctor/erre-7` | `app/doctor/erre-7/page.tsx` | |
| `/doctor/checkout` | `app/doctor/checkout/page.tsx` | |
| `/doctor/fechamentos` | `app/doctor/fechamentos/page.tsx` | |
| `/[loteria]/estatisticas/[tipo]` | `app/[loteria]/estatisticas/[tipo]/page.tsx` | Ex.: `/mega-sena/estatisticas/numeros-que-mais-saem` |
| `/mega-sena`, `/mega-sena/boloes`, `/mega-sena/resultados`, etc. | `app/mega-sena/**/page.tsx` | |
| `/lotofacil`, `/quina`, `/dupla-sena`, `/timemania`, `/lotomania`, `/dia-de-sorte`, `/super-sete`, `/mais-milionaria` | `app/{loteria}/**/page.tsx` | Padrão por loteria |
| `/admin` | `app/admin/page.tsx` | |
| `/admin/login` | `app/admin/login/page.tsx` | |
| `/admin/pedidos`, `/admin/pedidos/[id]` | `app/admin/pedidos/**/page.tsx` | |
| `/admin/clientes`, `/admin/clientes/[id]` | `app/admin/clientes/**/page.tsx` | |
| `/admin/boloes`, `/admin/boloes/criar`, `/admin/boloes/[id]` | `app/admin/boloes/**/page.tsx` | |
| `/admin/concursos`, `/admin/concursos/[id]` | `app/admin/concursos/**/page.tsx` | |
| `/admin/loterias`, `/admin/loterias/nova`, `/admin/loterias/[id]` | `app/admin/loterias/**/page.tsx` | |
| `/admin/matrizes`, `/admin/matrizes/nova`, `/admin/matrizes/[id]` | `app/admin/matrizes/**/page.tsx` | |
| `/admin/noticias`, `/admin/noticias/novo`, `/admin/noticias/[id]` | `app/admin/noticias/**/page.tsx` | |
| `/admin/depoimentos`, `/admin/parceiros`, `/admin/afiliados` | `app/admin/**/page.tsx` | |
| `/admin/configuracoes`, `/admin/relatorio`, `/admin/newsletter`, `/admin/campanhas`, `/admin/usuarios`, `/admin/resgates` | `app/admin/**/page.tsx` | |

### 2.2 Verificações

- **Rotas quebradas:** Nenhuma. Todos os `href` e `Link` verificados apontam para `page.tsx` existentes.
- **Imports incorretos:** Nenhum. Imports com alias `@/` referem-se a `components/`, `lib/api/`, `lib/hooks/`, `lib/constants/` existentes.
- **Páginas inexistentes:** Nenhuma rota definida sem página correspondente.
- **Rotas duplicadas:** Nenhuma; App Router não permite duplicidade por definição de arquivo único por path.

---

## 3. Chamadas de API (frontend) vs rotas PHP (backend)

### 3.1 Módulos de API do frontend

- `lib/api/client.ts` – `apiGet`, `apiPost`, `apiDelete` (base URL única)
- `lib/api/admin.ts` – Admin: auth, dashboard, pedidos, clientes, bolões, resgates, depoimentos, parceiros, config, campanhas, newsletter, afiliados, loterias, matrizes, concursos, noticias, usuarios
- `lib/api/auth.ts` – login, logout, me, recuperar-senha, cadastro
- `lib/api/boloes.ts` – GET boloes, GET boloes/:id/jogos
- `lib/api/carrinho.ts` – GET/POST/DELETE carrinho, finalizar
- `lib/api/config.ts` – estatisticas, horarios-bloqueio, concursos-home, concursos-especiais, boloes-recomendados, promocoes
- `lib/api/conta.ts` – saldo, codigo-indicacao, indicacoes, jogos, premiacoes, perfil, enderecos, limites, assinaturas, resgates, resgate (POST), alterar-senha, excluir, pedidos-credito, preferencias-comunicacao, fidelidade, lembretes, estender-teimosinha
- `lib/api/concursos.ts` – GET concursos, GET concursos/especial
- `lib/api/creditos.ts` – pedido (POST/GET), pix, mp, pagseguro/session, boleto-pagseguro, cielo, gateways
- `lib/api/depoimentos.ts` – GET depoimentos (via apiGet)
- `lib/api/doctor.ts` – numeros-mais-sorteados, gerar-apostas-erre, gerar-apostas-fechamento, conferir, adicionar-ao-carrinho
- `lib/api/estatisticas.ts` – GET estatisticas/:sigla/numeros-mais-sorteados, maiores-premios, premios-estado, testador
- `lib/api/favoritos.ts` – GET/POST/DELETE conta/favoritos
- `lib/api/instantaneas.ts` – tipos, comprar, bilhete/:id/revelar, bilhetes
- `lib/api/loterias.ts` – GET loterias, GET loterias/:sigla
- `lib/api/newsletter.ts` – POST newsletter
- `lib/api/noticias.ts` – GET noticias, GET noticias/:slug
- `lib/api/parceiros.ts` – GET parceiros
- `lib/api/preco.ts` – GET preco
- `lib/api/premios.ts` – GET premios
- `lib/api/push.ts` – GET/POST conta/push-subscribe
- `lib/api/resultados.ts` – GET resultados
- `lib/api/times.ts` – GET times (Timemania)

Todas as rotas acima existem no `api/src/Http/Router.php` e estão mapeadas para o controller/método correto.

### 3.2 Inconsistências encontradas e correções

1. **Tipo em `LoteriaNoticiasPage.tsx`**  
   - **Problema:** Uso de `apiGet<{ id: number }>` para `GET /api/v2/loterias/:slug`, que na verdade retorna o objeto completo `Loteria`.  
   - **Correção:** Tipo alterado para `apiGet<Loteria>` e import de `Loteria` de `@/lib/api/loterias`.

2. **URL base em `client.ts`**  
   - **Problema:** `apiPost` e `apiDelete` usavam `${API_BASE}${path}`; com `API_BASE` vazio em SSR (Node), a URL poderia ficar apenas `path` (ex.: `/api/v2/...`) e o comportamento dependia do ambiente.  
   - **Correção:** Criada função `getBaseUrl()` (reutilizando a lógica do `apiGet`) e uso de `getBaseUrl()` em `apiPost` e `apiDelete` para manter a mesma base (origin ou `http://localhost:3000` em Node).

---

## 4. Análise do código PHP (api/)

### 4.1 Sintaxe

- Comando: `php -l` em todos os arquivos em `api/public`, `api/src/Http`, `api/src/Controller`, `api/src/Service`, `api/src/Dao`, `api/src/Conferencia`, `api/src/Util`.
- **Resultado:** Nenhum erro de sintaxe detectado.

### 4.2 Endpoints e parâmetros

- O roteador trata método HTTP e segmentos de path de forma consistente.
- Recursos: `loterias`, `times`, `concursos`, `boloes`, `carrinho`, `auth`, `preco`, `resultados`, `conta`, `creditos`, `webhooks`, `conferencia`, `cron`, `health`, `config`, `depoimentos`, `premios`, `newsletter`, `noticias`, `estatisticas`, `admin`, `instantaneas`, `doctor`, `parceiros`.
- Subrotas de `conta` (perfil, enderecos, favoritos, push-subscribe, limites, assinaturas, resgates, resgate POST, alterar-senha, excluir, pedidos-credito, preferencias-comunicacao, fidelidade, lembretes) estão implementadas no `Router` e nos controllers.

### 4.3 Segurança básica

- **Entrada:** Uso de `(int)`, `trim()`, `(float)` e validações em controllers para limitar tipos e tamanhos.
- **SQL:** Uso de prepared statements em serviços verificados (ex.: `PushSubscriptionService`, `InstantaneaService`); recomenda-se revisar todos os DAOs para garantir que não haja concatenação direta de input em SQL.
- **Auth:** Área admin protegida por `requireAdminAuth()`; rotas de cliente dependem de sessão (ex.: `ClienteService::getIdClienteLogado()`).
- **Cron:** Endpoints em `handleCron` protegidos por `CRON_SECRET` e `hash_equals`.
- **Webhooks:** Gerencianet e Mercado Pago tratados em controllers dedicados.

Nenhuma chamada a `eval`, `shell_exec`, `system` ou `passthru` foi encontrada nos arquivos da API.

### 4.4 Funções obsoletas

- Não foi feita varredura profunda de funções deprecadas do PHP; código usa tipos e namespaces modernos. Recomenda-se rodar análise estática (ex.: PHPStan/Psalm) em outro momento.

---

## 5. Arquivos corrigidos

| Arquivo | Alteração |
|---------|-----------|
| `frontend/components/noticias/LoteriaNoticiasPage.tsx` | Tipo da resposta de `GET /api/v2/loterias/:slug` de `{ id: number }` para `Loteria` e import de `@/lib/api/loterias`. |
| `frontend/lib/api/client.ts` | Função `getBaseUrl()` e uso em `apiPost` e `apiDelete` para URL base consistente (incluindo SSR). |

---

## 6. Melhorias recomendadas

### 6.1 Frontend

- **Testes E2E:** Cobrir fluxos críticos (login, carrinho, finalização, conta, admin) com Playwright ou Cypress.
- **Tipos:** Manter tipagem forte nos módulos `lib/api` e alinhar tipos com o que a API realmente retorna (evitar `{ id: number }` quando o contrato é um objeto maior).
- **Tratamento de erro:** Padronizar mensagens e códigos de erro da API no cliente (ex.: mapear `error` do JSON para mensagens amigáveis).
- **SSR/API URL:** Em ambientes onde o front e a API estão em domínios diferentes, definir `NEXT_PUBLIC_API_URL` para que `getBaseUrl()` aponte corretamente em SSR.

### 6.2 Backend (API)

- **Análise estática:** Introduzir PHPStan ou Psalm com nível 5+ para tipos e possíveis bugs.
- **Documentação da API:** Manter `api/docs/openapi.yaml` em dia com todas as rotas e exemplos de request/response.
- **Logs e monitoramento:** Garantir que erros 5xx e falhas de autenticação sejam logados (ex.: `Logger` em `api/src/Util/Logger.php`) e, se possível, enviados para Sentry ou similar.
- **Rate limiting:** Considerar limite de requisições por IP/usuário em login, cadastro e endpoints de pagamento.

### 6.3 Geral

- **Health check:** O frontend pode chamar `GET /api/v2/health` antes de rotas sensíveis para garantir que a API está viva.
- **CORS:** Se a API for acessada de outro domínio, revisar headers CORS e credenciais (`credentials: 'include'`).

---

## 7. Conclusão

O projeto está consistente entre frontend e backend: rotas do App Router existem e estão referenciadas corretamente, e as chamadas de API possuem contrapartida no `Router.php`. A sintaxe PHP da API está íntegra. Foram aplicadas duas correções no frontend (tipo em `LoteriaNoticiasPage` e URL base em `client.ts`). As melhorias sugeridas são evolução de qualidade e segurança, não bloqueantes para o uso atual.
