84 lines
2.6 KiB
JavaScript
84 lines
2.6 KiB
JavaScript
import { BaseCriterion } from './BaseCriterion';
|
|
import { _ } from 'meteor/underscore';
|
|
|
|
export const ModalitySchema = {
|
|
type: 'object',
|
|
properties: {
|
|
method: {
|
|
label: 'Specify if it\'s goinig to "allow" or "deny" the modalities',
|
|
type: 'string',
|
|
enum: ['allow', 'deny']
|
|
},
|
|
measurementTypes: {
|
|
label: 'List of measurement types that will be evaluated',
|
|
type: 'array',
|
|
items: {
|
|
type: 'string'
|
|
},
|
|
minItems: 1,
|
|
uniqueItems: true
|
|
},
|
|
modalities: {
|
|
label: 'List of allowed/denied modalities',
|
|
type: 'array',
|
|
items: {
|
|
type: 'string'
|
|
},
|
|
minItems: 1,
|
|
uniqueItems: true
|
|
}
|
|
},
|
|
required: ['method', 'modalities']
|
|
};
|
|
|
|
/*
|
|
* ModalityCriteria
|
|
* Check if a modality is allowed or denied
|
|
* Options:
|
|
* method (string): Specify if it\'s goinig to "allow" or "deny" the modalities
|
|
* measurementTypes (string[]): List of measurement types that will be evaluated
|
|
* modalities (string[]): List of allowed/denied modalities
|
|
*/
|
|
export class ModalityCriterion extends BaseCriterion {
|
|
|
|
constructor(options) {
|
|
super(options);
|
|
}
|
|
|
|
evaluate(data) {
|
|
const measurementTypes = this.options.measurementTypes || ['targets'];
|
|
const modalitiesSet = new Set(this.options.modalities);
|
|
const validationMethod = this.options.method;
|
|
const measurements = [];
|
|
const invalidModalities = [];
|
|
let message;
|
|
|
|
measurementTypes.forEach(measurementType => {
|
|
const items = data[measurementType];
|
|
|
|
items.forEach(item => {
|
|
const measurement = item.measurement;
|
|
const metadata = item.metadata;
|
|
const modality = metadata.modality.toUpperCase();
|
|
|
|
if (((validationMethod === 'allow') && !modalitiesSet.has(modality)) ||
|
|
((validationMethod === 'deny') && modalitiesSet.has(modality))) {
|
|
measurements.push(measurement);
|
|
invalidModalities.push(modality);
|
|
}
|
|
});
|
|
});
|
|
|
|
if (measurements.length) {
|
|
const uniqueModalities = _.uniq(invalidModalities);
|
|
const uniqueModalitiesText = uniqueModalities.join(', ');
|
|
const modalityText = uniqueModalities.length > 1 ? 'modalities' : 'modality';
|
|
|
|
message = `The ${modalityText} ${uniqueModalitiesText} should not be used as a method of measurement`;
|
|
}
|
|
|
|
return this.generateResponse(message, measurements);
|
|
}
|
|
|
|
}
|