74 lines
3.2 KiB
TypeScript
74 lines
3.2 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
|
|
import { updateTask, validateTaskPayload } from "@/lib/tasks";
|
|
|
|
export async function PATCH(
|
|
request: Request,
|
|
{ params }: { params: Promise<{ id: string }> },
|
|
) {
|
|
const { id } = await params;
|
|
const numericId = Number(id);
|
|
if (!Number.isInteger(numericId) || numericId <= 0) {
|
|
return NextResponse.json({ error: "invalid_task_id" }, { status: 400 });
|
|
}
|
|
|
|
const payload = (await request.json()) as Record<string, unknown>;
|
|
const errors = validateTaskPayload(payload as never, true);
|
|
if (errors.length > 0) {
|
|
return NextResponse.json({ error: "validation_error", details: errors }, { status: 400 });
|
|
}
|
|
|
|
const task = await updateTask(numericId, {
|
|
title: typeof payload.title === "string" ? payload.title : undefined,
|
|
description: typeof payload.description === "string" ? payload.description : undefined,
|
|
assignee: typeof payload.assignee === "string" ? payload.assignee : undefined,
|
|
family:
|
|
payload.family === null || typeof payload.family === "string"
|
|
? (payload.family as never)
|
|
: undefined,
|
|
target_host: typeof payload.target_host === "string" ? payload.target_host : undefined,
|
|
target_channel: typeof payload.target_channel === "string" ? payload.target_channel : undefined,
|
|
dispatch_method: payload.dispatch_method as never,
|
|
dispatch_state: payload.dispatch_state as never,
|
|
template_key: typeof payload.template_key === "string" ? payload.template_key : undefined,
|
|
repo_slug: typeof payload.repo_slug === "string" ? payload.repo_slug : undefined,
|
|
base_branch: typeof payload.base_branch === "string" ? payload.base_branch : undefined,
|
|
preferred_agent:
|
|
typeof payload.preferred_agent === "string" ? payload.preferred_agent : undefined,
|
|
reasoning_effort:
|
|
typeof payload.reasoning_effort === "string" ? payload.reasoning_effort : undefined,
|
|
model_hint: typeof payload.model_hint === "string" ? payload.model_hint : undefined,
|
|
result_summary:
|
|
payload.result_summary === null || typeof payload.result_summary === "string"
|
|
? (payload.result_summary as never)
|
|
: undefined,
|
|
result_detail:
|
|
payload.result_detail === null || typeof payload.result_detail === "string"
|
|
? (payload.result_detail as never)
|
|
: undefined,
|
|
completed_by:
|
|
payload.completed_by === null || typeof payload.completed_by === "string"
|
|
? (payload.completed_by as never)
|
|
: undefined,
|
|
priority: payload.priority as never,
|
|
status: payload.status as never,
|
|
last_dispatch_at:
|
|
typeof payload.last_dispatch_at === "string" ? payload.last_dispatch_at : undefined,
|
|
acknowledged_at:
|
|
payload.acknowledged_at === null || typeof payload.acknowledged_at === "string"
|
|
? (payload.acknowledged_at as never)
|
|
: undefined,
|
|
last_error:
|
|
payload.last_error === null || typeof payload.last_error === "string"
|
|
? (payload.last_error as never)
|
|
: undefined,
|
|
tags: Array.isArray(payload.tags) ? payload.tags.filter((tag) => typeof tag === "string") : undefined,
|
|
});
|
|
|
|
if (!task) {
|
|
return NextResponse.json({ error: "task_not_found" }, { status: 404 });
|
|
}
|
|
|
|
return NextResponse.json(task);
|
|
}
|