diff --git a/functions/src/functions/scraping-functions.ts b/functions/src/functions/scraping-functions.ts index a25abb8..75bd7bc 100644 --- a/functions/src/functions/scraping-functions.ts +++ b/functions/src/functions/scraping-functions.ts @@ -31,6 +31,8 @@ export async function scrapingsFunction( const responseCuencaGuadalquivir = await embalsesRepository.actualizarCuencaGuadalquivir(); + const responseCuencaJucar = await embalsesRepository.actualizarCuencaJucar(); + if (responseCuencaMediterranea) { context.log( "scrapings-function: Se han actualizado los embalses de la cuenca Mediterránea", @@ -71,6 +73,14 @@ export async function scrapingsFunction( "No se han podido actualizar los embalses de la cuenca Guadalquivir") } + if (responseCuencaJucar) { + context.log(`Se han actualizado los embalses de la cuenca Jucar`); + } else { + context.log( + "No se han podido actualizar los embalses de la cuenca Jucar" + ); + } + } catch (error) { context.error("scrapings-function: ERROR", error); throw error; @@ -79,9 +89,6 @@ export async function scrapingsFunction( await dbServer.disconnect(); context.log("scrapings-function: END"); } - - - await dbServer.disconnect(); } diff --git a/integrations/scraping-cuenca-jucar/package.json b/integrations/scraping-cuenca-jucar/package.json index edd527c..238173b 100644 --- a/integrations/scraping-cuenca-jucar/package.json +++ b/integrations/scraping-cuenca-jucar/package.json @@ -4,10 +4,16 @@ "private": true, "type": "module", "exports": { - ".": "./src/index.ts" + ".": "./dist/index.js" }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "scripts": { - "start": "tsx --watch src/console-runner.ts" + "start": "tsx --watch src/console-runner.ts", + "build": "run-p clean type-check build:scraping-cuenca-jucar", + "build:scraping-cuenca-jucar": "tsc", + "clean": "rimraf dist", + "type-check": "tsc --noEmit --preserveWatchOutput" }, "dependencies": { "db-model": "^1.0.0" diff --git a/integrations/scraping-cuenca-jucar/src/api/index.ts b/integrations/scraping-cuenca-jucar/src/api/index.ts index 3d2942a..ea837ee 100644 --- a/integrations/scraping-cuenca-jucar/src/api/index.ts +++ b/integrations/scraping-cuenca-jucar/src/api/index.ts @@ -1,3 +1,3 @@ // Barrel file for API exports -export * from './cuenca.api'; -export * from './cuenca.model'; +export * from './cuenca.api.js'; +export * from './cuenca.model.js'; diff --git a/integrations/scraping-cuenca-jucar/src/console-runner.ts b/integrations/scraping-cuenca-jucar/src/console-runner.ts index d38d13e..de8d7c3 100644 --- a/integrations/scraping-cuenca-jucar/src/console-runner.ts +++ b/integrations/scraping-cuenca-jucar/src/console-runner.ts @@ -1,6 +1,5 @@ -import { scrapeCuencaJucar } from './integration'; +import { scrapeCuencaJucar } from './integration.js'; -const URL = 'https://saih.chj.es/resumen-embalses'; console.log('Estado de la Cuenca Júcar:'); -const result = await scrapeCuencaJucar(URL); +const result = await scrapeCuencaJucar(); console.log(result); diff --git a/integrations/scraping-cuenca-jucar/src/index.ts b/integrations/scraping-cuenca-jucar/src/index.ts index 852c5e3..ba7a4ee 100644 --- a/integrations/scraping-cuenca-jucar/src/index.ts +++ b/integrations/scraping-cuenca-jucar/src/index.ts @@ -1 +1 @@ -export * from "./integration"; +export * from "./integration.js"; diff --git a/integrations/scraping-cuenca-jucar/src/integration.ts b/integrations/scraping-cuenca-jucar/src/integration.ts index fcaaf29..000efe2 100644 --- a/integrations/scraping-cuenca-jucar/src/integration.ts +++ b/integrations/scraping-cuenca-jucar/src/integration.ts @@ -1,19 +1,19 @@ import * as cheerio from 'cheerio'; -import { getCuencaPageHTMLContent } from '@/api'; +import { getCuencaPageHTMLContent } from './api/index.js'; import { extractReservoirsFromJucarPage, mapToEmbalseUpdateSAIH, -} from '@/scraper'; +} from './scraper/index.js'; import { EmbalseUpdateSAIHEntity } from 'db-model'; /** * Scrapes Júcar reservoir data and returns it as an array. * @param url - The URL to scrape the data from */ -export async function scrapeCuencaJucar( - url: string -): Promise { - const html = await getCuencaPageHTMLContent(url); +export async function scrapeCuencaJucar(): Promise { + const URL = 'https://saih.chj.es/resumen-embalses'; + + const html = await getCuencaPageHTMLContent(URL); const $: cheerio.CheerioAPI = cheerio.load(html); // Extract and map reservoir data diff --git a/integrations/scraping-cuenca-jucar/src/scraper/business.ts b/integrations/scraping-cuenca-jucar/src/scraper/business.ts index 4df2d93..673dc7e 100644 --- a/integrations/scraping-cuenca-jucar/src/scraper/business.ts +++ b/integrations/scraping-cuenca-jucar/src/scraper/business.ts @@ -1,7 +1,7 @@ import vm from 'vm'; import { CheerioAPI } from 'cheerio'; -import { EmbalsesJucar } from '@/api'; -import { mapEmbalsesToEntities } from '@/scraper'; +import { EmbalsesJucar } from '../api/index.js'; +import { mapEmbalsesToEntities } from '../scraper/index.js'; function extractSubCuencasArrayText($: CheerioAPI): string { let subCuencasArrayText = ''; diff --git a/integrations/scraping-cuenca-jucar/src/scraper/index.ts b/integrations/scraping-cuenca-jucar/src/scraper/index.ts index bbb6227..4f25535 100644 --- a/integrations/scraping-cuenca-jucar/src/scraper/index.ts +++ b/integrations/scraping-cuenca-jucar/src/scraper/index.ts @@ -1,2 +1,2 @@ -export * from './business'; -export * from './mapper'; +export * from './business.js'; +export * from './mapper.js'; diff --git a/integrations/scraping-cuenca-jucar/src/scraper/mapper.ts b/integrations/scraping-cuenca-jucar/src/scraper/mapper.ts index f7fec80..71a1343 100644 --- a/integrations/scraping-cuenca-jucar/src/scraper/mapper.ts +++ b/integrations/scraping-cuenca-jucar/src/scraper/mapper.ts @@ -1,6 +1,6 @@ import { EmbalseUpdateSAIHEntity } from 'db-model'; -import { EmbalsesJucar } from '@/api'; -import { formatFechaComunicacionVol } from '@/scraper'; +import { EmbalsesJucar } from '../api/index.js'; +import { formatFechaComunicacionVol } from '../scraper/index.js'; /** * Maps subCuencasArray to EmbalsesJucar array format. @@ -14,7 +14,7 @@ export function mapEmbalsesToEntities(subCuencasArray: any[]): EmbalsesJucar[] { const capacidadTotalHm3 = embalse.fldFVolumenNMN ?? 0; const volumenActualHm3 = embalse.valorVolumenEmbalse ?? 0; reservoirs.push({ - id: embalse.idEstacionRemota, + id: Number(embalse.idEstacionRemota), embalse: embalse.fldTNombre, provincia: embalse.fldTProvincia, porcentajeActual: diff --git a/integrations/scraping-cuenca-jucar/tsconfig.json b/integrations/scraping-cuenca-jucar/tsconfig.json index 7a50601..ce7b1d4 100644 --- a/integrations/scraping-cuenca-jucar/tsconfig.json +++ b/integrations/scraping-cuenca-jucar/tsconfig.json @@ -1,17 +1,16 @@ { "compilerOptions": { "target": "ESNext", - "module": "ESNext", - "moduleResolution": "bundler", + "module": "nodenext", + "moduleResolution": "nodenext", + "outDir": "dist", "skipLibCheck": true, "isolatedModules": true, "esModuleInterop": true, - "baseUrl": "./", - "paths": { - "@/*": ["src/*"], - "@/api/*": ["src/api/*"], - "@/scraper/*": ["src/scraper/*"] - } + "verbatimModuleSyntax": false, + "declaration": true, + "baseUrl": "./" }, - "include": ["src"] -} \ No newline at end of file + "include": ["src/**/*"], + "exclude": ["dist", "node_modules"] +} diff --git a/packages/db/package.json b/packages/db/package.json index 171dbe8..a142f29 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -34,6 +34,7 @@ "scraping-cuenca-cantabrico": "*", "scraping-cuenca-catalana": "*", "scraping-cuenca-duero": "*", - "scraping-cuenca-guadalquivir": "*" + "scraping-cuenca-guadalquivir": "*", + "scraping-cuenca-jucar": "*" } } diff --git a/packages/db/src/dals/embalses/embalses.mappers.ts b/packages/db/src/dals/embalses/embalses.mappers.ts index de0f01f..09e4573 100644 --- a/packages/db/src/dals/embalses/embalses.mappers.ts +++ b/packages/db/src/dals/embalses/embalses.mappers.ts @@ -172,3 +172,31 @@ export const mapperFromCuencasGuadalquivirToArcgis = new Map< [54, { nombre: "José Torán", idArcgis: 174 }], [55, { nombre: "La Puebla de Cazalla", idArcgis: 241 }], ]) + +// Ojo VALBONA, TORANES, MORA, BALAGUERAS, L'ALCORA, ONDA, Cortes II, El Naranjero, + +export const mapperFromCuencasJucarToArcgis = new Map< + number, + InfoDestinoArcgis +>([ + [243, { nombre: "Ulldecona", idArcgis: 320 }], + [266, { nombre: "Arenós", idArcgis: 28 }], + [247, { nombre: "Sichar", idArcgis: 294 }], + [248, { nombre: "María Cristina", idArcgis: 197 }], + [221, { nombre: "Regajo", idArcgis: 249 }], + [381, { nombre: "Algar", idArcgis: 374 }], + [270, { nombre: "Arquillo de San Blas", idArcgis: 31 }], + [293, { nombre: "Benagéber", idArcgis: 49 }], + [294, { nombre: "Loriguilla", idArcgis: 188 }], + [295, { nombre: "Buseo", idArcgis: 66 }], + [280, { nombre: "La Toba", idArcgis: 182 }], + [541, { nombre: "Alarcón", idArcgis: 9 }], + [287, { nombre: "Contreras", idArcgis: 109 }], + [359, { nombre: "Escalona", idArcgis: 130 }], + [300, { nombre: "Tous - La Ribera", idArcgis: 315 }], + [328, { nombre: "Bellús", idArcgis: 47 }], + [303, { nombre: "Forata", idArcgis: 139 }], + [346, { nombre: "Beniarrés", idArcgis: 50 }], + [332, { nombre: "Guadalest", idArcgis: 153 }], + [331, { nombre: "Amadorio", idArcgis: 23 }], +]); diff --git a/packages/db/src/dals/embalses/embalses.repository.ts b/packages/db/src/dals/embalses/embalses.repository.ts index 07eeed5..af44fa2 100644 --- a/packages/db/src/dals/embalses/embalses.repository.ts +++ b/packages/db/src/dals/embalses/embalses.repository.ts @@ -1,11 +1,12 @@ import { scrapeSeedEmbalses } from "arcgis"; import { getEmbalsesContext } from "./embalses.context.js"; -import { mapperFromCuencasMediterraneaToArcgis, mapperFromCuencasCantabricoToArcgis, mapperFromCuencasCatalanaToArcgis, mapperFromCuencasDueroToArcgis, mapperFromCuencasGuadalquivirToArcgis } from "./embalses.mappers.js"; +import { mapperFromCuencasMediterraneaToArcgis, mapperFromCuencasCantabricoToArcgis, mapperFromCuencasCatalanaToArcgis, mapperFromCuencasDueroToArcgis, mapperFromCuencasGuadalquivirToArcgis, mapperFromCuencasJucarToArcgis } from "./embalses.mappers.js"; import { scrapeCuencaMediterranea } from "scraping-cuenca-mediterranea"; import { scrapeCuencaCantabrica } from 'scraping-cuenca-cantabrico'; import { integracionCuencaCatalana } from 'scraping-cuenca-catalana'; import { getEstadoCuencaDuero } from 'scraping-cuenca-duero'; import { scrapeCuencaGuadalquivir } from 'scraping-cuenca-guadalquivir'; +import { scrapeCuencaJucar } from 'scraping-cuenca-jucar'; import { parseDate } from "./embalses.helpers.js"; export const embalsesRepository = { @@ -287,6 +288,55 @@ export const embalsesRepository = { `Resumen Cuenca Duero: ${actualizados} actualizados, ${noEncontrados} no encontrados, ${sinMapper} sin mapper` ); + return actualizados > 0; + }, + actualizarCuencaJucar: async (): Promise => { + const embalsesJucar = await scrapeCuencaJucar(); + + console.log( + `Se han scrapeado ${embalsesJucar.length} embalses de la Cuenca Jucar` + ); + + let actualizados = 0; + let noEncontrados = 0; + let sinMapper = 0; + + for (const embalse of embalsesJucar) { + const infoDestino = mapperFromCuencasJucarToArcgis.get(embalse.id); + + if (!infoDestino) { + sinMapper++; + console.warn(`Sin mapper para ID ${embalse.id} - ${embalse.nombre}`); + continue; + } + + console.log( + `🔍 Mapeando: ID scraping ${embalse.id} -> _id BD ${infoDestino.idArcgis} (${infoDestino.nombre})` + ); + + const { matchedCount } = await getEmbalsesContext().updateOne( + { _id: infoDestino.idArcgis.toString() }, + { + $set: { + aguaActualSAIH: embalse.aguaActualSAIH, + fechaMedidaAguaActualSAIH: parseDate(embalse.fechaMedidaSAIH), + }, + } + ); + + if (matchedCount > 0) { + actualizados++; + console.log( + `Actualizado: ${infoDestino.nombre} (_id: ${infoDestino.idArcgis}) -> ${embalse.aguaActualSAIH} hm³` + ); + } else { + noEncontrados++; + console.warn( + `No encontrado en BD: _id ${infoDestino.idArcgis} - ${infoDestino.nombre}` + ); + } + } + return actualizados > 0; } };