From a5bc93f4d60db97d4b6992418f84dd6911b5f76d Mon Sep 17 00:00:00 2001 From: Quinn Hegeman <102350242+itsfinniii@users.noreply.github.com> Date: Sun, 8 Mar 2026 16:20:21 +0100 Subject: [PATCH] Get all projects and update sitemaps for it immediatly as well --- astro/src/content/projects/projects.ts | 73 +++++++++++++++++++ .../src/graphql/projects/getProjects.graphql | 39 ++++++++++ astro/src/lib/routing.ts | 13 +++- astro/src/pages/sitemap/index.xml.ts | 19 ++++- .../src/pages/sitemap/projects-[page].xml.ts | 25 +++++-- astro/src/pages/sitemap/projects.xml.ts | 25 ++++++- astro/src/types/projects/project.d.ts | 12 +++ 7 files changed, 195 insertions(+), 11 deletions(-) create mode 100644 astro/src/content/projects/projects.ts create mode 100644 astro/src/graphql/projects/getProjects.graphql create mode 100644 astro/src/types/projects/project.d.ts diff --git a/astro/src/content/projects/projects.ts b/astro/src/content/projects/projects.ts new file mode 100644 index 0000000..053d884 --- /dev/null +++ b/astro/src/content/projects/projects.ts @@ -0,0 +1,73 @@ +import { formatDate } from "@/lib/dates"; +import { createDirectusConnection } from "@/lib/directus"; +import { print } from "graphql"; +import getProjects from '@/graphql/projects/getProjects.graphql'; + + +export async function getAllProjects(settings: GlobalSettings): Promise { + const client = await createDirectusConnection(); + const result = await client.query(print(getProjects), { + date: formatDate(new Date(), "%Y-%M-%D") + }); + + let projects: ProjectPost[] = []; + + result["Projects"].forEach((projectRecord: any) => { + let dates: string[] = [ + settings.project.lastModified.toISOString(), + settings.website.lastModified.toISOString(), + projectRecord["date_created"], + projectRecord["date_updated"], + projectRecord["search_engine"][0]["date_created"], + projectRecord["search_engine"][0]["date_updated"], + projectRecord["search_engine"][0]["thumbnail"]["created_on"] + ]; + + const project: ProjectPost = { + lastModified: new Date(), + title: projectRecord["title"], + content: projectRecord["content"], + date: projectRecord["date"], + url: projectRecord["url"], + searchEngine: { + title: projectRecord["search_engine"][0]["title"], + description: projectRecord["search_engine"][0]["description"], + allowCrawlers: projectRecord["search_engine"][0]["allow_crawler"], + canonical: projectRecord["search_engine"][0]["canonical"], + priority: projectRecord["search_engine"][0]["priority"], + thumbnail: { + url: projectRecord["search_engine"][0]["thumbnail"]["filename_disk"], + height: projectRecord["search_engine"][0]["thumbnail"]["height"], + width: projectRecord["search_engine"][0]["thumbnail"]["width"] + } + }, + tags: [] + }; + + projectRecord["tags"].forEach((tagRecord: any) => { + project["tags"].push({ + text: tagRecord["Tags_id"]["text"], + code: tagRecord["Tags_id"]["code"], + color: tagRecord["Tags_id"]["color"] + }); + + dates.push(tagRecord["Tags_id"]["date_created"]); + dates.push(tagRecord["Tags_id"]["date_updated"]); + }); + + if (dates.filter(e => e !== null).length === 0) { + project.lastModified = new Date(); + } + else { + const sortedDates: string[] = dates.sort((a: string, b: string) => { + return new Date(b).getTime() - new Date(a).getTime(); + }); + + project.lastModified = new Date(sortedDates[0]); + } + + projects.push(project); + }); + + return projects; +} diff --git a/astro/src/graphql/projects/getProjects.graphql b/astro/src/graphql/projects/getProjects.graphql new file mode 100644 index 0000000..9a05ad1 --- /dev/null +++ b/astro/src/graphql/projects/getProjects.graphql @@ -0,0 +1,39 @@ +query getAllProjects($date: String!) { + Projects(sort: ["-date", "-date_created"], filter: { status: { _eq: "published" }, date: { _gte: $date } }) { + id, + date_created, + date_updated, + status, + title, + url, + date, + content, + tags { + Tags_id { + id, + date_created, + date_updated, + text, + code, + color + } + }, + search_engine { + id, + date_created, + date_updated, + title, + description, + thumbnail { + id, + created_on, + filename_download, + width, + height + }, + canonical, + allow_crawler, + priority + } + } +} diff --git a/astro/src/lib/routing.ts b/astro/src/lib/routing.ts index 9d94caa..846f846 100644 --- a/astro/src/lib/routing.ts +++ b/astro/src/lib/routing.ts @@ -7,4 +7,15 @@ export function getBlogRoute(blogSettings: BlogSettings, blog: BlogPost) { .replaceAll("%D", date.getDate().toString().padStart(2, '0')) .replaceAll("%R", blog.url) .replace(/\/+/g, '/'); -} \ No newline at end of file +} + +export function getProjectRoute(projectSettings: ProjectSettings, project: ProjectPost) { + const date = new Date(project.date); + + return projectSettings.projectRouteTemplate + .replaceAll("%Y", date.getFullYear().toString()) + .replaceAll("%M", (date.getMonth() + 1).toString().padStart(2, '0')) + .replaceAll("%D", date.getDate().toString().padStart(2, '0')) + .replaceAll("%R", project.url) + .replace(/\/+/g, '/'); +} diff --git a/astro/src/pages/sitemap/index.xml.ts b/astro/src/pages/sitemap/index.xml.ts index e76b10b..acf1fd7 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 { getAllProjects } from "@/content/projects/projects"; import { getSettings } from "@/content/settings/settings"; import type { APIRoute } from "astro"; import minifyXML from "minify-xml"; @@ -36,9 +37,25 @@ export const GET = (async () => { }); }; if (settings.project.enabled) { + const projectLastModifieds = [ + settings.project.lastModified, + settings.sitemap.lastModified, + settings.website.lastModified + ]; + + let projects = await getAllProjects(settings); + + projects.forEach((project) => { + projectLastModifieds.push(project.lastModified); + }); + + const lastModifiedProjects = projectLastModifieds.sort((a: Date, b: Date) => { + return b.getTime() - a.getTime(); + }); + sitemapIndex.push({ url: "/sitemap/projects.xml", - lastModified: new Date() + lastModified: lastModifiedProjects[0] }); }; if (settings.photo.enabled) { diff --git a/astro/src/pages/sitemap/projects-[page].xml.ts b/astro/src/pages/sitemap/projects-[page].xml.ts index 55db4f6..50a02a4 100644 --- a/astro/src/pages/sitemap/projects-[page].xml.ts +++ b/astro/src/pages/sitemap/projects-[page].xml.ts @@ -1,4 +1,6 @@ +import { getAllProjects } from "@/content/projects/projects"; import { getSettings } from "@/content/settings/settings"; +import { getProjectRoute } from "@/lib/routing"; import type { APIRoute } from "astro"; import minifyXML from "minify-xml"; @@ -14,12 +16,20 @@ export const GET = (async ({ params }) => { const currentPage = params.page; - let pages: SitemapPage[] = [ - { - url: "/", - lastModified: new Date() - } - ]; + const projects = await getAllProjects(settings); + const selectedProjects = projects.slice( + ((Number(currentPage) - 1) * settings.sitemap.perPage), + Number(currentPage) * settings.sitemap.perPage - 1 + ); + + let pages: SitemapPage[] = []; + + selectedProjects.forEach((project) => { + pages.push({ + url: getProjectRoute(settings.project, project), + lastModified: project.lastModified + }); + }); let sitemapContent = ` @@ -44,8 +54,9 @@ export const GET = (async ({ params }) => { export async function getStaticPaths() { const settings = await getSettings(); + const projects = await getAllProjects(settings); - const projectCount = 250; + const projectCount = projects.length; const perPage = settings.sitemap.perPage; const pages = Math.ceil(projectCount / perPage); diff --git a/astro/src/pages/sitemap/projects.xml.ts b/astro/src/pages/sitemap/projects.xml.ts index 78237b3..de3c6e7 100644 --- a/astro/src/pages/sitemap/projects.xml.ts +++ b/astro/src/pages/sitemap/projects.xml.ts @@ -1,3 +1,4 @@ +import { getAllProjects } from "@/content/projects/projects"; import { getSettings } from "@/content/settings/settings"; import type { APIRoute } from "astro"; import minifyXML from "minify-xml"; @@ -12,16 +13,36 @@ export const GET = (async () => { }); } - const projectCount = 250; + const projects = await getAllProjects(settings); + const projectCount = projects.length; const perPage = settings.sitemap.perPage; const pages = Math.ceil(projectCount / perPage); let sitemaps: SitemapIndex[] = []; for (let i = 0; i < pages; i++) { + const selectedProjects = projects.slice( + ((Number(i + 1) - 1) * settings.sitemap.perPage), + Number(i + 1) * settings.sitemap.perPage - 1 + ); + + let dates = [ + settings.sitemap.lastModified, + settings.project.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/projects-${i + 1}.xml`, - lastModified: new Date() + lastModified: lastModified[0] }); } diff --git a/astro/src/types/projects/project.d.ts b/astro/src/types/projects/project.d.ts new file mode 100644 index 0000000..661accf --- /dev/null +++ b/astro/src/types/projects/project.d.ts @@ -0,0 +1,12 @@ +type ProjectPost = { + title: string; + url: string; + date: string; + content: string; + + tags: Tag[]; + + searchEngine: SearchEngine; + + lastModified: Date; +}