/ src / app / api / goals / route.ts
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  }