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:
parent
6ab6b209b6
commit
e2f6915a50
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
@ -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/';
|
||||||
|
|||||||
@ -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`
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user