import type { APIRoute } from "astro"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; import { and, desc, eq } from "drizzle-orm"; import { z } from "zod"; import { getDatabase, schema } from "@/db"; import { parseBody, success, unauthorized } from "@/lib/api"; import { withErrorHandler } from "@/lib/errors"; import { getUserFromRequest } from "@/lib/auth"; import { createDashboard } from "@/lib/analytics-advanced"; const createDashboardSchema = z.object({ name: z.string().min(1).max(120), description: z.string().max(500).optional(), isPublic: z.boolean().optional(), }); export const GET: APIRoute = withErrorHandler(async ({ request }) => { const user = await getUserFromRequest(request); if (!user) return unauthorized(); const db = getDatabase() as NodePgDatabase; const dashboards = (await db.query.customDashboards?.findMany({ where: eq(schema.customDashboards.userId, user.userId), orderBy: [desc(schema.customDashboards.updatedAt)], })) || []; return success(dashboards); }); export const POST: APIRoute = withErrorHandler(async ({ request }) => { const user = await getUserFromRequest(request); if (!user) return unauthorized(); const parsed = await parseBody(request, createDashboardSchema); if ("error" in parsed) return parsed.error; const dashboard = await createDashboard({ userId: user.userId, name: parsed.data.name, description: parsed.data.description, isPublic: parsed.data.isPublic, }); return success(dashboard); });