viabiliza/service/viabilidadeService.js

66 lines
2.0 KiB
JavaScript

const axios = require('axios');
const fs = require('fs');
const readline = require('readline');
const { apiConfig, apiViabilidadeUrl, apiUrlBase } = require('../config/apiConfig');
const DEFAULT_TIMEOUT = (apiConfig && apiConfig.timeoutMs) || 10000;
async function consultarViabilidade(data) {
try {
const dataType = await discoverDataType(data);
let endpoint = apiUrlBase;
if (dataType === 'geolocalizacao') {
endpoint += 'viabilidade/lat-long';
} else {
endpoint += 'viabilidade';
}
const response = await axios.post(endpoint, data, {
timeout: DEFAULT_TIMEOUT,
headers: { 'Content-Type': 'application/json' }
});
console.log('Resposta da API de viabilidade:', response.data);
return (response.data);
} catch (error) {
throw error;
}
}
// Preciso de uma função para verificar se os dados vindos são de CEP ou de geolocalização
async function discoverDataType(input) {
if (typeof input === 'string') {
// Trata como filePath
const instream = fs.createReadStream(input, { encoding: 'utf8' });
const rl = readline.createInterface({ input: instream, crlfDelay: Infinity });
let headers = [];
for await (const rawLine of rl) {
const line = rawLine.replace(/\r$/, '');
if (!line.trim()) continue;
headers = line.split(';').map(h => h.trim().toLowerCase());
break;
}
rl.close();
if (headers.includes('cep') && headers.includes('numero')) {
return 'cep';
} else if (headers.includes('latitude') && headers.includes('longitude')) {
return 'geolocalizacao';
} else {
return 'unknown';
}
} else if (typeof input === 'object') {
// Trata como objeto de dados
if (input.cep && input.numero) {
return 'cep';
} else if (input.latitude && input.longitude) {
return 'geolocalizacao';
} else {
return 'unknown';
}
} else {
return 'unknown';
}
}
module.exports = { consultarViabilidade, discoverDataType };