43 lines
1.2 KiB
TypeScript
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-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 });
|
|
}
|
|
}
|