Source: public/modules/core/services/experiment-validator.client.service.js

/**
 * Created by brennon on 10/13/15.
 */

'use strict';

/**
 * The `ExperimentValidator` service checks the validity of an
 * `ExperimentSchema`.
 *
 * @class Angular.ExperimentValidator
 * @memberof Angular
 */

angular.module('core').factory('ExperimentValidator', [
    '$log',
    function($log) {

        $log.debug('Instantiating ExperimentValidator service.');

        var returnObject = {

            /**
             * Advances the state to the next state as defined in the study
             * specification document (see the [README](index.html)).
             *
             * @function advanceSlide
             * @instance
             * @memberof Angular.ExperimentValidator
             * @return {*}
             */
            validateSchema: function(schema) {

                var constraints = {
                    structure: {
                        presence: true
                    },
                    media: {
                        presence: true
                    }
                };

                // Initial validation
                var isValid = validate(schema, constraints);
                if (isValid !== undefined) {
                    return isValid;
                }

                // Structure must be an array
                isValid = validate.isArray(schema.structure);
                if (isValid === false) {
                    return isValid;
                }

                // Iterate over media array
                for (var i = 0; i < schema.media.length; i++) {
                    var item = schema.media[i];
                    var itemIsValid = this.validateMediaEntry(item);
                    if (itemIsValid !== undefined) {
                        return itemIsValid;
                    }
                }

                // Iterate over

                return undefined;
            },

            validateMediaEntry: function validateMediaEntryFn(entry) {
                var constraints = {
                    artist: {
                        presence: true
                    },
                    title: {
                        presence: true
                    },
                    label: {
                        presence: true
                    }
                };

                var isValid = validate(entry, constraints);
                if (isValid !== undefined) {
                    return isValid;
                }

                isValid = validate.isString(entry.artist);
                if (isValid === false) {
                    return isValid;
                }

                isValid = validate.isString(entry.title);
                if (isValid === false) {
                    return isValid;
                }

                isValid = validate.isString(entry.label);
                if (isValid === false) {
                    return isValid;
                }
            },

            validateStructureEntry: function validateStructureEntryFn(entry) {
                var constraints = {
                    name: {
                        presence: true
                    }
                };

                var isValid = validate(entry, constraints);
                if (isValid !== undefined) {
                    return isValid;
                }

                isValid = validate.isString(entry.name);
                if (isValid === false) {
                    return isValid;
                }
            }
        };

        return returnObject;
    }
]);