68 lines
2.6 KiB
TypeScript
68 lines
2.6 KiB
TypeScript
![]() |
import express from 'express';
|
||
|
|
||
|
import MeasurementModel from '../models/measurement';
|
||
|
import ConditionModel from '../models/condition';
|
||
|
import MeasurementTemplateModel from '../models/measurement_template';
|
||
|
import MeasurementValidate from './validate/measurement';
|
||
|
import IdValidate from './validate/id';
|
||
|
import res400 from './validate/res400';
|
||
|
import ParametersValidate from './validate/parameters';
|
||
|
|
||
|
|
||
|
const router = express.Router();
|
||
|
|
||
|
router.get('/measurement/' + IdValidate.parameter(), (req, res, next) => {
|
||
|
if (!req.auth(res, ['read', 'write', 'maintain', 'dev', 'admin'], 'all')) return;
|
||
|
|
||
|
MeasurementModel.findById(req.params.id).lean().exec((err, data) => {
|
||
|
if (err) return next(err);
|
||
|
if (!data) {
|
||
|
return res.status(404).json({status: 'Not found'});
|
||
|
}
|
||
|
|
||
|
res.json(MeasurementValidate.output(data));
|
||
|
});
|
||
|
});
|
||
|
|
||
|
router.post('/measurement/new', async (req, res, next) => {
|
||
|
if (!req.auth(res, ['write', 'maintain', 'dev', 'admin'], 'basic')) return;
|
||
|
|
||
|
const {error, value: measurement} = MeasurementValidate.input(req.body, 'new');
|
||
|
if (error) return res400(error, res);
|
||
|
|
||
|
if (!await conditionIdCheck(measurement, req, res, next)) return;
|
||
|
if (!await templateCheck(measurement, 'new', res, next)) return;
|
||
|
|
||
|
await new MeasurementModel(measurement).save((err, data) => {
|
||
|
if (err) return next(err);
|
||
|
res.json(MeasurementValidate.output(data.toObject()));
|
||
|
});
|
||
|
});
|
||
|
|
||
|
|
||
|
module.exports = router;
|
||
|
|
||
|
|
||
|
async function conditionIdCheck (measurement, req, res, next) { // validate condition_id, returns false if invalid
|
||
|
const sampleData = await ConditionModel.findById(measurement.condition_id).populate('sample_id').lean().exec().catch(err => {next(err); return false;}) as any;
|
||
|
if (!sampleData) { // sample_id not found
|
||
|
res.status(400).json({status: 'Condition id not available'});
|
||
|
return false
|
||
|
}
|
||
|
if (sampleData.sample_id.user_id.toString() !== req.authDetails.id && !req.auth(res, ['maintain', 'admin'], 'basic')) return false; // sample does not belong to user
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
async function templateCheck (measurement, param, res, next) { // validate measurement_template and values
|
||
|
const templateData = await MeasurementTemplateModel.findById(measurement.measurement_template).lean().exec().catch(err => {next(err); return false;}) as any;
|
||
|
if (!templateData) { // template not found
|
||
|
res.status(400).json({status: 'Measurement template not available'});
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// validate values
|
||
|
const {error, value: ignore} = ParametersValidate.input(measurement.values, templateData.parameters, param);
|
||
|
console.log(error);
|
||
|
if (error) {res400(error, res); return false;}
|
||
|
return true;
|
||
|
}
|