/authorized returns level, added device to spectrum measurement
This commit is contained in:
@ -22,12 +22,11 @@ import csv from '../helpers/csv';
|
||||
const router = express.Router();
|
||||
|
||||
// TODO: check added filter
|
||||
// TODO: use query pointer
|
||||
// TODO: convert filter value to number according to table model
|
||||
// TODO: validation for filter parameters
|
||||
// TODO: location/device sort/filter
|
||||
|
||||
// TODO: think about material numbers
|
||||
// TODO: think about filter keys with measurement template versions
|
||||
|
||||
router.get('/samples', async (req, res, next) => {
|
||||
if (!req.auth(res, ['read', 'write', 'maintain', 'dev', 'admin'], 'all')) return;
|
||||
@ -104,9 +103,9 @@ router.get('/samples', async (req, res, next) => {
|
||||
if (filters.sort[0].indexOf('measurements.') >= 0) { // sorting with measurements as starting collection
|
||||
collection = MeasurementModel;
|
||||
const [,measurementName, measurementParam] = filters.sort[0].split('.');
|
||||
const measurementTemplate = await MeasurementTemplateModel.findOne({name: measurementName}).lean().exec().catch(err => {next(err);});
|
||||
if (measurementTemplate instanceof Error) return;
|
||||
if (!measurementTemplate) {
|
||||
const measurementTemplates = await MeasurementTemplateModel.find({name: measurementName}).lean().exec().catch(err => {next(err);});
|
||||
if (measurementTemplates instanceof Error) return;
|
||||
if (!measurementTemplates) {
|
||||
return res.status(400).json({status: 'Invalid body format', details: filters.sort[0] + ' not found'});
|
||||
}
|
||||
let sortStartValue = null;
|
||||
@ -118,7 +117,7 @@ router.get('/samples', async (req, res, next) => {
|
||||
}
|
||||
sortStartValue = fromSample.values[measurementParam];
|
||||
}
|
||||
queryPtr[0].$match.$and.push({measurement_template: mongoose.Types.ObjectId(measurementTemplate._id)}); // find measurements to sort
|
||||
queryPtr[0].$match.$and.push({measurement_template: {$in: measurementTemplates.map(e => e._id)}}); // find measurements to sort
|
||||
if (filters.filters.find(e => e.field === filters.sort[0])) { // sorted measurement should also be filtered
|
||||
queryPtr[0].$match.$and.push(...filterQueries(filters.filters.filter(e => e.field === filters.sort[0]).map(e => {e.field = 'values.' + e.field.split('.')[2]; return e; })));
|
||||
}
|
||||
@ -194,7 +193,16 @@ router.get('/samples', async (req, res, next) => {
|
||||
if (!fromSample) {
|
||||
return res.status(400).json({status: 'Invalid body format', details: 'from-id not found'});
|
||||
}
|
||||
sortStartValue = fromSample[filters.sort[0]];
|
||||
console.log(fromSample);
|
||||
console.log(filters.sort[0]);
|
||||
console.log(fromSample[filters.sort[0]]);
|
||||
const filterKey = filters.sort[0].split('.');
|
||||
if (filterKey.length === 2) {
|
||||
sortStartValue = fromSample[0][filterKey[0]][filterKey[1]];
|
||||
}
|
||||
else {
|
||||
sortStartValue = fromSample[0][filterKey[0]];
|
||||
}
|
||||
}
|
||||
queryPtr.push(...sortQuery(filters, [filters.sort[0], '_id'], sortStartValue));
|
||||
}
|
||||
@ -290,19 +298,22 @@ router.get('/samples', async (req, res, next) => {
|
||||
as: 'measurements'
|
||||
}});
|
||||
}
|
||||
measurementTemplates.filter(e => e.name !== 'spectrum').forEach(template => { // TODO: hard coded dpt for special treatment, change later
|
||||
measurementTemplates.forEach(template => { // TODO: hard coded dpt for special treatment, change later
|
||||
queryPtr.push({$addFields: {[template.name]: {$let: { // add measurements as property [template.name], if one result, array is reduced to direct values
|
||||
vars: {arr: {$filter: {input: '$measurements', cond: {$eq: ['$$this.measurement_template', mongoose.Types.ObjectId(template._id)]}}}},
|
||||
in:{$cond: [{$lte: [{$size: '$$arr'}, 1]}, {$arrayElemAt: ['$$arr', 0]}, '$$arr']}
|
||||
}}}}, {$addFields: {[template.name]: {$cond: ['$' + template.name + '.values', '$' + template.name + '.values', template.parameters.reduce((s, e) => {s[e.name] = null; return s;}, {})]}}});
|
||||
if (measurementFieldsFields.find(e => e === 'spectrum')) {
|
||||
queryPtr.push({$unwind: '$spectrum'});
|
||||
}
|
||||
});
|
||||
if (measurementFieldsFields.find(e => e === 'spectrum')) { // TODO: remove hardcoded as well
|
||||
queryPtr.push(
|
||||
{$addFields: {spectrum: {$filter: {input: '$measurements', cond: {$eq: ['$$this.measurement_template', measurementTemplates.filter(e => e.name === 'spectrum')[0]._id]}}}}},
|
||||
{$addFields: {spectrum: '$spectrum.values'}},
|
||||
{$unwind: '$spectrum'}
|
||||
);
|
||||
}
|
||||
// if (measurementFieldsFields.find(e => e === 'spectrum')) { // TODO: remove hardcoded as well
|
||||
// queryPtr.push(
|
||||
// {$addFields: {spectrum: {$filter: {input: '$measurements', cond: {$eq: ['$$this.measurement_template', measurementTemplates.filter(e => e.name === 'spectrum')[0]._id]}}}}},
|
||||
// {$addFields: {spectrum: '$spectrum.values'}},
|
||||
// {$unwind: '$spectrum'}
|
||||
// );
|
||||
// }
|
||||
// queryPtr.push({$unset: 'measurements'});
|
||||
queryPtr.push({$project: {measurements: 0}});
|
||||
}
|
||||
@ -316,9 +327,8 @@ router.get('/samples', async (req, res, next) => {
|
||||
projection._id = false;
|
||||
}
|
||||
queryPtr.push({$project: projection});
|
||||
|
||||
if (!fieldsToAdd.find(e => /spectrum\./.test(e))) { // use streaming when including spectrum files
|
||||
collection.aggregate(query).exec((err, data) => {
|
||||
collection.aggregate(query).allowDiskUse(true).exec((err, data) => {
|
||||
if (err) return next(err);
|
||||
if (data[0] && data[0].count) {
|
||||
res.header('x-total-items', data[0].count.length > 0 ? data[0].count[0].count : 0);
|
||||
@ -354,7 +364,7 @@ router.get('/samples', async (req, res, next) => {
|
||||
res.writeHead(200, {'Content-Type': 'application/json; charset=utf-8'});
|
||||
res.write('[');
|
||||
let count = 0;
|
||||
const stream = collection.aggregate(query).cursor().exec();
|
||||
const stream = collection.aggregate(query).allowDiskUse(true).cursor().exec();
|
||||
stream.on('data', data => {
|
||||
if (filters.fields.indexOf('added') >= 0) { // add added date
|
||||
data.added = data._id.getTimestamp();
|
||||
@ -364,6 +374,9 @@ router.get('/samples', async (req, res, next) => {
|
||||
}
|
||||
res.write((count === 0 ? '' : ',\n') + JSON.stringify(data)); count ++;
|
||||
});
|
||||
stream.on('error', err => {
|
||||
console.error(err);
|
||||
});
|
||||
stream.on('close', () => {
|
||||
res.write(']');
|
||||
res.end();
|
||||
|
Reference in New Issue
Block a user