Aplicação fullstack em um único app Next.js: as telas e a API (/api/*) rodam no mesmo processo,
no mesmo domínio e porta (sem CORS). O antigo backend NestJS foi incorporado ao app Next.js.
app/ App Next.js (telas + rota /api/[...path])
components/ Componentes visuais compartilhados
services/ Acesso à API e funções do servidor
src/ regras de negócio, rotas, autenticação e agendador
<modulo>/ <modulo>.service.ts + <modulo>.routes.ts (+ tests)
container.ts instâncias dos services (substitui a injeção do Nest)
rotas.ts registro de todas as rotas
prisma/ schema, migrações, seed e scripts de dados (banco SISAR)
sgu/ schema do banco SGU (somente leitura)
docs/ Plano e histórico da migração do NestJS para o Next
- Node 20+ (testado com 24), npm 11
- MySQL 8 (banco
sisar) e acesso de leitura ao SGU
Crie .env.local na raiz (não versionado). É a única fonte de variáveis: o app e os
scripts de banco leem este arquivo. Veja example.env para a lista completa.
| Variável | Uso |
|---|---|
DATABASE_URL, SGU_DATABASE_URL |
bancos SISAR e SGU |
JWT_SECRET, RT_SECRET |
assinatura dos tokens de acesso (15 min) e refresh (7 dias) |
AUTH_SECRET, AUTH_URL |
next-auth (sessão das telas) |
NEXT_PUBLIC_API_URL |
URL da API integrada ao Next, com barra final (ex.: http://localhost:3098/api/); é embutida no build |
ENVIRONMENT |
local aceita o login de qualquer usuário já cadastrado, sem consultar o serviço de autenticação |
LDAP_SERVER, LDAP_DOMAIN, LDAP_BASE, USER_LDAP, PASS_LDAP |
login por LDAP (não local) |
LDAP_API_URL |
base da API de autenticação LDAP (http://api.smul.pmsp), usada para validar login/senha e buscar dados de novos usuários |
API_FERIADOS_URL |
consulta de feriados para cálculo de dias úteis |
RESEND_API_KEY, RESEND_FROM |
envio dos relatórios agendados por e-mail |
AGENDADOR |
off desliga as tarefas agendadas nesta instância |
npm install # instala e gera os clientes Prisma (postinstall)
npm run dev # app fullstack Next (telas + API) em http://localhost:3098
npm test # testes da API (Jest)
npm run lintO repositório usa um único package.json na raiz, sem npm workspaces ou pacote de API separado.
O produto executado em desenvolvimento e produção é um único processo Next.js na raiz.
Banco (a partir da raiz, usando o .env.local do app):
npm run db:migrate:dev # cria/aplica migração em desenvolvimento
npm run db:migrate:deploy # aplica migrações existentes
npm run db:seed # dados iniciais, categorias e tipos de alvará
npm run prisma:generate # regenera clientes (com os servidores parados)O seed cadastra ou atualiza, de forma idempotente, as categorias R, HIS, HMP
e CAEPP, os pareceres Ausência de Documentos e Não Cumprimento de Requisito,
além dos tipos de alvará e seus prazos institucionais. Ele não remove registros
existentes.
Veja docs/deploy.md.
Iniciadas pelo instrumentation.ts quando o servidor sobe: reconsideração de admissibilidade
(todo dia 06:00) e envio de relatórios agendados (a cada minuto). Com mais de uma instância,
o envio de relatórios não duplica (reivindicação atômica no banco); desligue as demais com AGENDADOR=off
se preferir uma só executando.
src/<modulo>/<modulo>.service.ts(recebePrismaServiceetc. no construtor).<modulo>.routes.tscomcontroller('<prefixo>', [rota.get(...), ...]); userecursos: [...]para a permissão exigida (sem isso exige o recursoprocessos;['*']= qualquer logado;publica: true= sem login).- Instancie o service em
container.ts, registre emdependencias.tse as rotas emrotas.ts. O testetests/container.spec.tsavisa se algo ficar fora de sincronia.