import { useValidatedBody, useValidatedParams, z, zh } from 'h3-zod'; import prisma from '~~/lib/prisma'; export default defineEventHandler(async (event) => { const user = await requireUserSession(event); const userId = user.user.id; const { huntId, questId } = await useValidatedParams( event, z.object({ huntId: zh.numAsString, questId: zh.numAsString }) ); // Verify membership const quest = await prisma.huntQuest.findUnique({ where: { id: questId, huntId, hunt: { members: { some: { memberId: userId } } } }, select: { id: true } }); if (!quest) { throw createError({ statusCode: 404, statusMessage: 'Not found!' }); } const body = await useValidatedBody( event, z.object({ title_de: z.string().min(1).max(256).trim(), title_en: z.string().min(1).max(256).trim(), description_de: z.string().max(2000).trim().default(''), description_en: z.string().max(2000).trim().default(''), isBingo: z.boolean().default(false), question_de: z.string().max(1000).trim().nullish(), question_en: z.string().max(1000).trim().nullish(), location: z.string().max(256).trim().nullish(), locationLink: z.string().url().nullish(), optional: z.boolean().default(true), pictureRequired: z.boolean().default(false), textRequired: z.boolean().default(false), textType: z .enum(['TEXT', 'WORD', 'CHAR', 'NUMBER', 'INTEGER']) .default('TEXT'), textUnit: z.string().max(64).trim().nullish(), textSolution: z.string().max(256).trim().nullish(), points: z.number().int().min(0).max(32767).default(10), extraPoints: z.number().int().min(0).max(32767).nullish(), extraText_de: z.string().max(256).trim().nullish(), extraText_en: z.string().max(256).trim().nullish() }) ); return await prisma.huntQuest.update({ where: { id: questId }, data: body, select: { id: true, title_de: true, title_en: true, order: true } }); });