allow null values for filters
This commit is contained in:
parent
a75d2a3424
commit
fd5c0d2c74
@ -227,9 +227,12 @@ router.get('/samples', async (req, res, next) => {
|
|||||||
queryPtr.push({$lookup: {
|
queryPtr.push({$lookup: {
|
||||||
from: 'measurements', let: {sId: '$_id'},
|
from: 'measurements', let: {sId: '$_id'},
|
||||||
pipeline: [{$match: {$expr: {$and: [
|
pipeline: [{$match: {$expr: {$and: [
|
||||||
{$eq: ['$sample_id', '$$sId']},
|
{$eq: ['$sample_id', '$$sId']},
|
||||||
{$in: ['$measurement_template', measurementTemplates.map(e => mongoose.Types.ObjectId(e._id))]}
|
{$in: ['$measurement_template', measurementTemplates.map(e => mongoose.Types.ObjectId(e._id))]}
|
||||||
]}}}],
|
]}}},
|
||||||
|
{$project: filters.fields.filter(e => /measurements\./.test(e))
|
||||||
|
.map(e => 'values.' + e.replace('measurements.', '')).reduce((s, e) => {s[e] = true; return s; }, {})}
|
||||||
|
],
|
||||||
as: 'measurements'
|
as: 'measurements'
|
||||||
}});
|
}});
|
||||||
const groupedMeasurementTemplates = measurementTemplates.reduce((s, e) => {
|
const groupedMeasurementTemplates = measurementTemplates.reduce((s, e) => {
|
||||||
@ -322,9 +325,12 @@ router.get('/samples', async (req, res, next) => {
|
|||||||
queryPtr.push({$lookup: {
|
queryPtr.push({$lookup: {
|
||||||
from: 'measurements', let: {sId: '$_id'},
|
from: 'measurements', let: {sId: '$_id'},
|
||||||
pipeline: [{$match: {$expr: {$and: [
|
pipeline: [{$match: {$expr: {$and: [
|
||||||
{$eq: ['$sample_id', '$$sId']},
|
{$eq: ['$sample_id', '$$sId']},
|
||||||
{$in: ['$measurement_template', measurementTemplates.map(e => mongoose.Types.ObjectId(e._id))]}
|
{$in: ['$measurement_template', measurementTemplates.map(e => mongoose.Types.ObjectId(e._id))]}
|
||||||
]}}}],
|
]}}},
|
||||||
|
{$project: filters.fields.filter(e => /measurements\./.test(e))
|
||||||
|
.map(e => 'values.' + e.replace('measurements.', '')).reduce((s, e) => {s[e] = true; return s; }, {})}
|
||||||
|
],
|
||||||
as: 'measurements'
|
as: 'measurements'
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
|
@ -195,6 +195,9 @@ export default class SampleValidate {
|
|||||||
// data.filters[i] = JSON.parse(decodeURIComponent(data.filters[i]));
|
// data.filters[i] = JSON.parse(decodeURIComponent(data.filters[i]));
|
||||||
data.filters[i] = JSON.parse(data.filters[i]);
|
data.filters[i] = JSON.parse(data.filters[i]);
|
||||||
data.filters[i].values = data.filters[i].values.map(e => { // validate filter values
|
data.filters[i].values = data.filters[i].values.map(e => { // validate filter values
|
||||||
|
if (e === null) { // null values are always allowed
|
||||||
|
return null;
|
||||||
|
}
|
||||||
let validator;
|
let validator;
|
||||||
let field = data.filters[i].field
|
let field = data.filters[i].field
|
||||||
if (/material\./.test(field)) { // select right validation model
|
if (/material\./.test(field)) { // select right validation model
|
||||||
@ -253,7 +256,7 @@ export default class SampleValidate {
|
|||||||
new RegExp('^(' + this.fieldKeys.join('|').replace(/\./g, '\\.').replace(/\*/g, '.+') + ')$', 'm')
|
new RegExp('^(' + this.fieldKeys.join('|').replace(/\./g, '\\.').replace(/\*/g, '.+') + ')$', 'm')
|
||||||
).messages({'string.pattern.base': 'Invalid filter field name'}),
|
).messages({'string.pattern.base': 'Invalid filter field name'}),
|
||||||
values: Joi.array().items(Joi.alternatives().try(
|
values: Joi.array().items(Joi.alternatives().try(
|
||||||
Joi.string().max(128), Joi.number(), Joi.boolean(), Joi.date().iso(), Joi.object()
|
Joi.string().max(128), Joi.number(), Joi.boolean(), Joi.date().iso(), Joi.object(), null
|
||||||
)).min(1)
|
)).min(1)
|
||||||
})).default([])
|
})).default([])
|
||||||
}).with('to-page', 'page-size').validate(data);
|
}).with('to-page', 'page-size').validate(data);
|
||||||
|
Reference in New Issue
Block a user