From d8ff20f3b13f13511bea37a4504f58e61a566145 Mon Sep 17 00:00:00 2001 From: Adrian Bonpin Date: Wed, 20 May 2026 02:21:17 +0800 Subject: [PATCH] feat: extend resolveGame() with slug fallback lookup --- app/game/[id]/page.tsx | 12 ++++++++++++ lib/utils/__tests__/slug.test.ts | 28 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 lib/utils/__tests__/slug.test.ts diff --git a/app/game/[id]/page.tsx b/app/game/[id]/page.tsx index 0a20bd5..b7ee56f 100644 --- a/app/game/[id]/page.tsx +++ b/app/game/[id]/page.tsx @@ -32,12 +32,23 @@ async function resolveGame(id: string) { .limit(1) game = rows[0] } else { + // Try UUID first const rows = await db .select() .from(games) .where(eq(games.id, id)) .limit(1) game = rows[0] + + // Fallback: try slug lookup + if (!game) { + const slugRows = await db + .select() + .from(games) + .where(eq(games.slug, id)) + .limit(1) + game = slugRows[0] + } } return game } @@ -245,6 +256,7 @@ export default async function GamePage({ capsuleImage: game.capsuleImage, storeUrl: game.storeUrl, source: game.source, + slug: game.slug, lastSync: game.lastSync ? game.lastSync.toISOString() : null, syncStatus: game.syncStatus, createdAt: game.createdAt.toISOString(), diff --git a/lib/utils/__tests__/slug.test.ts b/lib/utils/__tests__/slug.test.ts new file mode 100644 index 0000000..94453f6 --- /dev/null +++ b/lib/utils/__tests__/slug.test.ts @@ -0,0 +1,28 @@ +import { describe, it, expect } from "vitest" +import { generateSlug } from "@/lib/utils/slug" + +describe("generateSlug", () => { + it("converts a simple title to lowercase hyphenated slug", () => { + expect(generateSlug("The Witcher 3")).toBe("the-witcher-3") + }) + it("replaces special characters with hyphens", () => { + expect(generateSlug("Hades II: The Sequel")).toBe("hades-ii-the-sequel") + }) + it("collapses multiple consecutive hyphens", () => { + expect(generateSlug("Game!!! -- Test")).toBe("game-test") + }) + it("trims leading and trailing hyphens", () => { + expect(generateSlug(" -- My Game -- ")).toBe("my-game") + }) + it("truncates to 80 characters", () => { + const longTitle = "A".repeat(100) + expect(generateSlug(longTitle).length).toBeLessThanOrEqual(80) + }) + it("does not leave trailing hyphen after truncation", () => { + const title = "A".repeat(79) + " -" + expect(generateSlug(title)).not.toMatch(/-$/) + }) + it("handles empty string", () => { + expect(generateSlug("")).toBe("") + }) +}) \ No newline at end of file