Pular para conteúdo

Debug

Guia completo de debug da integração Nayax → Saipos.

Habilitar Logs Detalhados

Variáveis de Ambiente

# Logs verbosos
LOG_LEVEL=debug

# Logar corpo das requisições Saipos
LOG_SAIPOS_BODY=true

# Node.js debug
DEBUG=*

Restart da Aplicação

# Development
npm run start:dev

# Production com logs
LOG_LEVEL=debug npm run start:prod

Ver Logs em Tempo Real

Logs Gerais

# Todos os logs
tail -f logs/app.log

# Últimas 100 linhas
tail -100 logs/app.log

# Seguir logs com grep
tail -f logs/app.log | grep -E "ERROR|WARN"

Logs Específicos

# Webhooks Nayax
tail -f logs/app.log | grep NAYAX

# Processamento Saipos
tail -f logs/app.log | grep SAIPOS

# Jobs
tail -f logs/app.log | grep "JOB\|JobsProcessor"

# Erros
tail -f logs/app.log | grep -A 5 "❌"

Debugar Job Específico

Buscar Job no Banco

-- Por ID
SELECT * FROM "OutboxJob" 
WHERE id = 'job_abc123';

-- Por eventKey
SELECT * FROM "OutboxJob" 
WHERE "eventKey" = '550e8400-e29b-41d4-a716-446655440000';

-- Com evento completo
SELECT 
  j.*,
  e."transactionDate",
  e."totalAmount",
  e."storeCode"
FROM "OutboxJob" j
JOIN "NayaxEvent" e ON j."eventKey" = e."transactionKey"
WHERE j.id = 'job_abc123';

Ver Histórico do Job

-- Ver todas as tentativas
SELECT 
  id,
  status,
  attempts,
  "createdAt",
  "nextRunAt",
  "processingAt",
  "lastError"
FROM "OutboxJob"
WHERE "eventKey" = '550e8400-e29b-41d4-a716-446655440000'
ORDER BY "createdAt" DESC;

Ver Erro Completo

SELECT 
  id,
  "eventKey",
  attempts,
  "lastError"
FROM "OutboxJob"
WHERE id = 'job_abc123';

Debugar Evento Nayax

Evento Completo

SELECT * FROM "NayaxEvent"
WHERE "transactionKey" = '550e8400-e29b-41d4-a716-446655440000';

Com Relacionamentos

SELECT 
  e.*,
  json_agg(DISTINCT i.*) as items,
  json_agg(DISTINCT p.*) as payments
FROM "NayaxEvent" e
LEFT JOIN "Item" i ON i."nayaxEventId" = e."transactionKey"
LEFT JOIN "Payment" p ON p."nayaxEventId" = e."transactionKey"
WHERE e."transactionKey" = '550e8400-e29b-41d4-a716-446655440000'
GROUP BY e."transactionKey";

Debug do Mapper

Testar Transformação

# Node REPL
node

# Importar mapper
const { mapNayaxToSaipos } = require('./dist/webhooks/nayax/mappers/nayax-to-saipos.mapper');

// Testar
const event = { /* seu evento */ };
const result = mapNayaxToSaipos(event, 'LOJA_001');
console.log(JSON.stringify(result, null, 2));

Verificar Totais

// Somar itens
const itemsTotal = event.items.reduce((sum, item) => {
  return sum + (item.price * item.quantity);
}, 0);

// Somar pagamentos
const paymentsTotal = event.payments.reduce((sum, p) => {
  return sum + p.amount;
}, 0);

console.log('Items:', itemsTotal);
console.log('Payments:', paymentsTotal);
console.log('Total:', event.totalAmount);
console.log('Diff:', Math.abs(paymentsTotal - event.totalAmount));

Debug de Autenticação

Testar JWT

# Gerar token
curl -X POST http://localhost:3000/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@example.com","password":"admin123"}'

# Validar token
curl -X GET http://localhost:3000/auth/me \
  -H "Authorization: Bearer $JWT_TOKEN"

Testar Nayax Bearer Token

# Verificar configuração
psql -d nayax_saipos -c "SELECT value FROM \"Setting\" WHERE key = 'NAYAX_BEARER_TOKEN';"

# Testar
curl -X POST http://localhost:3000/webhooks/nayax \
  -H "Authorization: Bearer $NAYAX_TOKEN" \
  -d '{"transactionKey":"test-123"}'

Testar Basic Auth

# Base64 encode
echo -n "user@example.com:password123" | base64

# Testar
curl -X POST http://localhost:3000/webhooks/nayax \
  -H "Authorization: Basic dXNlckBleGFtcGxlLmNvbTpwYXNzd29yZDEyMw==" \
  -d @test-event.json

Debug do Saipos Client

Testar Autenticação Saipos

# Via curl
curl -X POST https://homolog-order-api.saipos.com/auth \
  -H "id-partner: $ID_PARTNER" \
  -H "secret: $SECRET" \
  -H "Content-Type: application/json"

Ver Token em Cache

SELECT * FROM "TokenCache" WHERE provider = 'SAIPOS';

Invalidar Cache

DELETE FROM "TokenCache" WHERE provider = 'SAIPOS';

Debug de Performance

Query Lenta

-- Habilitar log de queries lentas
SET log_min_duration_statement = 1000; -- ms

-- Ver queries ativas
SELECT pid, now() - query_start as duration, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;

Jobs Acumulados

-- Ver distribuição de status
SELECT status, COUNT(*) as count
FROM "OutboxJob"
GROUP BY status;

-- Ver queue depth
SELECT COUNT(*) as pending_jobs
FROM "OutboxJob"
WHERE status = 'PENDING';

-- Ver jobs antigos não processados
SELECT "eventKey", "createdAt", NOW() - "createdAt" as age
FROM "OutboxJob"
WHERE status = 'PENDING'
ORDER BY "createdAt"
LIMIT 10;

Debug de Rede

Testar Conectividade

# Ping Saipos
ping order-api.saipos.com

# Traceroute
traceroute order-api.saipos.com

# Test HTTPS
curl -I https://order-api.saipos.com

# DNS lookup
nslookup order-api.saipos.com

Verificar Portas

# Porta 3000 (aplicação)
lsof -i :3000

# Porta 5432 (PostgreSQL)
lsof -i :5432

# Netstat
netstat -tuln | grep -E "3000|5432"

Debug com Node Inspector

Iniciar com Debug

# Development
node --inspect dist/main.js

# Com breakpoint
node --inspect-brk dist/main.js

Chrome DevTools

  1. Abra Chrome: chrome://inspect
  2. Click em "Open dedicated DevTools for Node"
  3. Adicione breakpoints no código

Logs Estruturados para Debug

Adicionar Contexto

this.logger.debug('Processing job', {
  jobId: job.id,
  eventKey: job.eventKey,
  attempts: job.attempts,
  restaurant: ev.storeCode
});

Query com Contexto

-- Ver contexto completo de um job
SELECT 
  j.id,
  j.status,
  j.attempts,
  j."lastError",
  e."transactionKey",
  e."storeCode",
  e."totalAmount",
  r.name as restaurant_name,
  r."codeStoreSaipos"
FROM "OutboxJob" j
JOIN "NayaxEvent" e ON j."eventKey" = e."transactionKey"
LEFT JOIN "Restaurant" r ON e."restaurantId" = r.id
WHERE j.id = 'job_abc123';

Checklist de Debug

Quando algo não funciona:

  • Verificar logs: tail -f logs/app.log
  • Verificar status do job no banco
  • Verificar evento Nayax completo
  • Testar mapper manualmente
  • Verificar credenciais Saipos
  • Testar conectividade de rede
  • Verificar cache de token
  • Ver últimos erros similares
  • Verificar variáveis de ambiente
  • Restart da aplicação

Ferramentas Úteis

Prisma Studio

npx prisma studio

Interface gráfica para explorar o banco.

Postman/Insomnia

Criar coleção com todos os endpoints para testar manualmente.

pgAdmin

Interface gráfica para PostgreSQL.

Próximos Passos