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.
Os módulos estão organizados em três grupos de domínio:
seguranca/)JwtAuthGuard, RolesGuard.@CurrentUser(), @Roles(), @CurrentProjeto().operacional/)projeto_usuario.inteligencia/)| Método | Rota | Descrição |
|---|---|---|
| POST | /auth/login | Login com email e senha |
| POST | /auth/social | Login via OAuth (Google/Facebook) |
| GET | /auth/me | Dados do usuário autenticado |
| Método | Rota | Descrição |
|---|---|---|
| GET | /projeto | Lista projetos do usuário |
| POST | /projeto | Cria novo projeto |
| Método | Rota | Descrição |
|---|---|---|
| GET | /esqueleto | Lista todos os esqueletos |
| GET | /esqueleto/:id | Busca um esqueleto por ID |
| POST | /esqueleto | Cria novo esqueleto |
| PATCH | /esqueleto/:id | Atualiza um esqueleto |
| DELETE | /esqueleto/:id | Remove um esqueleto |
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);
}
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
@UseGuards(JwtAuthGuard) em rotas protegidas.idEmpresa como parâmetro — nunca extraem do JWT internamente.class-validator para validação automática via ValidationPipe.idEmpresa para garantir isolamento multi-tenant.@ayla/shared para manter consistência com o frontend.