makearmy-app/app/api/rigs/route.ts

120 lines
4 KiB
TypeScript
Raw Normal View History

2025-09-29 20:46:41 -04:00
// app/api/rigs/route.ts
2025-09-29 15:34:49 -04:00
import { NextResponse } from "next/server";
import { dxGET, dxPOST, dxDELETE } from "@/lib/directus";
import { requireBearer } from "@/app/api/_lib/auth";
export const runtime = "nodejs";
function bad(msg: string, code = 400) {
return NextResponse.json({ error: msg }, { status: code });
}
export async function GET(req: Request) {
try {
const bearer = requireBearer(req);
const me = await dxGET<{ id: string }>("/users/me?fields=id", bearer);
2025-09-29 20:38:44 -04:00
2025-09-29 15:34:49 -04:00
const q = new URL(req.url).searchParams;
const limit = Math.min(parseInt(q.get("limit") || "50", 10), 100);
2025-09-29 20:38:44 -04:00
2025-09-29 15:34:49 -04:00
const fields = [
"id",
"name",
"notes",
"rig_type.id",
"rig_type.name",
"laser_source.submission_id",
"laser_source.make",
"laser_source.model",
"laser_scan_lens.id",
"laser_scan_lens.field_size",
"laser_scan_lens.focal_length",
"laser_focus_lens.id",
"laser_focus_lens.name",
"laser_software.id",
"laser_software.name",
"date_created",
"date_updated",
].join(",");
2025-09-29 20:56:46 -04:00
// ✅ filter on the relation's id
2025-09-29 15:34:49 -04:00
const path =
2025-09-29 20:56:46 -04:00
`/items/user_rigs?filter[owner][id][_eq]=${encodeURIComponent(me.id)}` +
2025-09-29 20:38:44 -04:00
`&fields=${encodeURIComponent(fields)}` +
`&sort=-date_updated` +
`&limit=${limit}`;
2025-09-29 20:56:46 -04:00
const rows = await dxGET<any[]>(path, bearer); // dxGET returns unwrapped `data`
2025-09-29 20:38:44 -04:00
return NextResponse.json(rows ?? []);
2025-09-29 15:34:49 -04:00
} catch (e: any) {
return bad(e?.message || "Failed to load rigs", e?.status || 500);
}
}
export async function POST(req: Request) {
try {
const bearer = requireBearer(req);
const body = await req.json().catch(() => ({}));
const name = (body?.name || "").trim();
2025-09-29 20:46:41 -04:00
const rig_type = body?.rig_type; // id
2025-09-29 20:38:44 -04:00
const laser_source = body?.laser_source; // submission_id
2025-09-29 15:34:49 -04:00
const laser_scan_lens = body?.laser_scan_lens || null;
const laser_focus_lens = body?.laser_focus_lens || null;
const laser_software = body?.laser_software || null;
const notes = (body?.notes || "").trim();
if (!name) return bad("Missing: name");
if (!rig_type) return bad("Missing: rig_type");
if (!laser_source) return bad("Missing: laser_source");
2025-09-29 20:46:41 -04:00
// set owner from the authenticated user
2025-09-29 15:34:49 -04:00
const me = await dxGET<{ id: string }>("/users/me?fields=id", bearer);
const payload: any = {
owner: me.id,
name,
rig_type,
laser_source,
laser_scan_lens,
laser_focus_lens,
laser_software,
notes,
};
const res = await dxPOST<{ data: { id: string } }>(
"/items/user_rigs",
bearer,
payload
);
return NextResponse.json({ ok: true, id: String(res?.data?.id) });
} catch (e: any) {
return bad(e?.message || "Failed to create rig", e?.status || 500);
}
}
export async function DELETE(req: Request) {
try {
const bearer = requireBearer(req);
const url = new URL(req.url);
const id = url.searchParams.get("id");
if (!id) return bad("Missing: id");
2025-09-29 20:56:46 -04:00
// ✅ fetch owner.id for a precise comparison
2025-09-29 15:34:49 -04:00
const me = await dxGET<{ id: string }>("/users/me?fields=id", bearer);
2025-09-29 20:56:46 -04:00
const rig = await dxGET<{ id: string; owner?: { id?: string } }>(
`/items/user_rigs/${encodeURIComponent(id)}?fields=id,owner.id`,
bearer
2025-09-29 15:34:49 -04:00
);
2025-09-29 20:56:46 -04:00
if (!rig || String(rig.owner?.id) !== String(me.id)) {
2025-09-29 15:34:49 -04:00
return bad("Not your rig", 403);
}
await dxDELETE(`/items/user_rigs/${encodeURIComponent(id)}`, bearer);
return NextResponse.json({ ok: true });
} catch (e: any) {
return bad(e?.message || "Failed to delete rig", e?.status || 500);
}
}