Archived
2

flattened samples result

This commit is contained in:
VLE2FE
2020-08-10 12:35:08 +02:00
parent 4dede74f49
commit ed8b549752
6 changed files with 75 additions and 39 deletions

View File

@ -452,7 +452,7 @@ describe('/sample', () => {
it('returns a correct csv file for admins if specified', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/samples?status[]=new&status[]=validated&page-size=2&csv=true',
url: '/samples?status[]=new&status[]=validated&page-size=2&output=csv',
contentType: /text\/csv/,
auth: {basic: 'admin'},
httpStatus: 200
@ -467,11 +467,27 @@ describe('/sample', () => {
it('rejects returning a csv file for a write user', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/samples?status[]=new&status[]=validated&page-size=2&csv=true',
url: '/samples?status[]=new&status[]=validated&page-size=2&output=csv',
auth: {basic: 'janedoe'},
httpStatus: 403
});
});
it('returns the object flattened if specified', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=measurements.spectrum.device&fields[]=measurements.spectrum.dpt&page-size=1&output=flatten',
auth: {basic: 'admin'},
httpStatus: 200
}).end((err, res) => {
if (err) return done(err);
should(res.body[0]).have.only.keys('number', 'spectrum.device', 'spectrum.dpt.labels', 'spectrum.dpt.values');
should(res.body[0]).have.property('number', '1');
should(res.body[0]).have.property('spectrum.device', 'Alpha I');
should(res.body[0]).have.property('spectrum.dpt.labels', [3997.12558, 3995.08519, 3993.0448]);
should(res.body[0]).have.property('spectrum.dpt.values', [98.00555, 98.03253, 98.02657]);
done();
});
});
it('returns only the fields specified', done => {
TestHelper.request(server, done, {
method: 'get',

View File

@ -16,6 +16,7 @@ import ConditionTemplateModel from '../models/condition_template';
import ParametersValidate from './validate/parameters';
import db from '../db';
import csv from '../helpers/csv';
import flatten from '../helpers/flatten';
const router = express.Router();
@ -35,7 +36,8 @@ router.get('/samples', async (req, res, next) => {
if (error) return res400(error, res);
// spectral data and csv not allowed for read/write users
if ((filters.fields.find(e => /\.dpt$/.test(e)) || filters.csv) && !req.auth(res, ['dev', 'admin'], 'all')) return;
if ((filters.fields.find(e => /\.dpt$/.test(e)) || filters.output !== 'json') &&
!req.auth(res, ['dev', 'admin'], 'all')) return;
// TODO: find a better place for these
const sampleKeys = ['_id', 'color', 'number', 'type', 'batch', 'added', 'condition', 'material_id', 'note_id',
@ -394,13 +396,16 @@ router.get('/samples', async (req, res, next) => {
[filters.sort[0].split('.')[1],
...measurementFilterFields, ...measurementFieldsFields]
);
if (filters.csv) { // output as csv
if (filters.output === 'csv') { // output as csv
csv(_.compact(data.map(e => SampleValidate.output(e, 'refs', measurementFields))), (err, data) => {
if (err) return next(err);
res.set('Content-Type', 'text/csv');
res.send(data);
});
}
else if (filters.output === 'flatten') {
res.json(_.compact(data.map(e => flatten(SampleValidate.output(e, 'refs', measurementFields), true))));
}
else { // validate all and filter null values from validation errors
res.json(_.compact(data.map(e => SampleValidate.output(e, 'refs', measurementFields))));
}
@ -418,6 +423,9 @@ router.get('/samples', async (req, res, next) => {
delete data._id;
}
}
if (filters.output === 'flatten') {
data = flatten(data, true);
}
res.write((count === 0 ? '' : ',\n') + JSON.stringify(data)); count ++;
});
stream.on('error', err => {

View File

@ -227,7 +227,7 @@ export default class SampleValidate {
sort: Joi.string().pattern(
new RegExp('^(' + this.sortKeys.join('|').replace(/\./g, '\\.').replace(/\*/g, '.+') + ')-(asc|desc)$', 'm')
).default('_id-asc'),
csv: Joi.boolean().default(false),
output: Joi.string().valid('json', 'flatten', 'csv').default('json'),
fields: Joi.array().items(Joi.string().pattern(
new RegExp('^(' + this.fieldKeys.join('|').replace(/\./g, '\\.').replace(/\*/g, '.+') + ')$', 'm')
)).default(['_id','number','type','batch','material_id','color','condition','note_id','user_id','added'])