// This is an example of a survey to obtain the reputation of Parisians // It contains examples of how to conditionally require keys based on values of other keys var Joi = require('../'); // This is a valid value for integer rating 1 - 5 var intRating = Joi.number().integer().min(1).max(5); var schema = Joi.object().keys({ // Do you know any French people? yes or no (required) q1: Joi.boolean().required(), // Do you know any Parisians? yes or no (required if answered yes in q1) q2: Joi.boolean() .when('q1', { is: true, then: Joi.required() }), // How many french in paris do you know? 1-6, 6-10, 11-50 or 50+ (required if answered yes in q2) q3: Joi.string() .when('q2', { is: true, then: Joi.valid('1-5', '6-10', '11-50', '50+').required() }), // Rate 20% of most friendly Parisians, from how many people you know answered in q3, individually on 1-5 rating q4: Joi.array() .when('q3', {is: '1-5', then: Joi.array().min(0).max(1).items(intRating).required() }) .when('q3', {is: '6-10', then: Joi.array().min(1).max(2).items(intRating).required() }) .when('q3', {is: '11-50', then: Joi.array().min(2).max(10).items(intRating).required() }) .when('q3', {is: '50+', then: Joi.array().min(10).items(intRating).required() }), // Rate remaining 80% of Parisians, from how many people you know answered in q3, individually on 1-5 rating q5: Joi.array() .when('q3', {is: '1-5', then: Joi.array().min(1).max(4).items(intRating).required() }) .when('q3', {is: '6-10', then: Joi.array().min(4).max(8).items(intRating).required() }) .when('q3', {is: '11-50', then: Joi.array().min(8).max(40).items(intRating).required() }) .when('q3', {is: '50+', then: Joi.array().min(40).items(intRating).required().required() }), // Rate the reputation of Parisians in general, 1-5 rating q6: intRating.required() }); var response = { q1: true, q2: true, q3: '1-5', q4: [5], q5: [1], q6: 2 }; Joi.assert(response, schema);