diff --git a/astro/src/lib/routing.ts b/astro/src/lib/routing.ts index 846f846..b8e273f 100644 --- a/astro/src/lib/routing.ts +++ b/astro/src/lib/routing.ts @@ -19,3 +19,15 @@ export function getProjectRoute(projectSettings: ProjectSettings, project: Proje .replaceAll("%R", project.url) .replace(/\/+/g, '/'); } + +export function getAlbumRoute(photoSettings: WebsitePhotoSettings, album: PhotoAlbum) { + const date = new Date(album.startDate); + + return photoSettings.album.routeTemplate + .replaceAll("%Y", date.getFullYear().toString()) + .replaceAll("%M", (date.getMonth() + 1).toString().padStart(2, '0')) + .replaceAll("%D", date.getDate().toString().padStart(2, '0')) + .replaceAll("%C", album.category.url) + .replaceAll("%R", album.url) + .replace(/\/+/g, '/'); +} diff --git a/astro/src/pages/index.astro b/astro/src/pages/index.astro index 03efb7d..ccc1036 100644 --- a/astro/src/pages/index.astro +++ b/astro/src/pages/index.astro @@ -5,8 +5,6 @@ import WebpageLayout from "@/layouts/WebpageLayout.astro"; const settings = await getSettings(); const albums = await getAllAlbums(settings); - -console.log(albums); --- diff --git a/astro/src/pages/sitemap/albums-[page].xml.ts b/astro/src/pages/sitemap/albums-[page].xml.ts index 94fe0f1..348fe98 100644 --- a/astro/src/pages/sitemap/albums-[page].xml.ts +++ b/astro/src/pages/sitemap/albums-[page].xml.ts @@ -1,18 +1,35 @@ +import { getAllAlbums } from "@/content/photos/albums"; import { getSettings } from "@/content/settings/settings"; +import { getAlbumRoute } from "@/lib/routing"; import type { APIRoute } from "astro"; import minifyXML from "minify-xml"; export const GET = (async ({ params }) => { const settings = await getSettings(); + if (!settings.photo.enabled) { + return new Response(null, { + status: 204, + statusText: "Not Found" + }); + } + const currentPage = params.page; - let pages: SitemapPage[] = [ - { - url: "/", - lastModified: new Date() - } - ]; + const albums = await getAllAlbums(settings); + const selectedAlbums = albums.slice( + ((Number(currentPage) - 1) * settings.sitemap.perPage), + Number(currentPage) * settings.sitemap.perPage - 1 + ); + + let pages: SitemapPage[] = []; + + selectedAlbums.forEach((album) => { + pages.push({ + url: getAlbumRoute(settings.photo, album), + lastModified: album.lastModified + }); + }); let sitemapContent = ` @@ -37,8 +54,9 @@ export const GET = (async ({ params }) => { export async function getStaticPaths() { const settings = await getSettings(); + const albums = await getAllAlbums(settings); - const albumCount = 250; + const albumCount = albums.length; const perPage = settings.sitemap.perPage; const pages = Math.ceil(albumCount / perPage); diff --git a/astro/src/pages/sitemap/albums.xml.ts b/astro/src/pages/sitemap/albums.xml.ts index c4de286..9abddd0 100644 --- a/astro/src/pages/sitemap/albums.xml.ts +++ b/astro/src/pages/sitemap/albums.xml.ts @@ -1,3 +1,4 @@ +import { getAllAlbums } from "@/content/photos/albums"; import { getSettings } from "@/content/settings/settings"; import type { APIRoute } from "astro"; import minifyXML from "minify-xml"; @@ -5,16 +6,43 @@ import minifyXML from "minify-xml"; export const GET = (async () => { const settings = await getSettings(); - const albumCount = 250; + if (!settings.photo.enabled) { + return new Response(null, { + status: 204, + statusText: "Not Found" + }); + } + + const albums = await getAllAlbums(settings); + const albumCount = albums.length; const perPage = settings.sitemap.perPage; const pages = Math.ceil(albumCount / perPage); let sitemaps: SitemapIndex[] = []; for (let i = 0; i < pages; i++) { + const selectedProjects = albums.slice( + ((Number(i + 1) - 1) * settings.sitemap.perPage), + Number(i + 1) * settings.sitemap.perPage - 1 + ); + + let dates = [ + settings.sitemap.lastModified, + settings.photo.lastModified, + settings.website.lastModified + ]; + + selectedProjects.forEach((project) => { + dates.push(project.lastModified); + }); + + const lastModified = dates.sort((a: Date, b: Date) => { + return b.getTime() - a.getTime(); + }); + sitemaps.push({ url: `/sitemap/albums-${i + 1}.xml`, - lastModified: new Date() + lastModified: lastModified[0] }); } diff --git a/astro/src/pages/sitemap/index.xml.ts b/astro/src/pages/sitemap/index.xml.ts index acf1fd7..1a81aa4 100644 --- a/astro/src/pages/sitemap/index.xml.ts +++ b/astro/src/pages/sitemap/index.xml.ts @@ -1,4 +1,5 @@ import { getAllBlogs } from "@/content/blogs/blogs"; +import { getAllAlbums } from "@/content/photos/albums"; import { getAllProjects } from "@/content/projects/projects"; import { getSettings } from "@/content/settings/settings"; import type { APIRoute } from "astro"; @@ -59,10 +60,26 @@ export const GET = (async () => { }); }; if (settings.photo.enabled) { + const photoLastModifieds = [ + settings.photo.lastModified, + settings.sitemap.lastModified, + settings.website.lastModified + ]; + + let albums = await getAllAlbums(settings); + + albums.forEach((album) => { + photoLastModifieds.push(album.lastModified); + }); + + const lastModifiedAlbums = photoLastModifieds.sort((a: Date, b: Date) => { + return b.getTime() - a.getTime(); + }); + sitemapIndex.push({ url: "/sitemap/albums.xml", - lastModified: new Date() - }) + lastModified: lastModifiedAlbums[0] + }); }; let sitemapContent = `