From 31c37792f6bf7bb56cf50d9973f2376c8816f1fa Mon Sep 17 00:00:00 2001 From: lew Date: Fri, 23 Jan 2026 18:36:01 +0000 Subject: [PATCH] feat: random endpoint --- apps/blog/src/pages/random.ts | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 apps/blog/src/pages/random.ts diff --git a/apps/blog/src/pages/random.ts b/apps/blog/src/pages/random.ts new file mode 100644 index 0000000..d4e05c4 --- /dev/null +++ b/apps/blog/src/pages/random.ts @@ -0,0 +1,36 @@ +import { getCollection } from 'astro:content'; +import yaml from 'js-yaml'; +import bookmarksRaw from '../data/bookmarks.yaml?raw'; +import fs from 'node:fs'; +import path from 'node:path'; +import type { APIContext } from 'astro'; + +export const prerender = false; + +interface Bookmark { + date: string; + title: string; + url: string; +} + +export async function GET(context: APIContext) { + const site = context.site?.origin ?? 'https://wynne.rs'; + const posts = await getCollection('posts'); + const bookmarks = yaml.load(bookmarksRaw) as Bookmark[]; + + const txtDir = path.join(process.cwd(), 'public/txt'); + const txtFiles = fs.existsSync(txtDir) + ? fs.readdirSync(txtDir).filter(file => file.endsWith('.txt')) + : []; + + const urls = [ + ...posts.map(post => `/blog/${post.id}`), + ...txtFiles.map(txt => `/txt/${txt}`), + ...bookmarks.map(b => b.url), + ]; + + const random = urls[Math.floor(Math.random() * urls.length)]; + const redirectUrl = random.startsWith('http') ? random : `${site}${random}`; + + return Response.redirect(redirectUrl, 302); +}