85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const Joi = require('joi');
 | 
						|
Joi.objectId = require('joi-objectid')(Joi);
 | 
						|
const path = require('path');
 | 
						|
require('dotenv').config({ path: path.resolve(__dirname, '../../.env') });
 | 
						|
 | 
						|
const { LOCALE: lang = 'english' } = process.env;
 | 
						|
 | 
						|
let schema = Joi.object().keys({
 | 
						|
  block: Joi.string(),
 | 
						|
  blockId: Joi.objectId(),
 | 
						|
  challengeOrder: Joi.number(),
 | 
						|
  challengeType: Joi.number()
 | 
						|
    .min(0)
 | 
						|
    .max(9)
 | 
						|
    .required(),
 | 
						|
  checksum: Joi.number(),
 | 
						|
  dashedName: Joi.string(),
 | 
						|
  description: Joi.string().required(),
 | 
						|
  fileName: Joi.string(),
 | 
						|
  files: Joi.array().items(
 | 
						|
    Joi.object().keys({
 | 
						|
      key: Joi.string(),
 | 
						|
      ext: Joi.string(),
 | 
						|
      name: Joi.string(),
 | 
						|
      head: [Joi.array().items(Joi.string().allow('')), Joi.string().allow('')],
 | 
						|
      tail: [Joi.array().items(Joi.string().allow('')), Joi.string().allow('')],
 | 
						|
      contents: [
 | 
						|
        Joi.array().items(Joi.string().allow('')),
 | 
						|
        Joi.string().allow('')
 | 
						|
      ]
 | 
						|
    })
 | 
						|
  ),
 | 
						|
  guideUrl: Joi.string().uri({ scheme: 'https' }),
 | 
						|
  videoUrl: Joi.string().allow(''),
 | 
						|
  helpRoom: Joi.string(),
 | 
						|
  id: Joi.objectId().required(),
 | 
						|
  instructions: Joi.string().required(),
 | 
						|
  isBeta: Joi.bool(),
 | 
						|
  isComingSoon: Joi.bool(),
 | 
						|
  isLocked: Joi.bool(),
 | 
						|
  isPrivate: Joi.bool(),
 | 
						|
  isRequired: Joi.bool(),
 | 
						|
  name: Joi.string(),
 | 
						|
  order: Joi.number(),
 | 
						|
  required: Joi.array().items(
 | 
						|
    Joi.object().keys({
 | 
						|
      link: Joi.string(),
 | 
						|
      raw: Joi.bool(),
 | 
						|
      src: Joi.string(),
 | 
						|
      crossDomain: Joi.bool()
 | 
						|
    })
 | 
						|
  ),
 | 
						|
  solutions: Joi.array().items(Joi.string().optional()),
 | 
						|
  superBlock: Joi.string(),
 | 
						|
  superOrder: Joi.number(),
 | 
						|
  suborder: Joi.number(),
 | 
						|
  tests: Joi.array().items(
 | 
						|
    // public challenges
 | 
						|
    Joi.object().keys({
 | 
						|
      text: Joi.string().required(),
 | 
						|
      testString: Joi.string()
 | 
						|
        .allow('')
 | 
						|
        .required()
 | 
						|
    }),
 | 
						|
    // our tests used in certification verification
 | 
						|
    Joi.object().keys({
 | 
						|
      id: Joi.string().required(),
 | 
						|
      title: Joi.string().required()
 | 
						|
    })
 | 
						|
  ),
 | 
						|
  template: Joi.string().allow(''),
 | 
						|
  time: Joi.string().allow(''),
 | 
						|
  title: Joi.string().required()
 | 
						|
});
 | 
						|
 | 
						|
if (lang !== 'english') {
 | 
						|
  schema = schema.append({
 | 
						|
    localeTitle: Joi.string().required()
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
exports.validateChallenge = function validateChallenge(challenge) {
 | 
						|
  return Joi.validate(challenge, schema);
 | 
						|
};
 |