diff --git a/server/api/v1/admin/import/version/index.post.ts b/server/api/v1/admin/import/version/index.post.ts index 8faf0d1..ab9ad1c 100644 --- a/server/api/v1/admin/import/version/index.post.ts +++ b/server/api/v1/admin/import/version/index.post.ts @@ -1,5 +1,5 @@ import { type } from "arktype"; -import { readDropValidatedBody } from "~/server/arktype"; +import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; import aclManager from "~/server/internal/acls"; import prisma from "~/server/internal/db/database"; import libraryManager from "~/server/internal/library"; @@ -17,7 +17,7 @@ const ImportVersion = type({ onlySetup: "boolean = false", delta: "boolean = false", umuId: "string = ''", -}); +}).configure(throwingArktype); export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["import:version:new"]); @@ -62,7 +62,7 @@ export default defineEventHandler(async (h3) => { if (!delta && !launch) throw createError({ statusCode: 400, - statusMessage: "Startup executable is required for non-update versions", + statusMessage: "Launch executable is required for non-update versions", }); } diff --git a/server/arktype.ts b/server/arktype.ts index b56406e..466851e 100644 --- a/server/arktype.ts +++ b/server/arktype.ts @@ -19,9 +19,20 @@ export async function readDropValidatedBody( event: H3Event, validate: (data: object) => T, ): Promise { - const _body = await readBody(event); + const body = await readBody(event); try { - return validate(_body); + // Delete all values that are 'null' + if (typeof body === "object" && !Array.isArray(body) && body !== null) { + for (const [key, value] of Object.entries(body) as Array< + [string, unknown] + >) { + if (value === null) { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete + delete body[key]; + } + } + } + return validate(body); } catch (e) { const t = await useTranslation(event);