import { NextRequest, NextResponse } from "next/server"; import { archiveTask, createTask, listTasks, updateTask, } from "@/lib/tasks"; import type { TaskSort } from "@/types/task"; export const runtime = "nodejs"; const sortOptions: TaskSort[] = ["createdAt", "topic", "status", "dueDate"]; function parseSort(value: string | null): TaskSort { if (value && sortOptions.includes(value as TaskSort)) { return value as TaskSort; } return "createdAt"; } function errorResponse(error: unknown, status = 400) { return NextResponse.json( { error: error instanceof Error ? error.message : "Something went wrong." }, { status } ); } export function GET(request: NextRequest) { const includeArchived = request.nextUrl.searchParams.get("includeArchived") === "true"; const sort = parseSort(request.nextUrl.searchParams.get("sort")); const tasks = listTasks({ includeArchived, sort }); return NextResponse.json({ tasks }); } export async function POST(request: NextRequest) { try { const body = (await request.json()) as Record; const task = createTask(body); return NextResponse.json({ task }, { status: 201 }); } catch (error) { return errorResponse(error); } } export async function PATCH(request: NextRequest) { try { const body = (await request.json()) as Record; const id = Number(body.id); if (!Number.isInteger(id) || id <= 0) { throw new Error("A valid task id is required."); } const task = body.action === "archive" ? archiveTask(id) : updateTask(id, body); return NextResponse.json({ task }); } catch (error) { return errorResponse(error); } }