Ayla Painel

Backend — NestJS

Visão Geral

O backend é uma API REST desenvolvida em NestJS com TypeScript, rodando na porta 9002. Utiliza Prisma ORM para acesso ao banco PostgreSQL e BullMQ para processamento de filas via Redis. A autenticação é feita via JWT, com suporte a login social (Google e Facebook) via Passport.js.

Módulos

Os módulos estão organizados em três grupos de domínio:

1. Segurança (seguranca/)

  • AuthModule — Autenticação de usuários.
    • Suporte a login por email/senha e OAuth (Google, Facebook).
    • Geração e validação de tokens JWT (padrão de expiração: 8h).
    • Guards: JwtAuthGuard, RolesGuard.
    • Decorators: @CurrentUser(), @Roles(), @CurrentProjeto().
  • EmpresaModule — Gerenciamento de empresas (em desenvolvimento).
  • IntegracaoModule — Integrações com serviços externos (em desenvolvimento).

2. Operacional (operacional/)

  • ProjetoModule — Gerenciamento de projetos.
    • Lista projetos do usuário (próprios e compartilhados).
    • Criação de novos projetos.
    • Compartilhamento via tabela projeto_usuario.
  • EsqueletoModule — CRUD de templates/esqueletos.
    • Trilha de auditoria completa (criação, modificação, usuário responsável).
  • ConhecimentoModule — Base de conhecimento (em desenvolvimento).

3. Inteligência (inteligencia/)

  • AgenteModule — Gerenciamento dos agentes de IA.
  • RotinaModule — Configuração de rotinas de automação.
  • ExecucaoModule — Rastreamento de execuções de jobs.
  • AprovacaoModule — Fluxo de aprovação de resultados.
  • ChatModule — Gerenciamento de conversas com agentes.
  • IaModule — Integração com a API da Anthropic (Claude).

Endpoints Implementados

Autenticação

MétodoRotaDescrição
POST/auth/loginLogin com email e senha
POST/auth/socialLogin via OAuth (Google/Facebook)
GET/auth/meDados do usuário autenticado

Projetos

MétodoRotaDescrição
GET/projetoLista projetos do usuário
POST/projetoCria novo projeto

Esqueletos (Templates)

MétodoRotaDescrição
GET/esqueletoLista todos os esqueletos
GET/esqueleto/:idBusca um esqueleto por ID
POST/esqueletoCria novo esqueleto
PATCH/esqueleto/:idAtualiza um esqueleto
DELETE/esqueleto/:idRemove um esqueleto

Autenticação e Proteção de Rotas

Todas as rotas protegidas devem usar o guard JwtAuthGuard:

@UseGuards(JwtAuthGuard)
@Get()
findAll(@CurrentUser() user: UsuarioJwt) {
  return this.service.findAll(user.idEmpresa);
}

O decorator @CurrentProjeto() extrai o idProjeto do header X-Projeto-Id:

@Get()
findAll(
  @CurrentUser() user: UsuarioJwt,
  @CurrentProjeto() idProjeto: number
) {
  return this.service.findAll(user.idEmpresa, idProjeto);
}

Variáveis de Ambiente

Crie o arquivo packages/backend/.env com as seguintes variáveis:

DATABASE_URL="postgresql://usuario:senha@localhost:5432/db_ayla"
JWT_SECRET=chave-secreta-aleatoria
JWT_EXPIRES_IN=8h
PORT=9002
REDIS_HOST=localhost
REDIS_PORT=6379
ANTHROPIC_API_KEY=sua-chave-anthropic
OPENAI_API_KEY=sua-chave-openai
CORS_ORIGINS=http://localhost:3002

Boas Práticas

  • Controllers sempre usam @UseGuards(JwtAuthGuard) em rotas protegidas.
  • Services sempre recebem idEmpresa como parâmetro — nunca extraem do JWT internamente.
  • Use DTOs com decorators do class-validator para validação automática via ValidationPipe.
  • Queries Prisma são sempre filtradas por idEmpresa para garantir isolamento multi-tenant.
  • Importe tipos do pacote @ayla/shared para manter consistência com o frontend.