FEAT: Implementa nova funcionalidade de viabilidade com integração à API e ajustes na estrutura do projeto

This commit is contained in:
Gabriel Amancio 2026-01-26 08:02:53 -03:00
parent 1d2636926e
commit 84f925b3cb
9 changed files with 98 additions and 21 deletions

2
.env
View File

@ -4,6 +4,8 @@ API_KEY="6d717e972ba17c7cf0ab731801b8bbeac2f281e5"
COOKIE="PHPSESSID=6d717e972ba17c7cf0ab731801b8bbeac2f281e5"
PORT="3000"
API_VIABILIDADE_URL="https://api.sothis.com.br/api/viabilidade"
DATABASE_HOST = 'crash.sothistelecom.com'
DATABASE_PORT = '3306'
DATABASE_NAME = 'viabilidade_data'

View File

@ -7,35 +7,55 @@ document.getElementById('btnConsultaCep').addEventListener('click', async () =>
const naoDedicado = document.getElementById('link-nao-dedicado');
endereco.innerText = 'Consultando...';
try {
const resp = await fetch(`/consulta-cep?cep=${encodeURIComponent(cep)}&numero=${encodeURIComponent(numero)}`);
const resp = await fetch(`/viabilidade?cep=${encodeURIComponent(cep)}&numero=${encodeURIComponent(numero)}`);
const data = await resp.json();
if (data && data.endereco !== undefined) {
if (data && data.logradouro !== undefined) {
// colocar o card-results__container (resultados) com display block
endereco.innerHTML = `<strong>Endereço:</strong> ${data.endereco}.`;
endereco.innerHTML = `<strong>Endereço:</strong> ${data.logradouro} ${data.numero} ${data.bairro} ${data.cidade} ${data.estado} ${data.cep} .`;
resultados.style.display = 'block';
// insere nos spans link-dedicado e link-nao-dedicado os textos de viabilidade e se for viavel adicionar classe "viavel" e se for inviavel adicionar classe "inviavel"
dedicado.innerText = data.dedicado;
naoDedicado.innerText = data.naoDedicado;
if (data.dedicado === 'Viável') {
// precisa remover a classe inviavel se existir
if (data.dedicado) {
dedicado.innerText = "Viável";
dedicado.classList.remove('inviavel');
dedicado.classList.add('viavel');
} else if (data.dedicado === 'Não viável') {
// precisa remover a classe viavel se existir
} else {
dedicado.innerText = "Não viável";
dedicado.classList.remove('viavel');
dedicado.classList.add('inviavel');
}
if (data.naoDedicado === 'Viável') {
// precisa remover a classe inviavel se existir
}
if (data.naoDedicado) {
naoDedicado.innerText = "Viável";
naoDedicado.classList.remove('inviavel');
naoDedicado.classList.add('viavel');
} else if (data.naoDedicado === 'Não viável') {
// precisa remover a classe viavel se existir
} else {
naoDedicado.innerText = "Não viável";
naoDedicado.classList.remove('viavel');
naoDedicado.classList.add('inviavel');
}
// // insere nos spans link-dedicado e link-nao-dedicado os textos de viabilidade e se for viavel adicionar classe "viavel" e se for inviavel adicionar classe "inviavel"
// dedicado.innerText = data.dedicado;
// naoDedicado.innerText = data.naoDedicado;
// if (data.dedicado === 'Viável') {
// // precisa remover a classe inviavel se existir
// dedicado.classList.remove('inviavel');
// dedicado.classList.add('viavel');
// } else if (data.dedicado === 'Não viável') {
// // precisa remover a classe viavel se existir
// dedicado.classList.remove('viavel');
// dedicado.classList.add('inviavel');
// }
// if (data.naoDedicado === 'Viável') {
// // precisa remover a classe inviavel se existir
// naoDedicado.classList.remove('inviavel');
// naoDedicado.classList.add('viavel');
// } else if (data.naoDedicado === 'Não viável') {
// // precisa remover a classe viavel se existir
// naoDedicado.classList.remove('viavel');
// naoDedicado.classList.add('inviavel');
// }
} else if (data.error) {
endereco.innerText = 'Erro: ' + data.error;
} else {

View File

@ -1,4 +1,5 @@
const dotenv = require("dotenv");
const path = require("path");
dotenv.config();
@ -10,7 +11,8 @@ function createApp() {
const app = express();
app.use(express.json());
app.use(router);
app.use(express.static(path.join(__dirname, "../public")));
app.use("/", router);
app.use(cors());
return app;

10
src/config/apiConfig.js Normal file
View File

@ -0,0 +1,10 @@
const dotenv = require("dotenv");
const path = require("path");
dotenv.config({ path: path.join(__dirname, '../../.env') }); // Caminho para .env na raiz
const API_URL = process.env.API_VIABILIDADE_URL;
module.exports = {
API_URL
};

View File

@ -0,0 +1,20 @@
const viabilidadeService = require("../services/viabilidadeService");
async function getViabilidade(req, res) {
const { cep, numero } = req.query;
if (!cep || !numero) {
return res.status(400).json({ error: "CEP e número são obrigatórios." });
}
const data = await viabilidadeService.getViabilidadeData(cep, numero);
console.log(data);
if (data) {
res.json(data);
} else {
res.status(500).json({ error: "Falha ao obter dados de viabilidade." });
}
}
module.exports = { getViabilidade };

View File

@ -1,11 +1,14 @@
const express = require("express");
const consultaCepController = require("./controllers/consultaCepController");
const viabilidadeController = require("./controllers/viabilidadeController");
const path = require("path");
const { Router } = express;
const router = Router();
router.use(express.static(path.join(__dirname, "..", "public")));
router.get('/consulta-cep', consultaCepController.getConsultaCep);
router.get("/viabilidade", viabilidadeController.getViabilidade);
router.get("/", (req, res) => {
res.sendFile(path.join(__dirname, "../public/index.html"));
});
module.exports = router;

View File

@ -5,5 +5,5 @@ const app = createApp();
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`)
console.log(`Server running on ${PORT}`)
});

View File

@ -42,6 +42,7 @@ async function getMinDistance(lat, lon) {
const data = resp.data || {};
const registros = data.registros || [];
console.log(data.registros[0]);
console.info(
`[INFO] API resp. raio=${raio} lat=${lat} lon=${lon} registros=${registros.length}`
);

View File

@ -0,0 +1,19 @@
const axios = require('axios');
const apiConfig = require('../config/apiConfig');
async function getViabilidadeData(cep, numero) {
try {
const data = {
cep,
numero
};
const url = apiConfig.API_URL;
const response = await axios.post(url, data);
return response.data;
} catch (error) {
console.error(`[ERROR] Falha ao obter dados de viabilidade: ${error.message}`);
return null;
}
}
module.exports = { getViabilidadeData };