From 129a59340a051533c7350264b5ed94c4e02bacbf Mon Sep 17 00:00:00 2001 From: Xevion Date: Sat, 5 Apr 2025 22:10:03 -0500 Subject: [PATCH] Switched /api/resume to /resume with ISR, added additional classic redirects --- next.config.mjs | 17 ++++++++++++++-- src/pages/[resume].tsx | 43 +++++++++++++++++++++++++++++++++++++++++ src/pages/api/resume.ts | 28 --------------------------- 3 files changed, 58 insertions(+), 30 deletions(-) create mode 100644 src/pages/[resume].tsx delete mode 100644 src/pages/api/resume.ts diff --git a/next.config.mjs b/next.config.mjs index ba5d875..dcc8cc7 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -72,8 +72,21 @@ const config = { async redirects() { // Source cannot end with / slash return [ - { source: "/resume", destination: "/api/resume", permanent: false }, - { source: "/resume.pdf", destination: "/api/resume", permanent: false }, + ...[ + "resume.pdf", + "resume.docx", + "resume.txt", + "resum", + "resumee", + "cv", + "cover.pdf", + "cv.docx", + "cv.pdf", + ].map((ext) => ({ + source: `/${ext}`, + destination: "/resume", + permanent: true, + })), ...v2_redirects, ]; }, diff --git a/src/pages/[resume].tsx b/src/pages/[resume].tsx new file mode 100644 index 0000000..45b39d9 --- /dev/null +++ b/src/pages/[resume].tsx @@ -0,0 +1,43 @@ +import directus from "@/utils/directus"; +import { readSingleton } from "@directus/sdk"; +import { + GetStaticPaths, + GetStaticPropsContext, + GetStaticPropsResult, +} from "next"; + +// 'blocking' fallback, but don't provide any paths for pre-rendering; it will fail otherwise for redirect paths. +export const getStaticPaths: GetStaticPaths = async () => { + return { paths: [], fallback: "blocking" }; +}; + +// Handle static props for `[resume]` route. +export async function getStaticProps({ + params, +}: GetStaticPropsContext<{ resume: string }>): Promise< + GetStaticPropsResult +> { + const { resume } = params ?? {}; + if (resume !== "resume") return { notFound: true }; + + try { + console.log("Revalidating resume redirect"); + const metadata = await directus.request(readSingleton("metadata")); + const resumeUrl = `${directus.url}assets/${metadata.resume}/${ + metadata.resumeFilename ?? "resume.pdf" + }`; + + return { + redirect: { destination: resumeUrl, permanent: false }, + revalidate: 3600, + }; + } catch (error) { + console.error("Failed to acquire resume asset URL", error); + throw new Error(`Failed to acquire asset (${error})`); + } +} + +// Empty component as the page redirects or returns `notFound`. +export default function Resume() { + return <>; +} diff --git a/src/pages/api/resume.ts b/src/pages/api/resume.ts deleted file mode 100644 index 1b09c96..0000000 --- a/src/pages/api/resume.ts +++ /dev/null @@ -1,28 +0,0 @@ -import directus from "@/utils/directus"; -import { readSingleton } from "@directus/sdk"; -import type { NextApiRequest, NextApiResponse } from "next"; - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse, -) { - if (req.method !== "GET" && req.method !== "HEAD") - return res.status(405).json({ message: "Method not allowed" }); - - // Get the resume - try { - const metadata = await directus.request(readSingleton("metadata")); - - const resumeUrl = `${directus.url}assets/${metadata.resume}/${ - metadata.resumeFilename ?? "resume.pdf" - }`; - - return res.redirect(301, resumeUrl); - } catch (error) { - console.error({ - message: "Failed to acquire resume URL", - error, - }); - return res.status(500).send({ error: "Failed to acquire resume URL" }); - } -}