2025-10-22 15:39:09 -03:00
|
|
|
const dotenv = require("dotenv");
|
|
|
|
|
|
|
|
|
|
dotenv.config();
|
|
|
|
|
|
2025-10-22 14:23:37 -03:00
|
|
|
const express = require("express");
|
|
|
|
|
const path = require("path");
|
|
|
|
|
const cors = require("cors");
|
|
|
|
|
const { fetchJson } = require("./services/jsonService");
|
|
|
|
|
const { getMinDistance } = require("./services/distanceService");
|
|
|
|
|
const { geocodeWithGoogle } = require("./services/geocodeService");
|
|
|
|
|
|
|
|
|
|
function createApp() {
|
|
|
|
|
const app = express();
|
|
|
|
|
|
|
|
|
|
app.use(cors());
|
|
|
|
|
app.use(express.static(path.join(__dirname, "public")));
|
|
|
|
|
app.use(express.json());
|
|
|
|
|
|
|
|
|
|
// manual CEP+Numero query: resolves ViaCEP -> Nominatim -> Geogrid
|
|
|
|
|
app.get("/consulta-cep", async (req, res) => {
|
|
|
|
|
const { cep: rawCep, numero: rawNumero } = req.query;
|
|
|
|
|
if (!rawCep) return res.status(400).json({ error: "cep é obrigatório" });
|
|
|
|
|
const cep = String(rawCep).replace(/\D/g, "");
|
|
|
|
|
const numero = rawNumero ? String(rawNumero).trim() : "";
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const viaCepData = await fetchJson(
|
|
|
|
|
`https://viacep.com.br/ws/${cep}/json/`
|
|
|
|
|
);
|
|
|
|
|
if (!viaCepData || viaCepData.erro)
|
|
|
|
|
return res.status(404).json({ error: "CEP não encontrado" });
|
|
|
|
|
const logradouro = viaCepData.logradouro || "";
|
|
|
|
|
const bairro = viaCepData.bairro || "";
|
|
|
|
|
const cidade = viaCepData.localidade || "";
|
|
|
|
|
const uf = viaCepData.uf || "";
|
|
|
|
|
const endereco = `${logradouro}, ${numero}, ${bairro}, ${cidade} - ${uf}`
|
|
|
|
|
.replace(/, ,/g, ",")
|
|
|
|
|
.replace(/^,\s*/, "");
|
|
|
|
|
|
|
|
|
|
if (!process.env.GOOGLE_API_KEY)
|
|
|
|
|
return res
|
|
|
|
|
.status(500)
|
|
|
|
|
.json({ error: "GOOGLE_API_KEY não definida no servidor" });
|
|
|
|
|
const geo = await geocodeWithGoogle(endereco || `${cidade} ${uf} ${cep}`);
|
|
|
|
|
if (!geo)
|
|
|
|
|
return res
|
|
|
|
|
.status(404)
|
|
|
|
|
.json({ error: "geocode não encontrado (Google)" });
|
|
|
|
|
const lat = Number(geo.lat);
|
|
|
|
|
const lon = Number(geo.lon);
|
2025-10-23 09:31:37 -03:00
|
|
|
const result = await getMinDistance(lat, lon);
|
|
|
|
|
if (result && result.dist !== undefined) {
|
2025-10-22 14:23:37 -03:00
|
|
|
// preciso criar 2 campos: Link Dedicado e Link Não Dedicado em que o dedicado é viável até 1000m e o não dedicado até 500m
|
|
|
|
|
if (result.dist <= 500) {
|
|
|
|
|
return res.json({
|
|
|
|
|
endereco,
|
|
|
|
|
latitude: lat,
|
|
|
|
|
longitude: lon,
|
|
|
|
|
distancia: result.dist,
|
|
|
|
|
dedicado: "Viável",
|
|
|
|
|
naoDedicado: "Viável",
|
|
|
|
|
});
|
|
|
|
|
} else if (result.dist <= 1000) {
|
|
|
|
|
return res.json({
|
|
|
|
|
endereco,
|
|
|
|
|
latitude: lat,
|
|
|
|
|
longitude: lon,
|
|
|
|
|
distancia: result.dist,
|
|
|
|
|
dedicado: "Viável",
|
|
|
|
|
naoDedicado: "Não viável",
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
return res.json({
|
|
|
|
|
endereco,
|
|
|
|
|
latitude: lat,
|
|
|
|
|
longitude: lon,
|
|
|
|
|
distancia: result.dist,
|
|
|
|
|
dedicado: "Não viável",
|
|
|
|
|
naoDedicado: "Não viável",
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-10-23 09:31:37 -03:00
|
|
|
// quando a consulta não retorna um resultado válido, responder como 'Não viável'
|
|
|
|
|
// isso evita que a UI fique presa em "Consultando..." esperando uma resposta
|
|
|
|
|
return res.json({
|
|
|
|
|
endereco,
|
|
|
|
|
latitude: lat,
|
|
|
|
|
longitude: lon,
|
|
|
|
|
distancia: null,
|
|
|
|
|
dedicado: "Não viável",
|
|
|
|
|
naoDedicado: "Não viável",
|
|
|
|
|
});
|
2025-10-22 14:23:37 -03:00
|
|
|
} catch (err) {
|
|
|
|
|
console.error(err);
|
|
|
|
|
return res.status(500).json({ error: "erro na consulta" });
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return app;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = createApp;
|