code improvements
This commit is contained in:
		@@ -149,7 +149,6 @@ export default class db {
 | 
			
		||||
  // changelog entry, expects (req, this (from query helper)) or (req, collection, conditions, data)
 | 
			
		||||
  static log(req, thisOrCollection, conditions = null, data = null) {
 | 
			
		||||
    if (! (conditions || data)) {  // (req, this)
 | 
			
		||||
      console.log(11);
 | 
			
		||||
      data = thisOrCollection._update ? _.cloneDeep(thisOrCollection._update) : {};  // replace undefined with {}
 | 
			
		||||
      // replace keys with a leading $
 | 
			
		||||
      Object.keys(data).forEach(key => {
 | 
			
		||||
@@ -158,7 +157,6 @@ export default class db {
 | 
			
		||||
          delete data[key];
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
      console.log(thisOrCollection._conditions);
 | 
			
		||||
      new ChangelogModel(this.logEscape(_.cloneDeep({
 | 
			
		||||
        action: req.method + ' ' + req.url,
 | 
			
		||||
        collection_name: thisOrCollection._collection.collectionName,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
import {parseAsync} from 'json2csv';
 | 
			
		||||
import flatten from './flatten';
 | 
			
		||||
 | 
			
		||||
export default function csv(input: any[], f: (err, data) => void) {
 | 
			
		||||
export default function csv(input: any[], f: (err, data) => void) {  // parse JSON to CSV
 | 
			
		||||
  parseAsync(input.map(e => flatten(e)), {includeEmptyRows: true})
 | 
			
		||||
    .then(csv => f(null, csv))
 | 
			
		||||
    .catch(err => f(err, null));
 | 
			
		||||
 
 | 
			
		||||
@@ -3,10 +3,10 @@ import globals from '../globals';
 | 
			
		||||
export default function flatten (data, keepArray = false) {  // flatten object: {a: {b: true}} -> {a.b: true}
 | 
			
		||||
  const result = {};
 | 
			
		||||
  function recurse (cur, prop) {
 | 
			
		||||
    if (Object(cur) !== cur || Object.keys(cur).length === 0) {
 | 
			
		||||
    if (Object(cur) !== cur || Object.keys(cur).length === 0) {  // simple value
 | 
			
		||||
      result[prop] = cur;
 | 
			
		||||
    }
 | 
			
		||||
    else if (prop === `${globals.spectrum.spectrum}.${globals.spectrum.dpt}`) {
 | 
			
		||||
    else if (prop === `${globals.spectrum.spectrum}.${globals.spectrum.dpt}`) {  // convert spectrum for ML
 | 
			
		||||
      result[prop + '.labels'] = cur.map(e => parseFloat(e[0]));
 | 
			
		||||
      result[prop + '.values'] = cur.map(e => parseFloat(e[1]));
 | 
			
		||||
    }
 | 
			
		||||
@@ -27,7 +27,7 @@ export default function flatten (data, keepArray = false) {  // flatten object:
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
    else {  // object
 | 
			
		||||
      let isEmpty = true;
 | 
			
		||||
      for (let p in cur) {
 | 
			
		||||
        isEmpty = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,10 @@ import axios from 'axios';
 | 
			
		||||
 | 
			
		||||
export default class Mail{
 | 
			
		||||
 | 
			
		||||
  static readonly address = 'definma@bosch-iot.com';
 | 
			
		||||
  static uri: string;
 | 
			
		||||
  static auth = {username: '', password: ''};
 | 
			
		||||
  static mailPass: string;
 | 
			
		||||
  static readonly address = 'definma@bosch-iot.com';  // email address
 | 
			
		||||
  static uri: string;                                 // mail API URI
 | 
			
		||||
  static auth = {username: '', password: ''};         // mail API credentials
 | 
			
		||||
  static mailPass: string;                            // mail API generates password
 | 
			
		||||
 | 
			
		||||
  static init() {
 | 
			
		||||
    if (process.env.NODE_ENV === 'production') {  // only send mails in production
 | 
			
		||||
@@ -51,14 +51,14 @@ export default class Mail{
 | 
			
		||||
      }).then(() => {  // init done successfully
 | 
			
		||||
        console.info('Mail service established successfully');
 | 
			
		||||
        this.send('lukas.veit@bosch.com', 'Mail Service started', new Date().toString());
 | 
			
		||||
      }).catch(err => {  // anywhere an error occurred
 | 
			
		||||
      }).catch(err => {  // somewhere an error occurred
 | 
			
		||||
        console.error(`Mail init error: ${err.request.method} ${err.request.path}: ${err.response.status}`,
 | 
			
		||||
          err.response.data);
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static send (mailAddress, subject, content, f: (x?) => void = () => {}) {  // callback, executed empty or with error
 | 
			
		||||
  static send (mailAddress, subject, content, f: (x?) => void = () => {}) {  // callback executed empty or with error
 | 
			
		||||
    if (process.env.NODE_ENV === 'production') {  // only send mails in production
 | 
			
		||||
      axios({
 | 
			
		||||
        method: 'post',
 | 
			
		||||
 
 | 
			
		||||
@@ -100,6 +100,9 @@ app.use(require('./helpers/authorize'));  // handle authentication
 | 
			
		||||
// redirect /api routes for Angular proxy in development
 | 
			
		||||
if (process.env.NODE_ENV !== 'production') {
 | 
			
		||||
  app.use('/api/:url([^]+)', (req, res) => {
 | 
			
		||||
    if (/help\//.test(req.params.url)) { // encode URI again for help route
 | 
			
		||||
      req.params.url = 'help/' + encodeURIComponent(req.params.url.replace('help/', ''));
 | 
			
		||||
    }
 | 
			
		||||
    req.url = '/' + req.params.url;
 | 
			
		||||
    app.handle(req, res);
 | 
			
		||||
  });
 | 
			
		||||
 
 | 
			
		||||
@@ -25,21 +25,7 @@ router.get('/materials', (req, res, next) => {
 | 
			
		||||
    MaterialValidate.query(req.query, ['dev', 'admin'].indexOf(req.authDetails.level) >= 0);
 | 
			
		||||
  if (error) return res400(error, res);
 | 
			
		||||
 | 
			
		||||
  let conditions;
 | 
			
		||||
 | 
			
		||||
  if (filters.hasOwnProperty('status')) {
 | 
			
		||||
    if(filters.status === 'all') {
 | 
			
		||||
      conditions = {$or: [{status: globals.status.val}, {status: globals.status.new}]}
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      conditions = {status: filters.status};
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else {  // default
 | 
			
		||||
    conditions = {status: globals.status.val};
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  MaterialModel.find(conditions).sort({name: 1}).populate('group_id').populate('supplier_id')
 | 
			
		||||
  MaterialModel.find(filters).sort({name: 1}).populate('group_id').populate('supplier_id')
 | 
			
		||||
    .lean().exec((err, data) => {
 | 
			
		||||
    if (err) return next(err);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,16 +22,12 @@ import globals from '../globals';
 | 
			
		||||
 | 
			
		||||
const router = express.Router();
 | 
			
		||||
 | 
			
		||||
// TODO: do not use streaming for spectrum filenames
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
router.get('/samples', async (req, res, next) => {
 | 
			
		||||
  if (!req.auth(res, ['read', 'write', 'dev', 'admin'], 'all')) return;
 | 
			
		||||
 | 
			
		||||
  const {error, value: filters} = SampleValidate.query(req.query, ['dev', 'admin'].indexOf(req.authDetails.level) >= 0);
 | 
			
		||||
  console.log(error);
 | 
			
		||||
  if (error) return res400(error, res);
 | 
			
		||||
  console.log(filters.filters);
 | 
			
		||||
 | 
			
		||||
  // spectral data and csv not allowed for read/write users
 | 
			
		||||
  if ((filters.fields.find(e => e.indexOf('.' + globals.spectrum.dpt) >= 0) || filters.output !== 'json') &&
 | 
			
		||||
@@ -388,7 +384,6 @@ router.get('/samples', async (req, res, next) => {
 | 
			
		||||
    projection._id = false;
 | 
			
		||||
  }
 | 
			
		||||
  queryPtr.push({$project: projection});
 | 
			
		||||
  console.log(JSON.stringify(query));
 | 
			
		||||
  // use streaming when including spectrum files
 | 
			
		||||
  if (!fieldsToAdd.find(e => e.indexOf(globals.spectrum.spectrum + '.' + globals.spectrum.dpt) >= 0)) {
 | 
			
		||||
    collection.aggregate(query).allowDiskUse(true).exec((err, data) => {
 | 
			
		||||
@@ -687,8 +682,6 @@ async function numberGenerate (sample, req, res, next) {
 | 
			
		||||
  const sampleData = await SampleModel
 | 
			
		||||
    .aggregate([
 | 
			
		||||
      {$match: {number: new RegExp('^' + req.authDetails.location + '[0-9]+$', 'm')}},
 | 
			
		||||
      // {$addFields: {number2: {$toDecimal: {$arrayElemAt: [{$split: [{$arrayElemAt:
 | 
			
		||||
      //   [{$split: ['$number', 'Rng']}, 1]}, '_']}, 0]}}}},  // not working with MongoDb 3.6
 | 
			
		||||
      {$addFields: {sortNumber: {$let: {
 | 
			
		||||
        vars: {tmp: {$concat: ['000000000000000000000000000000',
 | 
			
		||||
              {$arrayElemAt: [{$split:
 | 
			
		||||
@@ -701,7 +694,6 @@ async function numberGenerate (sample, req, res, next) {
 | 
			
		||||
    .exec()
 | 
			
		||||
    .catch(err => next(err));
 | 
			
		||||
  if (sampleData instanceof Error) return false;
 | 
			
		||||
  console.log(sampleData);
 | 
			
		||||
  let number = (sampleData[0] ? Number(sampleData[0].number.replace(/[^0-9]+/g, '')) : 0);
 | 
			
		||||
  if (numberBuffer[req.authDetails.location] && numberBuffer[req.authDetails.location] >= number) {
 | 
			
		||||
    number = numberBuffer[req.authDetails.location];
 | 
			
		||||
 
 | 
			
		||||
@@ -64,8 +64,6 @@ router.put('/template/:collection(measurement|condition|material)/' + IdValidate
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!_.isEqual(_.pick(templateData, _.keys(template)), template)) {  // data was changed
 | 
			
		||||
    console.log(template);
 | 
			
		||||
    console.log(templateData);
 | 
			
		||||
    if (!template.parameters || _.isEqual(templateData.parameters, template.parameters)) {  // only name was changed
 | 
			
		||||
      model(req).findByIdAndUpdate(req.params.id, {name: template.name}, {new: true})
 | 
			
		||||
        .log(req).lean().exec((err, data) => {
 | 
			
		||||
 
 | 
			
		||||
@@ -199,7 +199,6 @@ export default class SampleValidate {
 | 
			
		||||
            data.filters[i] = decodeURIComponent(data.filters[i]);
 | 
			
		||||
          }
 | 
			
		||||
          catch (ignore) {}
 | 
			
		||||
          console.log(data.filters[i]);
 | 
			
		||||
          data.filters[i] = JSON.parse(data.filters[i]);
 | 
			
		||||
          data.filters[i].values = data.filters[i].values.map(e => {  // validate filter values
 | 
			
		||||
            if (e === null) {  // null values are always allowed
 | 
			
		||||
@@ -241,7 +240,6 @@ export default class SampleValidate {
 | 
			
		||||
              validator = Joi.object(this.sample);
 | 
			
		||||
            }
 | 
			
		||||
            const {value, error} = validator.validate({[field]: e});
 | 
			
		||||
            console.log(error);
 | 
			
		||||
            if (error) throw error;  // reject invalid values
 | 
			
		||||
            return value[field];
 | 
			
		||||
          });
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ export default class UserValidate {  // validate input for user
 | 
			
		||||
      }).validate(data);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      return{error: 'No parameter specified!', value: {}};
 | 
			
		||||
      return {error: 'No parameter specified!', value: {}};
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user