Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions functions/src/functions/scraping-functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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;
Expand All @@ -79,9 +89,6 @@ export async function scrapingsFunction(
await dbServer.disconnect();
context.log("scrapings-function: END");
}



await dbServer.disconnect();
}

Expand Down
10 changes: 8 additions & 2 deletions integrations/scraping-cuenca-jucar/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
4 changes: 2 additions & 2 deletions integrations/scraping-cuenca-jucar/src/api/index.ts
Original file line number Diff line number Diff line change
@@ -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';
5 changes: 2 additions & 3 deletions integrations/scraping-cuenca-jucar/src/console-runner.ts
Original file line number Diff line number Diff line change
@@ -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);
2 changes: 1 addition & 1 deletion integrations/scraping-cuenca-jucar/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export * from "./integration";
export * from "./integration.js";
12 changes: 6 additions & 6 deletions integrations/scraping-cuenca-jucar/src/integration.ts
Original file line number Diff line number Diff line change
@@ -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<EmbalseUpdateSAIHEntity[]> {
const html = await getCuencaPageHTMLContent(url);
export async function scrapeCuencaJucar(): Promise<EmbalseUpdateSAIHEntity[]> {
const URL = 'https://saih.chj.es/resumen-embalses';

const html = await getCuencaPageHTMLContent(URL);
const $: cheerio.CheerioAPI = cheerio.load(html);

// Extract and map reservoir data
Expand Down
4 changes: 2 additions & 2 deletions integrations/scraping-cuenca-jucar/src/scraper/business.ts
Original file line number Diff line number Diff line change
@@ -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 = '';
Expand Down
4 changes: 2 additions & 2 deletions integrations/scraping-cuenca-jucar/src/scraper/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
export * from './business';
export * from './mapper';
export * from './business.js';
export * from './mapper.js';
6 changes: 3 additions & 3 deletions integrations/scraping-cuenca-jucar/src/scraper/mapper.ts
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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:
Expand Down
19 changes: 9 additions & 10 deletions integrations/scraping-cuenca-jucar/tsconfig.json
Original file line number Diff line number Diff line change
@@ -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"]
}
"include": ["src/**/*"],
"exclude": ["dist", "node_modules"]
}
3 changes: 2 additions & 1 deletion packages/db/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"scraping-cuenca-cantabrico": "*",
"scraping-cuenca-catalana": "*",
"scraping-cuenca-duero": "*",
"scraping-cuenca-guadalquivir": "*"
"scraping-cuenca-guadalquivir": "*",
"scraping-cuenca-jucar": "*"
}
}
28 changes: 28 additions & 0 deletions packages/db/src/dals/embalses/embalses.mappers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 }],
]);
52 changes: 51 additions & 1 deletion packages/db/src/dals/embalses/embalses.repository.ts
Original file line number Diff line number Diff line change
@@ -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 = {
Expand Down Expand Up @@ -287,6 +288,55 @@ export const embalsesRepository = {
`Resumen Cuenca Duero: ${actualizados} actualizados, ${noEncontrados} no encontrados, ${sinMapper} sin mapper`
);

return actualizados > 0;
},
actualizarCuencaJucar: async (): Promise<boolean> => {
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;
}
};