added /measurement/sample/{id} route
This commit is contained in:
		@@ -77,6 +77,40 @@
 | 
				
			|||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'api.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/measurement/sample/{id}:
 | 
				
			||||||
 | 
					  parameters:
 | 
				
			||||||
 | 
					    - $ref: 'api.yaml#/components/parameters/Id'
 | 
				
			||||||
 | 
					  get:
 | 
				
			||||||
 | 
					    summary: all measurements of the given sample
 | 
				
			||||||
 | 
					    description: 'Auth: basic, levels: dev, admin'
 | 
				
			||||||
 | 
					    tags:
 | 
				
			||||||
 | 
					      - /measurement
 | 
				
			||||||
 | 
					    security:
 | 
				
			||||||
 | 
					      - BasicAuth: []
 | 
				
			||||||
 | 
					    responses:
 | 
				
			||||||
 | 
					      200:
 | 
				
			||||||
 | 
					        description: measurement details
 | 
				
			||||||
 | 
					        content:
 | 
				
			||||||
 | 
					          application/json:
 | 
				
			||||||
 | 
					            schema:
 | 
				
			||||||
 | 
					              type: array
 | 
				
			||||||
 | 
					              items:
 | 
				
			||||||
 | 
					                allOf:
 | 
				
			||||||
 | 
					                  - $ref: 'api.yaml#/components/schemas/Measurement'
 | 
				
			||||||
 | 
					                properties:
 | 
				
			||||||
 | 
					                  status:
 | 
				
			||||||
 | 
					                    type: string
 | 
				
			||||||
 | 
					                    description: can be deleted/new/validated
 | 
				
			||||||
 | 
					                    example: new
 | 
				
			||||||
 | 
					      401:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
 | 
					      403:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
 | 
					      404:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
 | 
					      500:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/measurement/restore/{id}:
 | 
					/measurement/restore/{id}:
 | 
				
			||||||
  parameters:
 | 
					  parameters:
 | 
				
			||||||
    - $ref: 'api.yaml#/components/parameters/Id'
 | 
					    - $ref: 'api.yaml#/components/parameters/Id'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -404,6 +404,60 @@ describe('/measurement', () => {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('GET /measurement/sample/{id}', () => {
 | 
				
			||||||
 | 
					    it('returns the right measurements', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/measurement/sample/400000000000000000000003',
 | 
				
			||||||
 | 
					        auth: {basic: 'admin'},
 | 
				
			||||||
 | 
					        httpStatus: 200,
 | 
				
			||||||
 | 
					        res: [
 | 
				
			||||||
 | 
					          {_id: '800000000000000000000003', sample_id: '400000000000000000000003', values: {val1: 1}, measurement_template: '300000000000000000000003', status: 'new'},
 | 
				
			||||||
 | 
					          {_id: '800000000000000000000004', sample_id: '400000000000000000000003', values: {val1: 1}, measurement_template: '300000000000000000000003', status: 'deleted'}
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects an API key', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/measurement/sample/400000000000000000000003',
 | 
				
			||||||
 | 
					        auth: {key: 'admin'},
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects a write user', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/measurement/sample/400000000000000000000003',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 403
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects an invalid id', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/measurement/sample/4000000000h0000000000003',
 | 
				
			||||||
 | 
					        auth: {basic: 'admin'},
 | 
				
			||||||
 | 
					        httpStatus: 404
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects an unknown id', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/measurement/sample/000000000000000000000003',
 | 
				
			||||||
 | 
					        auth: {basic: 'admin'},
 | 
				
			||||||
 | 
					        httpStatus: 404
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects unauthorized requests', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/measurement/sample/400000000000000000000003',
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('PUT /measurement/restore/{id}', () => {
 | 
					  describe('PUT /measurement/restore/{id}', () => {
 | 
				
			||||||
    it('sets the status', done => {
 | 
					    it('sets the status', done => {
 | 
				
			||||||
      TestHelper.request(server, done, {
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,7 @@ import res400 from './validate/res400';
 | 
				
			|||||||
import ParametersValidate from './validate/parameters';
 | 
					import ParametersValidate from './validate/parameters';
 | 
				
			||||||
import db from '../db';
 | 
					import db from '../db';
 | 
				
			||||||
import globals from '../globals';
 | 
					import globals from '../globals';
 | 
				
			||||||
 | 
					import mongoose from "mongoose";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const router = express.Router();
 | 
					const router = express.Router();
 | 
				
			||||||
@@ -82,6 +83,19 @@ router.delete('/measurement/' + IdValidate.parameter(), (req, res, next) => {
 | 
				
			|||||||
  });
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					router.get('/measurement/sample/' + IdValidate.parameter(), (req, res, next) => {
 | 
				
			||||||
 | 
					  if (!req.auth(res, ['dev', 'admin'], 'basic')) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MeasurementModel.find({sample_id: mongoose.Types.ObjectId(req.params.id)}).lean().exec((err, data: any) => {
 | 
				
			||||||
 | 
					    if (err) return next(err);
 | 
				
			||||||
 | 
					    if (!data.length) {
 | 
				
			||||||
 | 
					      return res.status(404).json({status: 'Not found'});
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    res.json(_.compact(data.map(e => MeasurementValidate.output(e, req, true))));
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
router.put('/measurement/restore/' + IdValidate.parameter(), (req, res, next) => {
 | 
					router.put('/measurement/restore/' + IdValidate.parameter(), (req, res, next) => {
 | 
				
			||||||
  if (!req.auth(res, ['dev', 'admin'], 'basic')) return;
 | 
					  if (!req.auth(res, ['dev', 'admin'], 'basic')) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,18 +35,23 @@ export default class MeasurementValidate {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static output (data, req) {  // validate output and strip unwanted properties, returns null if not valid
 | 
					  // validate output and strip unwanted properties, returns null if not valid
 | 
				
			||||||
 | 
					  static output (data, req, status = false) {
 | 
				
			||||||
    data = IdValidate.stringify(data);
 | 
					    data = IdValidate.stringify(data);
 | 
				
			||||||
    // spectral data not allowed for read/write users
 | 
					    // spectral data not allowed for read/write users
 | 
				
			||||||
    if (['dev', 'admin'].indexOf(req.authDetails.level) < 0 && data.values[globals.spectrum.dpt]) {
 | 
					    if (['dev', 'admin'].indexOf(req.authDetails.level) < 0 && data.values[globals.spectrum.dpt]) {
 | 
				
			||||||
      delete data.values[globals.spectrum.dpt];
 | 
					      delete data.values[globals.spectrum.dpt];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    const {value, error} = Joi.object({
 | 
					    const validation: any = {
 | 
				
			||||||
      _id: IdValidate.get(),
 | 
					      _id: IdValidate.get(),
 | 
				
			||||||
      sample_id: IdValidate.get(),
 | 
					      sample_id: IdValidate.get(),
 | 
				
			||||||
      values: this.measurement.values,
 | 
					      values: this.measurement.values,
 | 
				
			||||||
      measurement_template: IdValidate.get()
 | 
					      measurement_template: IdValidate.get()
 | 
				
			||||||
    }).validate(data, {stripUnknown: true});
 | 
					    };
 | 
				
			||||||
 | 
					    if (status) {
 | 
				
			||||||
 | 
					      validation.status = Joi.string().valid(...Object.values(globals.status));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const {value, error} = Joi.object(validation).validate(data, {stripUnknown: true});
 | 
				
			||||||
    return error !== undefined? null : value;
 | 
					    return error !== undefined? null : value;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user