78 lines
3.0 KiB
JavaScript
78 lines
3.0 KiB
JavaScript
|
|
// reconcile_ids.js
|
||
|
|
const fs = require('fs');
|
||
|
|
const path = require('path');
|
||
|
|
const http = require('http');
|
||
|
|
|
||
|
|
// --- CONFIGURACIÓN ---
|
||
|
|
const API_URL = 'http://localhost:5217/api/catalogos/municipios'; // ¡Asegúrate que tu API esté corriendo en este puerto!
|
||
|
|
const GEOJSON_PATH = path.join(__dirname, 'Elecciones-Web', 'frontend', 'public', 'buenos-aires-municipios.geojson');
|
||
|
|
const OUTPUT_PATH = path.join(__dirname, 'Elecciones-Web', 'frontend', 'public', 'municipioIdMap.json');
|
||
|
|
|
||
|
|
const normalizeString = (str) => {
|
||
|
|
if (!str) return '';
|
||
|
|
return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase();
|
||
|
|
};
|
||
|
|
|
||
|
|
async function reconcile() {
|
||
|
|
console.log('Iniciando el script de reconciliación de IDs...');
|
||
|
|
|
||
|
|
try {
|
||
|
|
const apiData = await new Promise((resolve, reject) => {
|
||
|
|
http.get(API_URL, res => {
|
||
|
|
const { statusCode } = res;
|
||
|
|
if (statusCode !== 200) {
|
||
|
|
reject(new Error(`La petición a la API falló con el código de estado: ${statusCode}`));
|
||
|
|
res.resume();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
let data = '';
|
||
|
|
res.on('data', chunk => data += chunk);
|
||
|
|
res.on('end', () => resolve(JSON.parse(data)));
|
||
|
|
}).on('error', reject);
|
||
|
|
});
|
||
|
|
console.log(`Se obtuvieron ${apiData.length} municipios desde la API.`);
|
||
|
|
|
||
|
|
const apiNameMap = new Map(apiData.map(m => [normalizeString(m.nombre), m.id]));
|
||
|
|
|
||
|
|
const geoJsonRaw = fs.readFileSync(GEOJSON_PATH, 'utf8');
|
||
|
|
const geoJsonData = JSON.parse(geoJsonRaw);
|
||
|
|
console.log(`Se leyeron ${geoJsonData.features.length} features desde el GeoJSON.`);
|
||
|
|
|
||
|
|
const finalIdMap = {};
|
||
|
|
let matches = 0;
|
||
|
|
const notFound = [];
|
||
|
|
|
||
|
|
// --- CAMBIO CLAVE: YA NO NECESITAMOS ALIAS MANUALES ---
|
||
|
|
|
||
|
|
for (const feature of geoJsonData.features) {
|
||
|
|
const geoJsonId = feature.properties.cca;
|
||
|
|
const nombreGeoJson = normalizeString(feature.properties.nam);
|
||
|
|
|
||
|
|
if (apiNameMap.has(nombreGeoJson)) {
|
||
|
|
const apiId = apiNameMap.get(nombreGeoJson);
|
||
|
|
finalIdMap[geoJsonId] = apiId;
|
||
|
|
matches++;
|
||
|
|
} else {
|
||
|
|
notFound.push(feature.properties.nam);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log(`\n--- RESULTADOS ---`);
|
||
|
|
console.log(`Coincidencias encontradas: ${matches} de ${geoJsonData.features.length}`);
|
||
|
|
if (notFound.length > 0) {
|
||
|
|
console.warn(`\nNo se encontró coincidencia para los siguientes ${notFound.length} municipios del GeoJSON:`);
|
||
|
|
console.warn(notFound.join(', '));
|
||
|
|
}
|
||
|
|
|
||
|
|
fs.writeFileSync(OUTPUT_PATH, JSON.stringify(finalIdMap, null, 2));
|
||
|
|
console.log(`\n¡Éxito! El mapa de IDs se ha guardado en: ${OUTPUT_PATH}`);
|
||
|
|
|
||
|
|
} catch (error) {
|
||
|
|
console.error('\nOcurrió un error:', error.message);
|
||
|
|
if(error.code === 'ECONNREFUSED') {
|
||
|
|
console.error('Asegúrate de que tu servicio de API esté corriendo en la URL especificada.');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
reconcile();
|