REFACTOR: handleViabilidade refatorado.

- Agora a API do Geogrid faz a viabilidade apenas por caixas.

- Retirado rotas iniciais de testes, mantive apenas a /viabilidade.
This commit is contained in:
Gabriel Amancio 2025-11-18 08:26:50 -03:00
parent 6ab6b209b6
commit e2f6915a50
5 changed files with 47 additions and 42 deletions

View File

@ -2,18 +2,6 @@ const geogridService = require("../services/geogridService.js");
const googleService = require("../services/googleService.js"); const googleService = require("../services/googleService.js");
const cepRestService = require("../services/cepRestService.js"); const cepRestService = require("../services/cepRestService.js");
function handleViabilidadeNegada(req, res) {
// Lógica para lidar com a viabilidade negada
res.status(200).json({ message: 'Viabilidade negada processada com sucesso.' });
}
function handleViabilidadeAceita(req, res) {
console.log('Recebido viabilidade aceita:', req.body);
// Lógica para lidar com a viabilidade aceita
res.status(200).json({ message: 'Viabilidade aceita' });
}
async function handleViabilidade(req, res) { async function handleViabilidade(req, res) {
const rawCep = req.body.cep; const rawCep = req.body.cep;
const rawNumero = req.body.numero; const rawNumero = req.body.numero;
@ -23,47 +11,55 @@ async function handleViabilidade(req, res) {
if (!rawCep) return res.status(400).json({ error: 'cep é obrigatório' }); if (!rawCep) return res.status(400).json({ error: 'cep é obrigatório' });
if (!rawNumero) return res.status(400).json({ error: 'número é obrigatório' }); if (!rawNumero) return res.status(400).json({ error: 'número é obrigatório' });
// Consulta o endereço completo usando o serviço de CEP
const address = await cepRestService.getConsultaCep(rawCep, rawNumero); const address = await cepRestService.getConsultaCep(rawCep, rawNumero);
if (!address) return res.status(404).json({ error: 'Endereço não encontrado para o CEP fornecido' }); if (!address) return res.status(404).json({ error: 'Endereço não encontrado para o CEP fornecido' });
const city = address.data.localidade; const city = address.data[`cep:${rawCep}`].localidade;
const state = address.data.uf; const state = address.data[`cep:${rawCep}`].uf;
const numero = address.data.numero || rawNumero; const numero = rawNumero;
const addressString = `${address.data.logradouro}, ${numero}, ${address.data.bairro}, ${city}, ${state}, ${address.data.cep}`; const addressString = `${address.data[`cep:${rawCep}`].logradouro}, ${numero}, ${address.data[`cep:${rawCep}`].bairro}, ${city}, ${state}, ${address.data[`cep:${rawCep}`].cep}`;
// Obtém as coordenadas usando o serviço do Google
const coords = await googleService.geocodeWithGoogle(addressString); const coords = await googleService.geocodeWithGoogle(addressString);
if (!coords) return res.status(500).json({ error: 'Não foi possível obter as coordenadas do endereço' }); if (!coords) return res.status(500).json({ error: 'Não foi possível obter as coordenadas do endereço' });
// Consulta a viabilidade no geogridService
const viabilidade = await geogridService.consultaViabilidade(coords.lat, coords.lon); const viabilidade = await geogridService.consultaViabilidade(coords.lat, coords.lon);
console.log('Viabilidade retornada:', viabilidade);
const distancia = viabilidade.data.distancia;
if (distancia == null) return res.status(500).json({ error: 'Distância não retornada pela consulta de viabilidade' });
let naoDedicado; let naoDedicado;
let dedicado; let dedicado;
// lógica de decisão: use if/else (ajuste os limites conforme regra de negócio) // Lógica para determinar os valores de naoDedicado e dedicado com base na distância
if (distancia <= 500) {
naoDedicado = true; if (viabilidade.data) {
dedicado = true; const distancia = viabilidade.data.distancia;
} else if (distancia <= 1000) { if (distancia <= 500) {
naoDedicado = true; naoDedicado = true;
dedicado = false; dedicado = true;
} else { } else if (distancia <= 1000) {
naoDedicado = true;
dedicado = false;
} else {
naoDedicado = false;
dedicado = false;
} } else {
naoDedicado = false; naoDedicado = false;
dedicado = false; dedicado = false;
} }
// Retorna a resposta com os dados necessários
return res.json({ return res.json({
bairro: address.data.bairro, bairro: address.data[`cep:${rawCep}`].bairro,
cidade: city, cidade: city,
estado: state, estado: state,
logradouro: address.data.logradouro, logradouro: address.data[`cep:${rawCep}`].logradouro,
naoDedicado, naoDedicado,
dedicado, dedicado,
}); });
@ -75,8 +71,6 @@ async function handleViabilidade(req, res) {
} }
module.exports = { module.exports = {
handleViabilidadeNegada,
handleViabilidadeAceita,
handleViabilidade, handleViabilidade,
}; };

View File

@ -2,9 +2,7 @@ const express = require('express');
const router = express.Router(); const router = express.Router();
const controller = require('../controllers/controller.js'); const controller = require('../controllers/controller.js');
//rota de teste // Rota para consulta de viabilidade
router.post('/viabilidade_negada', controller.handleViabilidadeNegada);
router.post('/viabilidade_aceita', controller.handleViabilidadeAceita);
router.post('/viabilidade', controller.handleViabilidade); router.post('/viabilidade', controller.handleViabilidade);
module.exports = router; module.exports = router;

View File

@ -1,5 +1,7 @@
const axios = require("axios"); const axios = require("axios");
// Consulta o endereço completo usando a API externa de CEP
const getConsultaCep = async (rawCep, rawNumero) => { const getConsultaCep = async (rawCep, rawNumero) => {
if (!rawCep) { if (!rawCep) {
throw new Error("cep é obrigatório"); throw new Error("cep é obrigatório");
@ -8,6 +10,9 @@ const getConsultaCep = async (rawCep, rawNumero) => {
if (cep.length !== 8) { if (cep.length !== 8) {
throw new Error("cep inválido, verifique se foram digitados apenas números"); throw new Error("cep inválido, verifique se foram digitados apenas números");
} }
// Número é opcional na consulta, mas se fornecido, deve ser uma string limpa
const numero = rawNumero ? String(rawNumero).trim() : ""; const numero = rawNumero ? String(rawNumero).trim() : "";
try { try {
const cepRestUrl = 'https://api.cep.rest/'; const cepRestUrl = 'https://api.cep.rest/';

View File

@ -10,16 +10,21 @@ const consultaViabilidade = async (lat, lon) => {
const apiCookie = apiConfig.geogridApiCookie; const apiCookie = apiConfig.geogridApiCookie;
try { try {
// Monta os parâmetros como arrays para garantir serialização correta // Parâmetros da consulta
const params = { const params = {
raio: 5000, raio: 5000,
latitude: lat, latitude: lat,
longitude: lon, longitude: lon,
itens: ["caixa"], "itens[]": "caixa",
ordenarCampos: ["distancia"], ordenarCampos: ["distancia"],
ordenarPor: ["asc"] ordenarPor: ["asc"],
consultarIndividual: "S"
}; };
// Console log com curl equivalente para depuração
const curlParams = qs.stringify(params, { arrayFormat: 'brackets' });
console.log(`CURL equivalente: curl -X GET "${url}?${curlParams}" -H "api-key: ${apiKey}" -H "Cookie: ${apiCookie}"`);
const response = await axios.get(url, { const response = await axios.get(url, {
params, params,
// força a serialização do tipo `itens[]=caixa` // força a serialização do tipo `itens[]=caixa`

View File

@ -2,7 +2,8 @@ const apiConfig = require("../config/apiConfig.js")
const axios = require("axios"); const axios = require("axios");
// Geocode using Google Geocoding API. Returns { lat, lon } or null // Geocodifica um endereço usando a API do Google Maps
async function geocodeWithGoogle(address) { async function geocodeWithGoogle(address) {
const key = apiConfig.googleApiKey; const key = apiConfig.googleApiKey;
if (!key) return null; if (!key) return null;
@ -13,12 +14,14 @@ async function geocodeWithGoogle(address) {
timeout: 10000, timeout: 10000,
}); });
// ensure HTTP 200 // Valida a resposta e extrai as coordenadas
if (!r || r.status !== 200) { if (!r || r.status !== 200) {
console.warn(`geocodeWithGoogle unexpected status for '${address}': ${r && r.status}`); console.warn(`geocodeWithGoogle unexpected status for '${address}': ${r && r.status}`);
return null; return null;
} }
// Verifica se há resultados válidos
if (r.data && Array.isArray(r.data.results) && r.data.results.length > 0) { if (r.data && Array.isArray(r.data.results) && r.data.results.length > 0) {
const loc = r.data.results[0].geometry && r.data.results[0].geometry.location; const loc = r.data.results[0].geometry && r.data.results[0].geometry.location;
const lat = loc && (loc.lat !== undefined ? Number(loc.lat) : NaN); const lat = loc && (loc.lat !== undefined ? Number(loc.lat) : NaN);