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
5 changes: 5 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"enabledPlugins": {
"claude-seo@agricidaniel-seo": true
}
}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,6 @@ mongo-data
.env
deploy
front/.env.local
front/public/.DS_Store
.gitignore
.DS_Store
10 changes: 10 additions & 0 deletions front/src/app/aviso-legal/page.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
import type { Metadata } from "next";

export const metadata: Metadata = {
title: "Aviso Legal",
description:
"Aviso legal de InfoEmbalse: proyecto educativo open source de Lemoncode con información orientativa sobre los embalses de España.",
alternates: { canonical: "/aviso-legal" },
robots: { index: true, follow: true },
};

const LegalNoticePage = () => {
return (
<div className="container mx-auto max-w-3xl px-4 py-8">
Expand Down
1 change: 1 addition & 0 deletions front/src/app/embalse-cuenca/[cuenca]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {

return {
title: `Embalses de ${datosCuenca.nombre}`,
alternates: { canonical: `/embalse-cuenca/${cuenca}` },
};
}

Expand Down
3 changes: 3 additions & 0 deletions front/src/app/embalse-cuenca/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ export const revalidate = 300; // ISR: regenerar cada 5 minutos

export const metadata: Metadata = {
title: "Embalses por cuencas",
description:
"Listado completo de embalses de España agrupados por cuenca hidrográfica. Consulta los embalses de cada cuenca y su nivel actual.",
alternates: { canonical: "/embalse-cuenca" },
};

export default async function EmbalsesCuencasPage() {
Expand Down
1 change: 1 addition & 0 deletions front/src/app/embalse-provincia/[provincia]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {

return {
title: `Embalses de ${nombreProvincia}`,
alternates: { canonical: `/embalse-provincia/${provincia}` },
};
}

Expand Down
3 changes: 3 additions & 0 deletions front/src/app/embalse-provincia/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import { Metadata } from "next";

export const metadata: Metadata = {
title: "Embalses por provincias",
description:
"Listado completo de embalses de España agrupados por provincia. Consulta los embalses de tu provincia y su nivel actual.",
alternates: { canonical: "/embalse-provincia" },
};

export default function EmbalsesProvinciaPage() {
Expand Down
1 change: 1 addition & 0 deletions front/src/app/embalse/[embalse]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {

return {
title: embalseSlug.nombre,
alternates: { canonical: `/embalse/${embalse}` },
};
}

Expand Down
5 changes: 4 additions & 1 deletion front/src/app/equipo/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ import { Metadata } from "next";
import { EquipoPod } from "@/pods/equipo";

export const metadata: Metadata = {
title: "Equipo - InfoEmbalses",
title: "Equipo",
description:
"Equipo de desarrollo de InfoEmbalse. Conoce a las personas detrás del proyecto.",
alternates: { canonical: "/equipo" },
};

const EquipoPage = () => {
Expand Down
3 changes: 3 additions & 0 deletions front/src/app/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 33 additions & 0 deletions front/src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React from "react";
import type { Metadata } from "next";
import "./globals.css";
import { FooterComponent, HeaderComponent } from "../layouts";
import {
Expand All @@ -7,6 +8,38 @@ import {
GoogleAnalytics,
} from "../common/cookies";

const SITE_URL = "https://infoembalse.com";

export const metadata: Metadata = {
metadataBase: new URL(SITE_URL),
title: {
default: "InfoEmbalse — Nivel actual de los embalses de España",
template: "%s | InfoEmbalse",
},
description:
"Consulta el nivel actual, histórico y datos técnicos de todos los embalses de España. Información por provincia y por cuenca.",
applicationName: "InfoEmbalse",
alternates: { canonical: "/" },
openGraph: {
type: "website",
siteName: "InfoEmbalse",
locale: "es_ES",
url: SITE_URL,
title: "InfoEmbalse — Nivel actual de los embalses de España",
description:
"Consulta el nivel actual, histórico y datos técnicos de todos los embalses de España.",
images: [{ url: "/images/embalse-generico.jpg", width: 1200, height: 630 }],
},
twitter: {
card: "summary_large_image",
title: "InfoEmbalse — Nivel actual de los embalses de España",
description:
"Consulta el nivel actual, histórico y datos técnicos de todos los embalses de España.",
images: ["/images/embalse-generico.jpg"],
},
robots: { index: true, follow: true },
};

interface Props {
children: React.ReactNode;
}
Expand Down
10 changes: 10 additions & 0 deletions front/src/app/politica-cookies/page.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
import type { Metadata } from "next";

export const metadata: Metadata = {
title: "Política de Cookies",
description:
"Política de cookies de InfoEmbalse. Información sobre las cookies analíticas utilizadas y cómo gestionarlas.",
alternates: { canonical: "/politica-cookies" },
robots: { index: true, follow: true },
};

const CookiesPolicyPage = () => {
return (
<div className="container mx-auto max-w-3xl px-4 py-8">
Expand Down
17 changes: 17 additions & 0 deletions front/src/app/robots.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import type { MetadataRoute } from "next";

const SITE_URL = "https://infoembalse.com";

export default function robots(): MetadataRoute.Robots {
return {
rules: [
{
userAgent: "*",
allow: "/",
disallow: ["/_next/", "/api/"],
},
],
sitemap: `${SITE_URL}/sitemap.xml`,
host: SITE_URL,
};
}
80 changes: 80 additions & 0 deletions front/src/app/sitemap.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import type { MetadataRoute } from "next";
import { PROVINCIAS } from "@/core/constants";
import { cuencas } from "@/core/constants";
import { getEmbalsesCollection } from "@/pods/embalse-search/api";

const SITE_URL = "https://infoembalse.com";

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const now = new Date();

const staticEntries: MetadataRoute.Sitemap = [
{
url: `${SITE_URL}/`,
lastModified: now,
changeFrequency: "daily",
priority: 1,
},
{
url: `${SITE_URL}/embalse-provincia`,
lastModified: now,
changeFrequency: "weekly",
priority: 0.8,
},
{
url: `${SITE_URL}/embalse-cuenca`,
lastModified: now,
changeFrequency: "weekly",
priority: 0.8,
},
{
url: `${SITE_URL}/equipo`,
lastModified: now,
changeFrequency: "monthly",
priority: 0.3,
},
{
url: `${SITE_URL}/aviso-legal`,
lastModified: now,
changeFrequency: "yearly",
priority: 0.1,
},
{
url: `${SITE_URL}/politica-cookies`,
lastModified: now,
changeFrequency: "yearly",
priority: 0.1,
},
];

const provinciaEntries: MetadataRoute.Sitemap = PROVINCIAS.map((p) => ({
url: `${SITE_URL}/embalse-provincia/${p.id}`,
lastModified: now,
changeFrequency: "daily",
priority: 0.7,
}));

const cuencaEntries: MetadataRoute.Sitemap = Object.values(cuencas).map(
(c) => ({
url: `${SITE_URL}/embalse-cuenca/${c.slug}`,
lastModified: now,
changeFrequency: "daily",
priority: 0.7,
}),
);

const embalses = await getEmbalsesCollection();
const embalseEntries: MetadataRoute.Sitemap = embalses.map((e) => ({
url: `${SITE_URL}/embalse/${e._id}`,
lastModified: now,
changeFrequency: "daily",
priority: 0.9,
}));

return [
...staticEntries,
...provinciaEntries,
...cuencaEntries,
...embalseEntries,
];
}
2 changes: 1 addition & 1 deletion front/tsconfig.tsbuildinfo

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions temp/gota.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading