2020-05-12 12:15:36 +02:00
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 ;
2020-05-12 12:26:26 +02:00
measurement . status =
2020-05-12 12:15:36 +02:00
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 ;
}