diff --git a/actions/admin/jobs.ts b/actions/admin/jobs.ts new file mode 100644 index 0000000..9c9ac14 --- /dev/null +++ b/actions/admin/jobs.ts @@ -0,0 +1,41 @@ +'use server' + +import { revalidatePath } from 'next/cache' +import { z } from 'zod' +import { prisma } from '@/lib/prisma' +import { requireAdmin } from '@/lib/auth-guard' + +const cuidSchema = z.string().cuid() + +export async function cancelJobAction(jobId: string) { + await requireAdmin() + + const parsed = cuidSchema.safeParse(jobId) + if (!parsed.success) throw new Error('Ongeldig job-id') + + const job = await prisma.claudeJob.findUnique({ + where: { id: parsed.data }, + select: { status: true }, + }) + + if (!job) throw new Error('Job niet gevonden') + if (job.status === 'DONE' || job.status === 'FAILED' || job.status === 'CANCELLED') { + throw new Error('Job is al in eindstatus') + } + + await prisma.claudeJob.update({ + where: { id: parsed.data }, + data: { status: 'CANCELLED', finished_at: new Date() }, + }) + revalidatePath('/admin/jobs') +} + +export async function deleteJobAction(jobId: string) { + await requireAdmin() + + const parsed = cuidSchema.safeParse(jobId) + if (!parsed.success) throw new Error('Ongeldig job-id') + + await prisma.claudeJob.delete({ where: { id: parsed.data } }) + revalidatePath('/admin/jobs') +}