route.ts
1 import { NextResponse } from 'next/server' 2 import { z } from 'zod' 3 import { safeParseBody } from '@/lib/server/safe-parse-body' 4 import { getAllGoals, createGoal } from '@/lib/server/goals/goal-service' 5 import { formatZodError } from '@/lib/validation/schemas' 6 export const dynamic = 'force-dynamic' 7 8 const GoalCreateSchema = z.object({ 9 title: z.string().min(1, 'Goal title is required'), 10 description: z.string().optional().default(''), 11 level: z.enum(['organization', 'team', 'project', 'agent', 'task']), 12 parentGoalId: z.string().nullable().optional().default(null), 13 projectId: z.string().nullable().optional().default(null), 14 agentId: z.string().nullable().optional().default(null), 15 taskId: z.string().nullable().optional().default(null), 16 objective: z.string().min(1, 'Objective is required'), 17 constraints: z.array(z.string()).optional().default([]), 18 successMetric: z.string().nullable().optional().default(null), 19 budgetUsd: z.number().positive().nullable().optional().default(null), 20 deadlineAt: z.number().nullable().optional().default(null), 21 }) 22 23 export async function GET() { 24 return NextResponse.json(getAllGoals()) 25 } 26 27 export async function POST(req: Request) { 28 const { data: body, error } = await safeParseBody<Record<string, unknown>>(req) 29 if (error) return error 30 const parsed = GoalCreateSchema.safeParse(body) 31 if (!parsed.success) return NextResponse.json(formatZodError(parsed.error), { status: 400 }) 32 return NextResponse.json(createGoal(parsed.data)) 33 }