58 lines
1.4 KiB
TypeScript
58 lines
1.4 KiB
TypeScript
import { and, eq } from "drizzle-orm";
|
|
import { z } from "zod";
|
|
import { db } from "@/lib/db";
|
|
import { canvasProject } from "@/lib/db/schema";
|
|
import {
|
|
openApiErrorResponse,
|
|
requireOpenApiPrincipal,
|
|
} from "@/lib/access-keys/openapi-auth";
|
|
|
|
const canvasIdSchema = z.string().uuid();
|
|
|
|
export async function GET(
|
|
request: Request,
|
|
{ params }: { params: Promise<{ id: string }> }
|
|
) {
|
|
try {
|
|
const principal = await requireOpenApiPrincipal(request, "canvas:read");
|
|
const { id: rawId } = await params;
|
|
const parsedId = canvasIdSchema.safeParse(rawId);
|
|
if (!parsedId.success) {
|
|
return Response.json(
|
|
{
|
|
success: false,
|
|
error: "Invalid canvas ID",
|
|
code: "INVALID_CANVAS_ID",
|
|
},
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
const id = parsedId.data;
|
|
const [project] = await db
|
|
.select()
|
|
.from(canvasProject)
|
|
.where(
|
|
and(
|
|
eq(canvasProject.id, id),
|
|
eq(canvasProject.userId, principal.userId)
|
|
)
|
|
)
|
|
.limit(1);
|
|
|
|
if (!project) {
|
|
return Response.json(
|
|
{ success: false, error: "Canvas not found", code: "CANVAS_NOT_FOUND" },
|
|
{ status: 404 }
|
|
);
|
|
}
|
|
|
|
return Response.json(
|
|
{ success: true, data: project },
|
|
{ headers: { "Cache-Control": "no-store" } }
|
|
);
|
|
} catch (error) {
|
|
return openApiErrorResponse(error);
|
|
}
|
|
}
|