Files
buzz/app/api/card/[sub]/route.ts
T
dmgnr fdd8a165be
Build and Push Image / build-backend (push) Successful in 28s
Build and Push Image / build-frontend (push) Successful in 2m0s
Build and Push Image / push (push) Successful in 1m3s
fix(api/card): separately check for null
2026-08-30 00:57:36 +07:00

48 lines
1.5 KiB
TypeScript
Executable File

import { eq } from "drizzle-orm";
import { after, type NextRequest } from "next/server";
import { db } from "@/lib/db";
import { cards, characters, submissions } from "@/lib/db/schema";
export async function GET(
_req: NextRequest,
{ params }: RouteContext<"/api/card/[sub]">,
) {
const { sub: subId } = await params;
const [[sub], [image]] = await Promise.all([
db.select().from(submissions).where(eq(submissions.id, subId)),
db.select().from(cards).where(eq(cards.submission, subId)),
]);
if (image?.image) return new Response(new Uint8Array(image.image));
if (!sub) return new Response(`Unknown submission: ${sub}`, { status: 404 });
if (!sub.char)
return new Response(`This submission isn't character-specific.`, {
status: 422,
});
const [char] = await db
.select()
.from(characters)
.where(eq(characters.name, sub.char));
if (!char)
return new Response(`Unknown character: ${sub.char}`, { status: 500 });
const card = await fetch(
`https://api.astrxl.dev/v1/card/genshin/${sub.uid}/${char.amber.split("-")[0]}?lang=th&substat=true&quality=true`,
);
if (!card.ok) return card;
const fresh = await card.arrayBuffer();
after(async () => {
await db
.insert(cards)
.values({
image: Buffer.from(fresh),
submission: subId,
})
.onConflictDoUpdate({
target: cards.submission,
set: {
image: Buffer.from(fresh),
},
});
});
return new Response(fresh);
}