8fb3f2e849
This was supposed to work, but adding integration tests I realized it didn't. #oops
157 lines
3.5 KiB
JavaScript
157 lines
3.5 KiB
JavaScript
import { set, get } from 'lodash';
|
|
import joi from 'joi';
|
|
|
|
// if the custom validation is a joi object we need to concat
|
|
// else, assume it's an plain object and we can just add it in with .keys
|
|
const concatToJoiObject = (joi, candidate) => {
|
|
if (!candidate) return joi;
|
|
else if (candidate.isJoi) return joi.concat(candidate);
|
|
else return joi.keys(candidate);
|
|
};
|
|
|
|
|
|
export const sequelizeOperators = {
|
|
$and: joi.any(),
|
|
$or: joi.any(),
|
|
$gt: joi.any(),
|
|
$gte: joi.any(),
|
|
$lt: joi.any(),
|
|
$lte: joi.any(),
|
|
$ne: joi.any(),
|
|
$eq: joi.any(),
|
|
$not: joi.any(),
|
|
$between: joi.any(),
|
|
$notBetween: joi.any(),
|
|
$in: joi.any(),
|
|
$notIn: joi.any(),
|
|
$like: joi.any(),
|
|
$notLike: joi.any(),
|
|
$iLike: joi.any(),
|
|
$notILike: joi.any(),
|
|
$overlap: joi.any(),
|
|
$contains: joi.any(),
|
|
$contained: joi.any(),
|
|
$any: joi.any(),
|
|
$col: joi.any(),
|
|
};
|
|
|
|
export const whereMethods = [
|
|
'list',
|
|
'get',
|
|
'scope',
|
|
'destroy',
|
|
'destoryScope',
|
|
'destroyAll',
|
|
];
|
|
|
|
export const includeMethods = [
|
|
'list',
|
|
'get',
|
|
'scope',
|
|
'destoryScope',
|
|
];
|
|
|
|
export const payloadMethods = [
|
|
'create',
|
|
'update',
|
|
];
|
|
|
|
export const scopeParamsMethods = [
|
|
'destroyScope',
|
|
'scope',
|
|
];
|
|
|
|
export const idParamsMethods = [
|
|
'get',
|
|
'update',
|
|
];
|
|
|
|
export const restrictMethods = [
|
|
'list',
|
|
'scope',
|
|
];
|
|
|
|
export default ({
|
|
method, attributeValidation, associationValidation, scopes = [], config = {},
|
|
}) => {
|
|
const hasWhere = whereMethods.includes(method);
|
|
const hasInclude = includeMethods.includes(method);
|
|
const hasPayload = payloadMethods.includes(method);
|
|
const hasScopeParams = scopeParamsMethods.includes(method);
|
|
const hasIdParams = idParamsMethods.includes(method);
|
|
const hasRestrictMethods = restrictMethods.includes(method);
|
|
// clone the config so we don't modify it on multiple passes.
|
|
let methodConfig = { ...config, validate: { ...config.validate } };
|
|
|
|
if (hasWhere) {
|
|
const query = concatToJoiObject(joi.object()
|
|
.keys({
|
|
...attributeValidation,
|
|
...sequelizeOperators,
|
|
}),
|
|
get(methodConfig, 'validate.query')
|
|
);
|
|
|
|
methodConfig = set(methodConfig, 'validate.query', query);
|
|
}
|
|
|
|
if (hasInclude) {
|
|
const query = concatToJoiObject(joi.object()
|
|
.keys({
|
|
...associationValidation,
|
|
}),
|
|
get(methodConfig, 'validate.query')
|
|
);
|
|
|
|
methodConfig = set(methodConfig, 'validate.query', query);
|
|
}
|
|
|
|
if (hasPayload) {
|
|
const payload = concatToJoiObject(joi.object()
|
|
.keys({
|
|
...attributeValidation,
|
|
}),
|
|
get(methodConfig, 'validate.payload')
|
|
);
|
|
|
|
methodConfig = set(methodConfig, 'validate.payload', payload);
|
|
}
|
|
|
|
if (hasScopeParams) {
|
|
const params = concatToJoiObject(joi.object()
|
|
.keys({
|
|
scope: joi.string().valid(...scopes),
|
|
}),
|
|
get(methodConfig, 'validate.params')
|
|
);
|
|
|
|
methodConfig = set(methodConfig, 'validate.params', params);
|
|
}
|
|
|
|
if (hasIdParams) {
|
|
const params = concatToJoiObject(joi.object()
|
|
.keys({
|
|
id: joi.any(),
|
|
}),
|
|
get(methodConfig, 'validate.params')
|
|
);
|
|
|
|
methodConfig = set(methodConfig, 'validate.params', params);
|
|
}
|
|
|
|
if (hasRestrictMethods) {
|
|
const query = concatToJoiObject(joi.object()
|
|
.keys({
|
|
limit: joi.number().min(0).integer(),
|
|
offset: joi.number().min(0).integer(),
|
|
order: [joi.array(), joi.string()],
|
|
}),
|
|
get(methodConfig, 'validate.query')
|
|
);
|
|
|
|
methodConfig = set(methodConfig, 'validate.query', query);
|
|
}
|
|
|
|
return methodConfig;
|
|
};
|