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 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) {
const rawCep = req.body.cep;
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 (!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);
if (!address) return res.status(404).json({ error: 'Endereço não encontrado para o CEP fornecido' });
const city = address.data.localidade;
const state = address.data.uf;
const numero = address.data.numero || rawNumero;
const city = address.data[`cep:${rawCep}`].localidade;
const state = address.data[`cep:${rawCep}`].uf;
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);
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);
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 dedicado;
// lógica de decisão: use if/else (ajuste os limites conforme regra de negócio)
if (distancia <= 500) {
naoDedicado = true;
dedicado = true;
} else if (distancia <= 1000) {
naoDedicado = true;
dedicado = false;
} else {
// Lógica para determinar os valores de naoDedicado e dedicado com base na distância
if (viabilidade.data) {
const distancia = viabilidade.data.distancia;
if (distancia <= 500) {
naoDedicado = true;
dedicado = true;
} else if (distancia <= 1000) {
naoDedicado = true;
dedicado = false;
} else {
naoDedicado = false;
dedicado = false;
} } else {
naoDedicado = false;
dedicado = false;
}
// Retorna a resposta com os dados necessários
return res.json({
bairro: address.data.bairro,
bairro: address.data[`cep:${rawCep}`].bairro,
cidade: city,
estado: state,
logradouro: address.data.logradouro,
logradouro: address.data[`cep:${rawCep}`].logradouro,
naoDedicado,
dedicado,
});
@ -75,8 +71,6 @@ async function handleViabilidade(req, res) {
}
module.exports = {
handleViabilidadeNegada,
handleViabilidadeAceita,
handleViabilidade,
};

View File

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

View File

@ -1,5 +1,7 @@
const axios = require("axios");
// Consulta o endereço completo usando a API externa de CEP
const getConsultaCep = async (rawCep, rawNumero) => {
if (!rawCep) {
throw new Error("cep é obrigatório");
@ -8,6 +10,9 @@ const getConsultaCep = async (rawCep, rawNumero) => {
if (cep.length !== 8) {
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() : "";
try {
const cepRestUrl = 'https://api.cep.rest/';

View File

@ -10,16 +10,21 @@ const consultaViabilidade = async (lat, lon) => {
const apiCookie = apiConfig.geogridApiCookie;
try {
// Monta os parâmetros como arrays para garantir serialização correta
// Parâmetros da consulta
const params = {
raio: 5000,
latitude: lat,
longitude: lon,
itens: ["caixa"],
"itens[]": "caixa",
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, {
params,
// 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");
// Geocode using Google Geocoding API. Returns { lat, lon } or null
// Geocodifica um endereço usando a API do Google Maps
async function geocodeWithGoogle(address) {
const key = apiConfig.googleApiKey;
if (!key) return null;
@ -13,12 +14,14 @@ async function geocodeWithGoogle(address) {
timeout: 10000,
});
// ensure HTTP 200
// Valida a resposta e extrai as coordenadas
if (!r || r.status !== 200) {
console.warn(`geocodeWithGoogle unexpected status for '${address}': ${r && r.status}`);
return null;
}
// Verifica se há resultados válidos
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 lat = loc && (loc.lat !== undefined ? Number(loc.lat) : NaN);