● Zion Boggan
repos/Stepping App/apps/web/src/app/api/uploads/route.ts
zionboggan.com ↗
36 lines · typescript
History for this file →
1
import { getCurrentUser, isAdmin } from "@/lib/auth";
2
import { saveUpload, type UploadKind } from "@/lib/uploads";
3
 
4
export const dynamic = "force-dynamic";
5
 
6
export async function POST(request: Request) {
7
  const user = await getCurrentUser();
8
  if (!user) {
9
    return Response.json({ error: "Sign in to upload." }, { status: 401 });
10
  }
11
 
12
  let form: FormData;
13
  try {
14
    form = await request.formData();
15
  } catch {
16
    return Response.json({ error: "Expected multipart form data." }, { status: 400 });
17
  }
18
 
19
  const file = form.get("file");
20
  if (!(file instanceof File)) {
21
    return Response.json({ error: "No file provided." }, { status: 400 });
22
  }
23
 
24
  const kind: UploadKind = form.get("kind") === "pdf" ? "pdf" : "image";
25
  if (kind === "pdf" && !isAdmin(user)) {
26
    return Response.json({ error: "Admins only." }, { status: 403 });
27
  }
28
 
29
  try {
30
    const url = await saveUpload(file, kind);
31
    return Response.json({ url });
32
  } catch (err) {
33
    const message = err instanceof Error ? err.message : "Upload failed.";
34
    return Response.json({ error: message }, { status: 400 });
35
  }
36
}