Files
buzz-sheet/app/api/admin/media/presign/route.ts
T

33 lines
1023 B
TypeScript

import { requireAdmin } from "@/lib/auth/server";
import { createPendingMedia } from "@/lib/media/repository";
import { mediaUploadSchema } from "@/lib/media/validation";
export async function POST(request: Request) {
const admin = await requireAdmin();
let input: unknown;
try {
input = await request.json();
} catch {
return Response.json({ error: "invalid-json" }, { status: 400 });
}
const parsed = mediaUploadSchema.safeParse(input);
if (!parsed.success) {
return Response.json(
{ error: "invalid-media", issues: parsed.error.issues.map((issue) => issue.message) },
{ status: 400 },
);
}
try {
const upload = await createPendingMedia(parsed.data, admin.user.id);
return Response.json({
mediaId: upload.id,
uploadUrl: upload.uploadUrl,
method: "PUT",
headers: { "Content-Type": parsed.data.mimeType },
expiresIn: upload.expiresIn,
});
} catch {
return Response.json({ error: "storage-unavailable" }, { status: 503 });
}
}