From 139448ff87f801c7790e4f69420c15afc5fa379d Mon Sep 17 00:00:00 2001 From: manugallegob Date: Mon, 23 Feb 2026 20:32:08 +0100 Subject: [PATCH 1/2] feat: add embalses by province --- .../embalse-provincia/[provincia]/page.tsx | 28 ++++++-------- .../embalse-provincia.api-model.ts | 4 ++ .../embalse-provincia.component.tsx | 6 ++- .../embalse-provincia.mapper.ts | 13 +++++++ .../embalse-provincia.repository.ts | 37 +++++++++++++++++++ package-lock.json | 9 ++--- 6 files changed, 75 insertions(+), 22 deletions(-) create mode 100644 front/src/pods/embalse-provincia/embalse-provincia.api-model.ts create mode 100644 front/src/pods/embalse-provincia/embalse-provincia.mapper.ts create mode 100644 front/src/pods/embalse-provincia/embalse-provincia.repository.ts diff --git a/front/src/app/embalse-provincia/[provincia]/page.tsx b/front/src/app/embalse-provincia/[provincia]/page.tsx index 41edcda..df3d54f 100644 --- a/front/src/app/embalse-provincia/[provincia]/page.tsx +++ b/front/src/app/embalse-provincia/[provincia]/page.tsx @@ -1,17 +1,20 @@ import { PROVINCIAS } from "@/core/constants"; import { EmbalseProvinciaPod } from "@/pods/embalse-provincia"; +import { mapEmbalseListFromApiToLookup } from "@/pods/embalse-provincia/embalse-provincia.mapper"; +import { getEmbalsesByProvince } from "@/pods/embalse-provincia/embalse-provincia.repository"; import { Metadata } from "next"; interface Props { params: Promise<{ provincia: string }>; } +const getNombreProvincia = (id: string): string => + PROVINCIAS.find((p) => p.id === id)?.name ?? "Provincia"; + export async function generateMetadata({ params }: Props): Promise { const { provincia } = await params; - const nombreProvincia = PROVINCIAS.find( - (province) => province.id === provincia, - )?.name; + const nombreProvincia = getNombreProvincia(provincia); return { title: `Embalses de ${nombreProvincia}`, @@ -21,24 +24,17 @@ export async function generateMetadata({ params }: Props): Promise { export default async function EmbalseProvinciaListadoPage({ params }: Props) { const { provincia } = await params; - const nombreProvincia = PROVINCIAS.find( - (province) => province.id === provincia, - )?.name; + const nombreProvincia = getNombreProvincia(provincia); + + const embalsesByProvinceFromApi = await getEmbalsesByProvince(provincia); - // TODO: Reemplazar con datos reales obtenidos de la API - const reservoirs = [ - { id: "ullibarri-gamboa", name: "Ullibarri-Gamboa" }, - { id: "zadorra", name: "Zadorra" }, - { id: "urrúnaga", name: "Urrunaga" }, - { id: "maroño", name: "Maroño" }, - { id: "albina", name: "Albina" }, - { id: "santa-engracia", name: "Santa Engracia" }, - ]; + const embalsesByProvinceLookup = mapEmbalseListFromApiToLookup(embalsesByProvinceFromApi); + console.log('embalsesLookup:', embalsesByProvinceLookup); return ( ); } diff --git a/front/src/pods/embalse-provincia/embalse-provincia.api-model.ts b/front/src/pods/embalse-provincia/embalse-provincia.api-model.ts new file mode 100644 index 0000000..ff4f9c8 --- /dev/null +++ b/front/src/pods/embalse-provincia/embalse-provincia.api-model.ts @@ -0,0 +1,4 @@ +export interface EmbalseApi { + _id: string; + name: string; +} \ No newline at end of file diff --git a/front/src/pods/embalse-provincia/embalse-provincia.component.tsx b/front/src/pods/embalse-provincia/embalse-provincia.component.tsx index a5a53ee..4f6bc7d 100644 --- a/front/src/pods/embalse-provincia/embalse-provincia.component.tsx +++ b/front/src/pods/embalse-provincia/embalse-provincia.component.tsx @@ -12,7 +12,11 @@ export const EmbalseProvincia: React.FC = (props) => { const { nombreProvincia, embalses } = props; return ( -

Embalses de {nombreProvincia}

+ {embalses.length === 0 ? ( +

No se encontraron embalses para {nombreProvincia}

+ ) : ( +

Embalses de {nombreProvincia}

+ )} {embalses.map(({ id, name }) => ( diff --git a/front/src/pods/embalse-provincia/embalse-provincia.mapper.ts b/front/src/pods/embalse-provincia/embalse-provincia.mapper.ts new file mode 100644 index 0000000..cc1ee36 --- /dev/null +++ b/front/src/pods/embalse-provincia/embalse-provincia.mapper.ts @@ -0,0 +1,13 @@ +import { Lookup } from "@/common/models"; +import { EmbalseApi } from "./embalse-provincia.api-model"; + +export const mapEmbalseListFromApiToLookup = ( + embalses: EmbalseApi[] +): Lookup[] => + Array.isArray(embalses) + ? embalses.map((embalse) => ({ + id: embalse._id, + text: embalse.name, + name: embalse.name, + })) + : []; \ No newline at end of file diff --git a/front/src/pods/embalse-provincia/embalse-provincia.repository.ts b/front/src/pods/embalse-provincia/embalse-provincia.repository.ts new file mode 100644 index 0000000..89f1f60 --- /dev/null +++ b/front/src/pods/embalse-provincia/embalse-provincia.repository.ts @@ -0,0 +1,37 @@ +"use server"; + +import { getDb } from "@/lib/mongodb"; +import type { EmbalseApi } from "./embalse-provincia.api-model"; + +export async function getEmbalsesByProvince(provincia: string): Promise { + try { + + const db = await getDb(); + const docs = await db + .collection("embalses") + .find( + {provincia: { $regex: new RegExp(provincia, "i") }}, + { + projection: { + _id: 1, + nombre: 1, + slug: 1, + }, + }, + ) + .toArray(); + + console.log(docs) + return docs.map((doc) => ({ + _id: doc.slug ?? String(doc._id), + name: doc.nombre ?? "", + })); + } catch (error) { + console.warn( + "getEmbalsesByProvince: MongoDB not available (build time?), returning empty array.", + "Error:", error instanceof Error ? error.message : error + ); + return []; + } +} + diff --git a/package-lock.json b/package-lock.json index bdf99ea..9a32a24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5853,17 +5853,16 @@ "arcgis": "*", "db-model": "*", "mongodb": "^6.19.0", - "scraping-cuenca-mediterranea": "*" - }, - "devDependencies": { - "@types/prompts": "^2.4.9", - "prompts": "^2.4.2", "scraping-cuenca-cantabrico": "*", "scraping-cuenca-catalana": "*", "scraping-cuenca-duero": "*", "scraping-cuenca-guadalquivir": "*", "scraping-cuenca-jucar": "*", "scraping-cuenca-mediterranea": "*" + }, + "devDependencies": { + "@types/prompts": "^2.4.9", + "prompts": "^2.4.2" } }, "packages/db-model": { From aca491c92f521f382ef4795bc4d2d4bee1e5ab9c Mon Sep 17 00:00:00 2001 From: Braulio Date: Tue, 24 Feb 2026 10:26:33 +0100 Subject: [PATCH 2/2] updated --- .../src/app/embalse-provincia/[provincia]/page.tsx | 11 ++++++----- .../embalse-provincia.repository.ts | 13 +++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/front/src/app/embalse-provincia/[provincia]/page.tsx b/front/src/app/embalse-provincia/[provincia]/page.tsx index df3d54f..88f8f30 100644 --- a/front/src/app/embalse-provincia/[provincia]/page.tsx +++ b/front/src/app/embalse-provincia/[provincia]/page.tsx @@ -8,7 +8,7 @@ interface Props { params: Promise<{ provincia: string }>; } -const getNombreProvincia = (id: string): string => +const getNombreProvincia = (id: string): string => PROVINCIAS.find((p) => p.id === id)?.name ?? "Provincia"; export async function generateMetadata({ params }: Props): Promise { @@ -25,11 +25,12 @@ export default async function EmbalseProvinciaListadoPage({ params }: Props) { const { provincia } = await params; const nombreProvincia = getNombreProvincia(provincia); + const embalsesByProvinceFromApi = + await getEmbalsesByProvince(nombreProvincia); - const embalsesByProvinceFromApi = await getEmbalsesByProvince(provincia); - - const embalsesByProvinceLookup = mapEmbalseListFromApiToLookup(embalsesByProvinceFromApi); - console.log('embalsesLookup:', embalsesByProvinceLookup); + const embalsesByProvinceLookup = mapEmbalseListFromApiToLookup( + embalsesByProvinceFromApi, + ); return ( { +export async function getEmbalsesByProvince( + provincia: string, +): Promise { try { - const db = await getDb(); const docs = await db .collection("embalses") .find( - {provincia: { $regex: new RegExp(provincia, "i") }}, + { provincia }, { projection: { _id: 1, @@ -21,7 +22,7 @@ export async function getEmbalsesByProvince(provincia: string): Promise ({ _id: doc.slug ?? String(doc._id), name: doc.nombre ?? "", @@ -29,9 +30,9 @@ export async function getEmbalsesByProvince(provincia: string): Promise