2024-03-05 10:20:36 +00:00

66 lines
2.0 KiB
JavaScript
Executable File

export default (schema = {}, fn) => {
return async (req, res, next) => {
if (typeof req.body === "undefined") {
req.body = {}
}
if (typeof req.query === "undefined") {
req.query = {}
}
if (typeof req.selection !== "object") {
req.selection = {}
}
if (schema.required) {
if (!Array.isArray(schema.required)) {
console.warn("[INVALID SCHEMA] schema.required is defined but is not an array")
return
}
const missingKeys = []
const requiredKeys = Array.isArray(schema.required) ? schema.required : []
for (let key of requiredKeys) {
const value = req.body[key] || req.query[key]
if (!value || typeof value === "undefined") {
missingKeys.push(key)
break
}
req.selection[key] = value
}
if (missingKeys.length > 0) {
return res.status(400).json({
error: `Missing required keys > ${missingKeys}`,
missingKeys: missingKeys
})
}
}
if (schema.select) {
if (!Array.isArray(schema.select)) {
console.warn("[INVALID SCHEMA] schema.select is defined but is not an array")
return
}
// assign objects along request body and query.
for await (let key of schema.select) {
if (req.body && typeof req.body[key] !== "undefined") {
req.selection[key] = req.body[key]
continue
}
if (req.query && typeof req.query[key] !== "undefined") {
req.selection[key] = req.query[key]
continue
}
}
}
if (typeof fn === "function") {
return await fn(req, res, next)
}
}
}