Files
pichunt/server/api/admin/hunt/[huntId]/quest/index.post.ts
T

79 lines
2.1 KiB
TypeScript

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 } = await useValidatedParams(
event,
z.object({
huntId: zh.numAsString
})
);
// Verify membership
const hunt = await prisma.hunt.findUnique({
where: {
id: huntId,
members: {
some: {
memberId: userId
}
}
},
select: {
id: true,
_count: {
select: {
quests: true
}
}
}
});
if (!hunt) {
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(''),
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.create({
data: {
...body,
huntId,
order: hunt._count.quests
},
select: {
id: true,
title_de: true,
title_en: true,
order: true
}
});
});