48 lines
1.5 KiB
TypeScript
Executable File
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);
|
|
}
|