44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
import { features } from "@budibase/backend-core"
|
|
import { Ctx, FeatureFlag } from "@budibase/types"
|
|
|
|
import { AnyZodObject } from "zod"
|
|
import { fromZodError } from "zod-validation-error"
|
|
|
|
function validate(schema: AnyZodObject, property: "body" | "params") {
|
|
// Return a Koa middleware function
|
|
return async (ctx: Ctx, next: any) => {
|
|
if (!(await features.isEnabled(FeatureFlag.USE_ZOD_VALIDATOR))) {
|
|
return next()
|
|
}
|
|
|
|
if (!schema) {
|
|
return next()
|
|
}
|
|
let params = null
|
|
let setClean: ((data: any) => void) | undefined
|
|
if (ctx[property] != null) {
|
|
params = ctx[property]
|
|
setClean = data => (ctx[property] = data)
|
|
} else if (property === "body" && ctx.request[property] != null) {
|
|
params = ctx.request[property]
|
|
setClean = data => (ctx.request[property] = data)
|
|
} else if (property === "params") {
|
|
params = ctx.request.query
|
|
setClean = data => (ctx.request.query = data)
|
|
}
|
|
|
|
const result = schema.safeParse(params)
|
|
if (!result.success) {
|
|
ctx.throw(400, fromZodError(result.error))
|
|
} else {
|
|
setClean?.(result.data)
|
|
}
|
|
|
|
return next()
|
|
}
|
|
}
|
|
|
|
export function validateBody(schema: AnyZodObject) {
|
|
return validate(schema, "body")
|
|
}
|