import { ImageResponse } from "next/og" import { db } from "@/lib/db/index" import { hardware, performanceEntries, gameVersions, games } from "@/lib/db/schema" import { eq, and, sql } from "drizzle-orm" export const runtime = "edge" export const alt = "Device benchmarks on DeckyVault" export const size = { width: 1200, height: 630 } export const contentType = "image/png" export default async function Image({ params, }: { params: Promise<{ slug: string }> }) { const { slug } = await params const [device] = await db .select({ name: hardware.name, deviceType: hardware.deviceType, }) .from(hardware) .where(eq(hardware.slug, slug)) .limit(1) if (!device) { return new ImageResponse( (
DeckyVault
Device Not Found
), { ...size } ) } const [stats] = await db .select({ totalBenchmarks: sql`count(*)::int`, avgFps: sql`round(avg(${performanceEntries.fpsAvg})::numeric, 1)`, gameCount: sql`count(distinct ${gameVersions.gameId})::int`, }) .from(performanceEntries) .innerJoin(gameVersions, eq(performanceEntries.versionId, gameVersions.id)) .innerJoin(games, eq(gameVersions.gameId, games.id)) .where( and( eq(performanceEntries.hardwareSlug, slug), eq(performanceEntries.isRemoved, false) ) ) const typeLabel = device.deviceType === "handheld" ? "Handheld" : "Console" const avgFpsStr = stats?.avgFps ? String(Math.round(Number(stats.avgFps))) : "—" return new ImageResponse( (
{typeLabel}
{device.name}
{stats?.totalBenchmarks ?? 0} Benchmarks
{avgFpsStr} Avg FPS
{stats?.gameCount ?? 0} Games
deckyvault.xyz
), { ...size } ) }