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" }); - } -}