feat:update form
This commit is contained in:
+26
-32
@@ -1,47 +1,41 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import { requireAdmin } from "@/lib/auth";
|
||||
|
||||
const MAX_UPLOAD_BYTES = 1024 * 1024;
|
||||
import { db } from "@/db";
|
||||
import { cdn } from "@/db/schema";
|
||||
import { requireDiscordId } from "@/lib/auth";
|
||||
import { validateImageUploadFile, cdnUrl } from "@/lib/cdn-images";
|
||||
|
||||
export async function POST(req: Request) {
|
||||
let discordId: string;
|
||||
try {
|
||||
try {
|
||||
await requireAdmin();
|
||||
} catch {
|
||||
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
||||
}
|
||||
discordId = await requireDiscordId();
|
||||
} catch {
|
||||
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
||||
}
|
||||
|
||||
try {
|
||||
const formData = await req.formData();
|
||||
const file = formData.get("file") as File | null;
|
||||
|
||||
if (!file) {
|
||||
const file = formData.get("file");
|
||||
|
||||
if (!(file instanceof File)) {
|
||||
return NextResponse.json({ error: "No file provided" }, { status: 400 });
|
||||
}
|
||||
|
||||
if (!file.type.startsWith("image/")) {
|
||||
return NextResponse.json({ error: "Only image files are allowed" }, { status: 400 });
|
||||
}
|
||||
validateImageUploadFile(file);
|
||||
|
||||
if (file.size > MAX_UPLOAD_BYTES) {
|
||||
return NextResponse.json({ error: "Image must be 1MB or smaller" }, { status: 400 });
|
||||
}
|
||||
const [record] = await db
|
||||
.insert(cdn)
|
||||
.values({
|
||||
data: Buffer.from(await file.arrayBuffer()),
|
||||
name: file.name || null,
|
||||
type: file.type,
|
||||
size: file.size,
|
||||
ownerDiscordId: discordId,
|
||||
})
|
||||
.returning({ id: cdn.id });
|
||||
|
||||
const allowedExtensions = ["png", "jpg", "jpeg", "webp", "gif"];
|
||||
const originalExt = (file.name.split(".").pop() || "").toLowerCase();
|
||||
|
||||
if (!allowedExtensions.includes(originalExt)) {
|
||||
return NextResponse.json({ error: "Invalid image extension" }, { status: 400 });
|
||||
}
|
||||
|
||||
const buffer = Buffer.from(await file.arrayBuffer());
|
||||
const base64 = buffer.toString("base64");
|
||||
const mimeType = file.type;
|
||||
const dataUri = `data:${mimeType};base64,${base64}`;
|
||||
|
||||
return NextResponse.json({ url: dataUri });
|
||||
return NextResponse.json({ id: record.id, url: cdnUrl(record.id) });
|
||||
} catch (error) {
|
||||
console.error("Upload error:", error);
|
||||
const message = error instanceof Error ? error.message : "Internal server error";
|
||||
return NextResponse.json({ error: message }, { status: 500 });
|
||||
return NextResponse.json({ error: message }, { status: 400 });
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user