@poli-digital/n8n-nodes-poli
Version:
Nó para interagir com a API da Poli
126 lines • 5.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.apiRequest = void 0;
const n8n_workflow_1 = require("n8n-workflow");
async function apiRequest(method, endpoint, body = {}, qs = {}, maxRetries = 3) {
var _a;
const credentials = await this.getCredentials('poliApi');
const baseUrl = 'https://foundation-api.poli.digital/v3';
const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;
const options = {
method,
url: `${baseUrl}${normalizedEndpoint}`,
headers: {
Authorization: `Bearer ${credentials.apiKey}`,
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: method !== 'GET' ? body : undefined,
qs,
json: true,
timeout: 30000,
};
let lastError;
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
console.log(`🔄 API Request [Tentativa ${attempt}/${maxRetries}]:`, {
method,
endpoint: normalizedEndpoint,
hasBody: Object.keys(body).length > 0,
hasQuery: Object.keys(qs).length > 0
});
const response = await this.helpers.request(options);
console.log(`✅ API Request bem-sucedida:`, {
method,
endpoint: normalizedEndpoint,
statusCode: 'success'
});
return response;
}
catch (error) {
lastError = error;
const statusCode = error.statusCode || ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) || 0;
console.error(`❌ API Request falhou [Tentativa ${attempt}/${maxRetries}]:`, {
method,
endpoint: normalizedEndpoint,
statusCode,
message: error.message,
attempt,
maxRetries
});
if (shouldNotRetry(statusCode)) {
console.warn(`🚫 Erro não temporário detectado (${statusCode}), interrompendo tentativas`);
break;
}
if (attempt < maxRetries) {
const delayMs = calculateRetryDelay(attempt);
console.log(`⏳ Aguardando ${delayMs}ms antes da próxima tentativa...`);
await new Promise(resolve => setTimeout(resolve, delayMs));
}
}
}
throw createDetailedError(lastError, method, normalizedEndpoint);
}
exports.apiRequest = apiRequest;
function shouldNotRetry(statusCode) {
const noRetryStatuses = [400, 401, 403, 404, 422];
return noRetryStatuses.includes(statusCode);
}
function calculateRetryDelay(attempt) {
const baseDelay = 1000;
return baseDelay * Math.pow(2, attempt - 1);
}
function createDetailedError(error, method, endpoint) {
var _a, _b;
const statusCode = error.statusCode || ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) || 0;
const errorMessage = error.message || 'Erro desconhecido';
const errorDetails = ((_b = error.response) === null || _b === void 0 ? void 0 : _b.data) || error.body || {};
let userMessage = '';
let description = '';
switch (statusCode) {
case 401:
userMessage = 'Erro de autenticação: Token API inválido ou expirado';
description = 'Verifique se o token da API Poli está correto nas credenciais';
break;
case 403:
userMessage = 'Acesso negado: Sem permissão para esta operação';
description = 'Verifique se sua conta tem as permissões necessárias';
break;
case 404:
userMessage = 'Recurso não encontrado';
description = `O endpoint ${method} ${endpoint} não foi encontrado ou o recurso não existe`;
break;
case 422:
userMessage = 'Dados inválidos enviados para a API';
description = 'Verifique se todos os parâmetros obrigatórios estão preenchidos corretamente';
break;
case 429:
userMessage = 'Limite de requisições excedido';
description = 'Aguarde alguns momentos antes de tentar novamente';
break;
case 500:
case 502:
case 503:
case 504:
userMessage = 'Erro interno do servidor da API Poli';
description = 'Problema temporário no servidor. Tente novamente em alguns minutos';
break;
default:
userMessage = `Falha na comunicação com a API Poli (${statusCode})`;
description = errorMessage;
}
const nodeError = {
message: userMessage,
description: description,
httpCode: statusCode,
cause: {
endpoint,
method,
statusCode,
originalMessage: errorMessage,
details: errorDetails
}
};
return new n8n_workflow_1.NodeApiError({ type: 'n8n-nodes-poli' }, nodeError);
}
//# sourceMappingURL=transport.js.map