Files
erika/app/api/upload/route.ts
T

43 lines
1.2 KiB
TypeScript

import { NextResponse } from "next/server";
import { db } from "@/db";
import { cdn } from "@/db/schema";
import { requireDiscordId } from "@/lib/auth/auth";
import { validateImageUploadFile, cdnUrl } from "@/lib/cdn/cdn-images";
export async function POST(req: Request) {
let discordId: string;
try {
discordId = await requireDiscordId();
} catch {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
try {
const formData = await req.formData();
const file = formData.get("file");
if (!(file instanceof File)) {
return NextResponse.json({ error: "No file provided" }, { status: 400 });
}
const data = Buffer.from(await file.arrayBuffer());
validateImageUploadFile(file, data);
const [record] = await db
.insert(cdn)
.values({
data,
name: file.name || null,
type: file.type,
size: file.size,
ownerDiscordId: discordId,
})
.returning({ id: cdn.id });
return NextResponse.json({ id: record.id, url: cdnUrl(record.id) });
} catch (error) {
const message = error instanceof Error ? error.message : "Internal server error";
return NextResponse.json({ error: message }, { status: 400 });
}
}