From e2f6915a50c09761d89c5f1216014f7631638b05 Mon Sep 17 00:00:00 2001 From: "gabriel.amancio" Date: Tue, 18 Nov 2025 08:26:50 -0300 Subject: [PATCH] REFACTOR: handleViabilidade refatorado. - Agora a API do Geogrid faz a viabilidade apenas por caixas. - Retirado rotas iniciais de testes, mantive apenas a /viabilidade. --- src/controllers/controller.js | 62 +++++++++++++++------------------- src/routes/routes.js | 4 +-- src/services/cepRestService.js | 5 +++ src/services/geogridService.js | 11 ++++-- src/services/googleService.js | 7 ++-- 5 files changed, 47 insertions(+), 42 deletions(-) diff --git a/src/controllers/controller.js b/src/controllers/controller.js index efe3686..dbb19c2 100644 --- a/src/controllers/controller.js +++ b/src/controllers/controller.js @@ -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, }; diff --git a/src/routes/routes.js b/src/routes/routes.js index fd1fca3..179d60b 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -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; \ No newline at end of file diff --git a/src/services/cepRestService.js b/src/services/cepRestService.js index 1eb77e9..2610bfb 100644 --- a/src/services/cepRestService.js +++ b/src/services/cepRestService.js @@ -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/'; diff --git a/src/services/geogridService.js b/src/services/geogridService.js index 71e0f66..4c04ad6 100644 --- a/src/services/geogridService.js +++ b/src/services/geogridService.js @@ -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` diff --git a/src/services/googleService.js b/src/services/googleService.js index 871758e..c368c43 100644 --- a/src/services/googleService.js +++ b/src/services/googleService.js @@ -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);