From f09f5a2a0600a62e879057a9ec21ea5d99609fb3 Mon Sep 17 00:00:00 2001 From: Janpeter Visser <30029041+madhura68@users.noreply.github.com> Date: Wed, 6 May 2026 06:35:56 +0200 Subject: [PATCH] =?UTF-8?q?feat(ST-9pobw4w6):=20setAllSprintTasksDoneActio?= =?UTF-8?q?n=20=E2=80=94=20alle=20sprint-taken=20atomair=20op=20DONE=20(#1?= =?UTF-8?q?20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Voegt setAllSprintTasksDoneAction toe aan actions/sprints.ts. De actie haalt alle taken op voor een sprint (via sprint_id + product_id), zet ze via een interactieve Prisma-transactie op DONE met updateTaskStatusWithStoryPromotion, en promoot parent-stories automatisch als alle taken DONE zijn. Co-authored-by: Claude Sonnet 4.6 --- actions/sprints.ts | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/actions/sprints.ts b/actions/sprints.ts index bf7dac3..4b6acbf 100644 --- a/actions/sprints.ts +++ b/actions/sprints.ts @@ -12,6 +12,7 @@ import { updateSprintGoalSchema, } from '@/lib/schemas/sprint' import { enforceUserRateLimit } from '@/lib/rate-limit' +import { updateTaskStatusWithStoryPromotion } from '@/lib/tasks-status-update' async function getSession() { return getIronSession(await cookies(), sessionOptions) @@ -272,3 +273,31 @@ export async function completeSprintAction( revalidatePath(`/products/${sprint.product_id}/sprint`) return { success: true } } + +export async function setAllSprintTasksDoneAction( + sprintId: string, +): Promise<{ ok: true } | { ok: false; error: string }> { + const session = await getSession() + if (!session.userId) return { ok: false, error: 'Niet ingelogd' } + if (session.isDemo) return { ok: false, error: 'Niet beschikbaar in demo-modus' } + + const sprint = await prisma.sprint.findFirst({ + where: { id: sprintId, product: productAccessFilter(session.userId) }, + select: { id: true, product_id: true }, + }) + if (!sprint) return { ok: false, error: 'Sprint niet gevonden' } + + const tasks = await prisma.task.findMany({ + where: { sprint_id: sprintId, product_id: sprint.product_id }, + select: { id: true }, + }) + + await prisma.$transaction(async (tx) => { + for (const task of tasks) { + await updateTaskStatusWithStoryPromotion(task.id, 'DONE', tx) + } + }) + + revalidatePath(`/products/${sprint.product_id}/sprint`) + return { ok: true } +}