33 lines
1023 B
TypeScript
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 });
|
|
}
|
|
}
|