From 777d5216f1fb32f6a1b0b679a06c0964f55d6fa8 Mon Sep 17 00:00:00 2001 From: Bruno Alves de Faria Date: Fri, 13 Jan 2017 18:32:28 -0200 Subject: [PATCH] LT-92: Adding schema validation to evaluation JSONs --- .../client/conformance/CriteriaEvaluator.js | 43 +++++++++++++------ .../client/conformance/criteria/MaxTargets.js | 5 +-- .../criteria/MaxTargetsPerOrgan.js | 5 +-- .../criteria/MeasurementsLength.js | 5 +-- .../client/conformance/criteria/Modality.js | 5 +-- .../conformance/criteria/NonTargetResponse.js | 5 +-- .../client/conformance/criteria/TargetType.js | 5 +-- 7 files changed, 42 insertions(+), 31 deletions(-) diff --git a/Packages/ohif-measurements/client/conformance/CriteriaEvaluator.js b/Packages/ohif-measurements/client/conformance/CriteriaEvaluator.js index 1cba204c1..24e6f5085 100644 --- a/Packages/ohif-measurements/client/conformance/CriteriaEvaluator.js +++ b/Packages/ohif-measurements/client/conformance/CriteriaEvaluator.js @@ -1,27 +1,44 @@ +import { BaseCriterion } from './criteria/BaseCriterion'; import * as Criteria from './criteria'; import { _ } from 'meteor/underscore'; +import Ajv from 'ajv'; export class CriteriaEvaluator { constructor(criteriaObject) { this.criteria = []; + const schema = { + properties: {}, + definitions: { + simpleArray: { type: 'array' } + } + }; + _.each(Criteria, (Criterion, key) => { + if (Criterion.prototype instanceof BaseCriterion) { + const criterionkey = key.replace(/Criterion$/, ''); + schema.definitions[criterionkey] = Criteria[`${criterionkey}Schema`]; + schema.properties[criterionkey] = { + oneOf: [ + { $ref: '#/definitions/simpleArray' }, + { $ref: `#/definitions/${criterionkey}` } + ] + }; + } + }); + const validator = new Ajv().compile(schema); + if (!validator(criteriaObject)) { + let message = ''; + _.each(validator.errors, error => { + message += `\noptions${error.dataPath} ${error.message}`; + }); + throw new Error(message); + } + _.each(criteriaObject, (optionsObject, criterionkey) => { const Criterion = Criteria[`${criterionkey}Criterion`]; const optionsArray = optionsObject instanceof Array ? optionsObject : [optionsObject]; - _.each(optionsArray, options => { - const validator = Criteria[`${criterionkey}Validator`]; - if (!validator(options)) { - let message = `Invalid ${criterionkey}Criterion definition.`; - _.each(validator.errors, error => { - message += `\noptions${error.dataPath} ${error.message}`; - }); - throw new Error(message); - } - - const criterion = new Criterion(options); - this.criteria.push(criterion); - }); + _.each(optionsArray, options => this.criteria.push(new Criterion(options))); }); } diff --git a/Packages/ohif-measurements/client/conformance/criteria/MaxTargets.js b/Packages/ohif-measurements/client/conformance/criteria/MaxTargets.js index 885e87d44..42617f297 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/MaxTargets.js +++ b/Packages/ohif-measurements/client/conformance/criteria/MaxTargets.js @@ -1,8 +1,7 @@ import { BaseCriterion } from './BaseCriterion'; import { _ } from 'meteor/underscore'; -import Ajv from 'ajv'; -export const MaxTargetsValidator = new Ajv().compile({ +export const MaxTargetsSchema = { properties: { limit: { label: 'Max targets allowed in study', @@ -11,7 +10,7 @@ export const MaxTargetsValidator = new Ajv().compile({ } }, required: ['limit'] -}); +}; /* MaxTargetsCriterion * Check if the number of target measurements exceeded the limit allowed diff --git a/Packages/ohif-measurements/client/conformance/criteria/MaxTargetsPerOrgan.js b/Packages/ohif-measurements/client/conformance/criteria/MaxTargetsPerOrgan.js index da66955b4..b05e82078 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/MaxTargetsPerOrgan.js +++ b/Packages/ohif-measurements/client/conformance/criteria/MaxTargetsPerOrgan.js @@ -1,7 +1,6 @@ import { BaseCriterion } from './BaseCriterion'; -import Ajv from 'ajv'; -export const MaxTargetsPerOrganValidator = new Ajv().compile({ +export const MaxTargetsPerOrganSchema = { properties: { limit: { label: 'Max targets allowed per organ', @@ -10,7 +9,7 @@ export const MaxTargetsPerOrganValidator = new Ajv().compile({ } }, required: ['limit'] -}); +}; /* * MaxTargetsPerOrganCriterion diff --git a/Packages/ohif-measurements/client/conformance/criteria/MeasurementsLength.js b/Packages/ohif-measurements/client/conformance/criteria/MeasurementsLength.js index 7c94ca816..5ef7af86f 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/MeasurementsLength.js +++ b/Packages/ohif-measurements/client/conformance/criteria/MeasurementsLength.js @@ -1,7 +1,6 @@ import { BaseCriterion } from './BaseCriterion'; -import Ajv from 'ajv'; -export const MeasurementsLengthValidator = new Ajv().compile({ +export const MeasurementsLengthSchema = { properties: { longAxis: { label: 'Minimum length of long axis', @@ -70,7 +69,7 @@ export const MeasurementsLengthValidator = new Ajv().compile({ { required: ['message', 'longAxisSliceThicknessMultiplier'] }, { required: ['message', 'shortAxisSliceThicknessMultiplier'] } ] -}); +}; /* * MeasurementsLengthCriterion diff --git a/Packages/ohif-measurements/client/conformance/criteria/Modality.js b/Packages/ohif-measurements/client/conformance/criteria/Modality.js index 53d692325..960c8cca3 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/Modality.js +++ b/Packages/ohif-measurements/client/conformance/criteria/Modality.js @@ -1,8 +1,7 @@ import { BaseCriterion } from './BaseCriterion'; import { _ } from 'meteor/underscore'; -import Ajv from 'ajv'; -export const ModalityValidator = new Ajv().compile({ +export const ModalitySchema = { properties: { method: { label: 'Specify if it\'s goinig to "allow" or "deny" the modalities', @@ -29,7 +28,7 @@ export const ModalityValidator = new Ajv().compile({ } }, required: ['method', 'modalities'] -}); +}; /* * ModalityCriteria diff --git a/Packages/ohif-measurements/client/conformance/criteria/NonTargetResponse.js b/Packages/ohif-measurements/client/conformance/criteria/NonTargetResponse.js index bc716f707..29378de90 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/NonTargetResponse.js +++ b/Packages/ohif-measurements/client/conformance/criteria/NonTargetResponse.js @@ -1,8 +1,7 @@ import { BaseCriterion } from './BaseCriterion'; -import Ajv from 'ajv'; -export const NonTargetResponseValidator = new Ajv().compile({ -}); +export const NonTargetResponseSchema = { +}; /* NonTargetResponseCriterion * Check if the there are non-target measurements with response different than "present" on baseline diff --git a/Packages/ohif-measurements/client/conformance/criteria/TargetType.js b/Packages/ohif-measurements/client/conformance/criteria/TargetType.js index fbcbe0362..40f227572 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/TargetType.js +++ b/Packages/ohif-measurements/client/conformance/criteria/TargetType.js @@ -1,8 +1,7 @@ import { BaseCriterion } from './BaseCriterion'; -import Ajv from 'ajv'; -export const TargetTypeValidator = new Ajv().compile({ -}); +export const TargetTypeSchema = { +}; /* TargetTypeCriterion * Check if the there are non-bidirectional target measurements on baseline