feat(ST-1112): wire story-promotion into saveTask and PATCH /api/tasks/:id

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Janpeter Visser 2026-04-30 00:22:58 +02:00
parent 8b779ccc0b
commit eb27079ba7
5 changed files with 188 additions and 28 deletions

View file

@ -2,6 +2,7 @@ import { authenticateApiRequest } from '@/lib/api-auth'
import { prisma } from '@/lib/prisma'
import { z } from 'zod'
import { TASK_STATUS_API_VALUES, taskStatusFromApi, taskStatusToApi } from '@/lib/task-status'
import { updateTaskStatusWithStoryPromotion } from '@/lib/tasks-status-update'
// `review` is a valid TaskStatus in the DB and the kanban-board UI, but the
// sprint task list (components/sprint/task-list.tsx) does not yet render it.
@ -82,14 +83,28 @@ export async function PATCH(
}
}
const updated = await prisma.task.update({
where: { id },
data: {
...(dbStatus !== undefined && dbStatus !== null && { status: dbStatus }),
...(parsed.data.implementation_plan !== undefined && {
implementation_plan: parsed.data.implementation_plan,
}),
},
const updated = await prisma.$transaction(async (tx) => {
const planUpdate = parsed.data.implementation_plan !== undefined
? await tx.task.update({
where: { id },
data: { implementation_plan: parsed.data.implementation_plan },
select: { id: true, status: true, implementation_plan: true },
})
: null
if (dbStatus !== undefined && dbStatus !== null) {
const result = await updateTaskStatusWithStoryPromotion(id, dbStatus, tx)
return {
id: result.task.id,
status: result.task.status,
implementation_plan: result.task.implementation_plan,
}
}
if (planUpdate) return planUpdate
// Should not reach here — patchSchema rejects bodies without status or implementation_plan.
throw new Error('Geen wijzigingen')
})
return Response.json({