diff --git a/examples/getstarted/api/restaurant/models/Restaurant.settings.json b/examples/getstarted/api/restaurant/models/Restaurant.settings.json index 36a9921500..8c9affb613 100755 --- a/examples/getstarted/api/restaurant/models/Restaurant.settings.json +++ b/examples/getstarted/api/restaurant/models/Restaurant.settings.json @@ -28,8 +28,17 @@ "component": "default.closingperiod", "type": "component" }, - + "contact_email": { + "type": "email" + }, + "stars": { + "required": true, + "type": "integer", + "min": 0, + "max": 3 + }, "address": { + "required": true, "model": "address" }, "cover": { @@ -55,7 +64,8 @@ }, "description": { "type": "richtext", - "required": true + "required": true, + "minLength": 10 }, "services": { "component": "default.restaurantservice", diff --git a/packages/strapi-utils/lib/validators.js b/packages/strapi-utils/lib/validators.js index 1cd03bd313..e192153bfa 100644 --- a/packages/strapi-utils/lib/validators.js +++ b/packages/strapi-utils/lib/validators.js @@ -3,9 +3,11 @@ const yup = require('yup'); const _ = require('lodash'); -yup.addMethod(yup.mixed, 'defined', function(msg = '${path} must be defined') { +function isDefined(msg = '${path} must be defined') { return this.test('defined', msg, value => !_.isNil(value)); -}); +} + +yup.addMethod(yup.mixed, 'defined', isDefined); /** * Returns a formatted error for http responses diff --git a/packages/strapi/lib/services/entity-validator/validators.js b/packages/strapi/lib/services/entity-validator/validators.js index c023a45ae1..c201fa2f84 100644 --- a/packages/strapi/lib/services/entity-validator/validators.js +++ b/packages/strapi/lib/services/entity-validator/validators.js @@ -28,6 +28,57 @@ const stringValidator = composeValidators( addMaxLengthValidator ); +const enumerationValidator = attr => { + return yup + .string() + .nullable() + .oneOf(Array.isArray(attr.enum) ? attr.enum : [attr.enum]); +}; + +const emailValidator = composeValidators(stringValidator, (attr, validator) => + validator.email() +); + +const minIntegerValidator = ({ min }, validator) => + _.isNumber(min) ? validator.min(_.toInteger(min)) : validator; + +const maxIntegerValidator = ({ max }, validator) => + _.isNumber(max) ? validator.max(_.toInteger(max)) : validator; + +const integerValidator = composeValidators( + () => yup.number().integer(), + minIntegerValidator, + maxIntegerValidator +); + +const minFloatValidator = ({ min }, validator) => + _.isNumber(min) ? validator.min(min) : validator; + +const maxFloatValidator = ({ max }, validator) => + _.isNumber(max) ? validator.max(max) : validator; + +const floatValidator = composeValidators( + () => yup.number(), + minFloatValidator, + maxFloatValidator +); + module.exports = { string: stringValidator, + text: stringValidator, + richtext: stringValidator, + password: stringValidator, + email: emailValidator, + enumeration: enumerationValidator, + boolean: () => yup.boolean(), + uid: () => yup.mixed(), + json: () => yup.mixed(), + integer: integerValidator, + biginteger: () => yup.mixed(), + float: floatValidator, + decimal: floatValidator, + date: () => yup.mixed(), + time: () => yup.mixed(), + datetime: () => yup.mixed(), + timestamp: () => yup.mixed(), };