50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import type { NextApiRequest, NextApiResponse } from 'next'
|
|
import { prisma } from '@/lib/prisma'
|
|
import { requireAuth, logAction } from '@/lib/auth'
|
|
|
|
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
|
const user = await requireAuth(req, res, ['ADMIN'])
|
|
if (!user) return
|
|
if (req.method !== 'POST') return res.status(405).end()
|
|
|
|
const { id } = req.query as { id: string }
|
|
|
|
const source = await prisma.buildForm.findUnique({
|
|
where: { id },
|
|
include: { fields: { orderBy: { order: 'asc' } } },
|
|
})
|
|
if (!source) return res.status(404).json({ error: 'Form not found' })
|
|
|
|
const clone = await prisma.buildForm.create({
|
|
data: {
|
|
name: `${source.name} (Copy)`,
|
|
product: source.product,
|
|
description: source.description,
|
|
minSubmissions: source.minSubmissions,
|
|
status: 'DRAFT',
|
|
createdById: user.id,
|
|
clonedFromId: source.id,
|
|
clonedFromName: source.name,
|
|
fields: {
|
|
create: source.fields.map(f => ({
|
|
label: f.label,
|
|
type: f.type,
|
|
hint: f.hint,
|
|
options: f.options,
|
|
required: f.required,
|
|
trackStd: f.trackStd,
|
|
order: f.order,
|
|
})),
|
|
},
|
|
},
|
|
include: {
|
|
fields: { orderBy: { order: 'asc' } },
|
|
_count: { select: { submissions: true, fields: true } },
|
|
},
|
|
})
|
|
|
|
await logAction(user.id, 'CREATE', 'BuildForm', clone.id, null, { clonedFrom: source.id, name: clone.name })
|
|
|
|
return res.status(201).json({ data: clone })
|
|
}
|