forked from tsai/budibase
11 changed files with 205 additions and 197 deletions
@ -0,0 +1,168 @@ |
|||
const joiValidator = require("../../../middleware/joi-validator") |
|||
const { DataSourceOperation } = require("../../../constants") |
|||
const { WebhookType } = require("../../../constants") |
|||
const { |
|||
BUILTIN_PERMISSION_IDS, |
|||
PermissionLevels, |
|||
} = require("@budibase/backend-core/permissions") |
|||
|
|||
const Joi = require("joi") |
|||
|
|||
exports.tableValidator = () => { |
|||
// prettier-ignore
|
|||
return joiValidator.body(Joi.object({ |
|||
_id: Joi.string(), |
|||
_rev: Joi.string(), |
|||
type: Joi.string().valid("table", "internal", "external"), |
|||
primaryDisplay: Joi.string(), |
|||
schema: Joi.object().required(), |
|||
name: Joi.string().required(), |
|||
views: Joi.object(), |
|||
dataImport: Joi.object(), |
|||
}).unknown(true)) |
|||
} |
|||
|
|||
exports.nameValidator = () => { |
|||
// prettier-ignore
|
|||
return joiValidator.body(Joi.object({ |
|||
name: Joi.string(), |
|||
})) |
|||
} |
|||
|
|||
exports.datasourceValidator = () => { |
|||
// prettier-ignore
|
|||
return joiValidator.body(Joi.object({ |
|||
_id: Joi.string(), |
|||
_rev: Joi.string(), |
|||
// source: Joi.string().valid("POSTGRES_PLUS"),
|
|||
type: Joi.string().allow("datasource_plus"), |
|||
relationships: Joi.array().items(Joi.object({ |
|||
from: Joi.string().required(), |
|||
to: Joi.string().required(), |
|||
cardinality: Joi.valid("1:N", "1:1", "N:N").required() |
|||
})), |
|||
// entities: Joi.array().items(Joi.object({
|
|||
// type: Joi.string().valid(...Object.values(FieldTypes)).required(),
|
|||
// name: Joi.string().required(),
|
|||
// })),
|
|||
}).unknown(true)) |
|||
} |
|||
|
|||
exports.datasourceQueryValidator = () => { |
|||
// prettier-ignore
|
|||
return joiValidator.body(Joi.object({ |
|||
endpoint: Joi.object({ |
|||
datasourceId: Joi.string().required(), |
|||
operation: Joi.string().required().valid(...Object.values(DataSourceOperation)), |
|||
entityId: Joi.string().required(), |
|||
}).required(), |
|||
resource: Joi.object({ |
|||
fields: Joi.array().items(Joi.string()).optional(), |
|||
}).optional(), |
|||
body: Joi.object().optional(), |
|||
sort: Joi.object().optional(), |
|||
filters: Joi.object({ |
|||
string: Joi.object().optional(), |
|||
range: Joi.object().optional(), |
|||
equal: Joi.object().optional(), |
|||
notEqual: Joi.object().optional(), |
|||
empty: Joi.object().optional(), |
|||
notEmpty: Joi.object().optional(), |
|||
}).optional(), |
|||
paginate: Joi.object({ |
|||
page: Joi.string().alphanum().optional(), |
|||
limit: Joi.number().optional(), |
|||
}).optional(), |
|||
})) |
|||
} |
|||
|
|||
exports.webhookValidator = () => { |
|||
// prettier-ignore
|
|||
return joiValidator.body(Joi.object({ |
|||
live: Joi.bool(), |
|||
_id: Joi.string().optional(), |
|||
_rev: Joi.string().optional(), |
|||
name: Joi.string().required(), |
|||
bodySchema: Joi.object().optional(), |
|||
action: Joi.object({ |
|||
type: Joi.string().required().valid(WebhookType.AUTOMATION), |
|||
target: Joi.string().required(), |
|||
}).required(), |
|||
}).unknown(true)) |
|||
} |
|||
|
|||
exports.roleValidator = () => { |
|||
const permLevelArray = Object.values(PermissionLevels) |
|||
// prettier-ignore
|
|||
return joiValidator.body(Joi.object({ |
|||
_id: Joi.string().optional(), |
|||
_rev: Joi.string().optional(), |
|||
name: Joi.string().required(), |
|||
// this is the base permission ID (for now a built in)
|
|||
permissionId: Joi.string().valid(...Object.values(BUILTIN_PERMISSION_IDS)).required(), |
|||
permissions: Joi.object() |
|||
.pattern(/.*/, [Joi.string().valid(...permLevelArray)]) |
|||
.optional(), |
|||
inherits: Joi.string().optional(), |
|||
}).unknown(true)) |
|||
} |
|||
|
|||
exports.permissionValidator = () => { |
|||
const permLevelArray = Object.values(PermissionLevels) |
|||
// prettier-ignore
|
|||
return joiValidator.params(Joi.object({ |
|||
level: Joi.string().valid(...permLevelArray).required(), |
|||
resourceId: Joi.string(), |
|||
roleId: Joi.string(), |
|||
}).unknown(true)) |
|||
} |
|||
|
|||
exports.screenValidator = () => { |
|||
// prettier-ignore
|
|||
return joiValidator.body(Joi.object({ |
|||
name: Joi.string().required(), |
|||
routing: Joi.object({ |
|||
route: Joi.string().required(), |
|||
roleId: Joi.string().required().allow(""), |
|||
}).required().unknown(true), |
|||
props: Joi.object({ |
|||
_id: Joi.string().required(), |
|||
_component: Joi.string().required(), |
|||
_children: Joi.array().required(), |
|||
_instanceName: Joi.string().required(), |
|||
_styles: Joi.object().required(), |
|||
type: Joi.string().optional(), |
|||
table: Joi.string().optional(), |
|||
layoutId: Joi.string().optional(), |
|||
}).required().unknown(true), |
|||
}).unknown(true)) |
|||
} |
|||
|
|||
function generateStepSchema(allowStepTypes) { |
|||
// prettier-ignore
|
|||
return Joi.object({ |
|||
stepId: Joi.string().required(), |
|||
id: Joi.string().required(), |
|||
description: Joi.string().required(), |
|||
name: Joi.string().required(), |
|||
tagline: Joi.string().required(), |
|||
icon: Joi.string().required(), |
|||
params: Joi.object(), |
|||
args: Joi.object(), |
|||
type: Joi.string().required().valid(...allowStepTypes), |
|||
}).unknown(true) |
|||
} |
|||
|
|||
exports.automationValidator = (existing = false) => { |
|||
// prettier-ignore
|
|||
return joiValidator.body(Joi.object({ |
|||
_id: existing ? Joi.string().required() : Joi.string(), |
|||
_rev: existing ? Joi.string().required() : Joi.string(), |
|||
name: Joi.string().required(), |
|||
type: Joi.string().valid("automation").required(), |
|||
definition: Joi.object({ |
|||
steps: Joi.array().required().items(generateStepSchema(["ACTION", "LOGIC"])), |
|||
trigger: generateStepSchema(["TRIGGER"]).allow(null), |
|||
}).required().unknown(true), |
|||
}).unknown(true)) |
|||
} |
|||
Loading…
Reference in new issue