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¶
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¶
Debugar Evento Nayax¶
Evento Completo¶
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¶
Invalidar Cache¶
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¶
Chrome DevTools¶
- Abra Chrome:
chrome://inspect - Click em "Open dedicated DevTools for Node"
- 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¶
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.