- Removidos os arquivos não utilizados: fetchService, geocodeService, normalizeService e retryService. - Adicionado o viabilidadeController para gerenciar consultas de viabilidade e upload de arquivos CSV. - Criadas as viabilidadeRoutes para tratar as rotas da API relacionadas à viabilidade. - Implementado o csvService para processamento de arquivos CSV e integração com as consultas de viabilidade. - Criado o jobStore.service para gerenciamento do estado dos jobs durante o processamento do CSV. - Desenvolvido o viabilidadeService para integração com a API de viabilidade.
55 lines
1.6 KiB
JavaScript
55 lines
1.6 KiB
JavaScript
const axios = require('axios');
|
|
const { apiConfig, apiViabilidadeUrl } = require('../config/apiConfig');
|
|
|
|
const DEFAULT_TIMEOUT = (apiConfig && apiConfig.timeoutMs) || 10000;
|
|
const MAX_RETRIES = (apiConfig && apiConfig.maxRetries) || 3;
|
|
const BASE_BACKOFF_MS = (apiConfig && apiConfig.baseBackoffMs) || 500;
|
|
|
|
function sleep(ms) {
|
|
return new Promise((r) => setTimeout(r, ms));
|
|
}
|
|
|
|
function normalizeResponse(body) {
|
|
if (!body) return { error: 'Resposta vazia', raw: body };
|
|
// Caso já venha com distancia/distance direto
|
|
if (typeof body === 'object') {
|
|
if (body.distancia || body.distance) {
|
|
return {
|
|
distancia: body.distancia || body.distance,
|
|
raw: body
|
|
};
|
|
}
|
|
// formato antigo com array registros
|
|
if (Array.isArray(body.registros) && body.registros.length) {
|
|
// seleciona o registro com menor distancia (se existir)
|
|
let min = null;
|
|
for (const r of body.registros) {
|
|
const d = r.distancia ?? r.distance ?? null;
|
|
if (d == null) continue;
|
|
if (min == null || d < min.d) min = { d, r };
|
|
}
|
|
return {
|
|
distancia: min ? min.d : null,
|
|
parceiro: min ? (min.r.pastaSigla || min.r.parceiro || null) : null,
|
|
raw: body
|
|
};
|
|
}
|
|
// fallback: retorna body bruto para inspeção
|
|
return { raw: body };
|
|
}
|
|
return { raw: body };
|
|
}
|
|
|
|
async function consultarViabilidade(data) {
|
|
try {
|
|
const response = await axios.post(apiViabilidadeUrl, data, {
|
|
timeout: DEFAULT_TIMEOUT,
|
|
headers: { 'Content-Type': 'application/json' }
|
|
});
|
|
return (response.data);
|
|
} catch (error) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
module.exports = { consultarViabilidade }; |