Files
fristydev/app/api/game/[id]/route.ts
T
fristy bcc5662a44
Build & Push / Lint & Build (push) Successful in 1m19s
Build & Push / Build & Push Image (push) Successful in 31s
Discord presence overhaul: game profiles, Spotify bar, Lanyard WS
- Spotify: drop album line, normalize ";" separators to ",", add open-in-Spotify link and live progress bar
- Games: resolve missing artwork via public Discord RPC app icons with placeholder fallback; add in-site game profile modal (IGDB + Steam + ITAD: artwork, details, reviews, prices)
- Proxy game data through same-origin /api/game and /api/discord-app routes, CORS-locked to https://fristy.net
- Lanyard: SSR REST first paint, then live WebSocket with heartbeat, reconnect backoff and polling fallback
- Localize presence UI (tr/en/de): elapsed times, dates, numbers, currency, review labels, game descriptions
- Sort projects by last update, descending
- Slim dark scrollbars, compact Spotify progress bar
2026-09-10 14:36:14 +03:00

45 lines
1.5 KiB
TypeScript

import { NextResponse } from "next/server";
import { corsHeaders, forbidden, isAllowedOrigin } from "@/lib/api-cors";
import { getGameProfile } from "@/lib/game-profile";
export async function OPTIONS(request: Request) {
if (!isAllowedOrigin(request)) {
return forbidden();
}
return new NextResponse(null, {
status: 204,
headers: {
...corsHeaders(),
"Access-Control-Allow-Methods": "GET, OPTIONS",
"Access-Control-Max-Age": "86400",
},
});
}
export async function GET(request: Request, context: { params: Promise<{ id: string }> }) {
if (!isAllowedOrigin(request)) {
return forbidden();
}
const { id } = await context.params;
if (!/^\d+$/.test(id)) {
return NextResponse.json({ error: "Invalid application id" }, { status: 400 });
}
const { searchParams } = new URL(request.url);
const country = /^[A-Z]{2}$/.test(searchParams.get("country") ?? "")
? (searchParams.get("country") as string)
: "TR";
const lang = ["tr", "en", "de"].includes(searchParams.get("lang") ?? "")
? (searchParams.get("lang") as string)
: "en";
const profile = await getGameProfile(id, country, lang);
if (!profile) {
return NextResponse.json({ error: "Game not found" }, { status: 404 });
}
return NextResponse.json(profile, {
headers: {
"Cache-Control": "public, s-maxage=3600, stale-while-revalidate=86400",
...corsHeaders(),
},
});
}