added TODOs, improved password validation
This commit is contained in:
		@@ -4,7 +4,7 @@ import oasParser from '@apidevtools/swagger-parser';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// modifies the normal swagger-ui-express package
 | 
					// modifies the normal swagger-ui-express package
 | 
				
			||||||
// usage: app.use('/api', api.serve(), api.setup());
 | 
					// usage: app.use('/api-doc', api.serve(), api.setup());
 | 
				
			||||||
// the paths property can be split using allOf
 | 
					// the paths property can be split using allOf
 | 
				
			||||||
// further route documentation can be included in the x-doc property
 | 
					// further route documentation can be included in the x-doc property
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								src/index.ts
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								src/index.ts
									
									
									
									
									
								
							@@ -5,7 +5,12 @@ import mongoSanitize from 'mongo-sanitize';
 | 
				
			|||||||
import api from './api';
 | 
					import api from './api';
 | 
				
			||||||
import db from './db';
 | 
					import db from './db';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: changelog
 | 
				
			||||||
 | 
					// TODO: check executing index.js/move everything needed into dist
 | 
				
			||||||
 | 
					// TODO: One condition per sample
 | 
				
			||||||
 | 
					// TODO: validation: VZ, Humidity: min/max value, DPT: filename
 | 
				
			||||||
 | 
					// TODO: condition values not needed on initial add
 | 
				
			||||||
 | 
					// TODO: add multiple samples at once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// tell if server is running in debug or production environment
 | 
					// tell if server is running in debug or production environment
 | 
				
			||||||
console.info(process.env.NODE_ENV === 'production' ? '===== PRODUCTION =====' : process.env.NODE_ENV === 'test' ? '' :'===== DEVELOPMENT =====');
 | 
					console.info(process.env.NODE_ENV === 'production' ? '===== PRODUCTION =====' : process.env.NODE_ENV === 'test' ? '' :'===== DEVELOPMENT =====');
 | 
				
			||||||
@@ -44,19 +49,19 @@ app.use((req, res, next) => {  // no database connection error
 | 
				
			|||||||
app.use(require('./helpers/authorize'));  // handle authentication
 | 
					app.use(require('./helpers/authorize'));  // handle authentication
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// require routes
 | 
					// require routes
 | 
				
			||||||
app.use('/', require('./routes/root'));
 | 
					app.use('/api', require('./routes/root'));
 | 
				
			||||||
app.use('/', require('./routes/sample'));
 | 
					app.use('/api', require('./routes/sample'));
 | 
				
			||||||
app.use('/', require('./routes/material'));
 | 
					app.use('/api', require('./routes/material'));
 | 
				
			||||||
app.use('/', require('./routes/template'));
 | 
					app.use('/api', require('./routes/template'));
 | 
				
			||||||
app.use('/', require('./routes/user'));
 | 
					app.use('/api', require('./routes/user'));
 | 
				
			||||||
app.use('/', require('./routes/condition'));
 | 
					app.use('/api', require('./routes/condition'));
 | 
				
			||||||
app.use('/', require('./routes/measurement'));
 | 
					app.use('/api', require('./routes/measurement'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// static files
 | 
					// static files
 | 
				
			||||||
app.use('/static', express.static('static'));
 | 
					app.use('/static', express.static('static'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Swagger UI
 | 
					// Swagger UI
 | 
				
			||||||
app.use('/api', api.serve(), api.setup());
 | 
					app.use('/api-doc', api.serve(), api.setup());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app.use((req, res) => {  // 404 error handling
 | 
					app.use((req, res) => {  // 404 error handling
 | 
				
			||||||
  res.status(404).json({status: 'Not found'});
 | 
					  res.status(404).json({status: 'Not found'});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,10 @@ import should from 'should/as-function';
 | 
				
			|||||||
import ConditionModel from '../models/condition';
 | 
					import ConditionModel from '../models/condition';
 | 
				
			||||||
import TestHelper from "../test/helper";
 | 
					import TestHelper from "../test/helper";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: adding conditions allowed only for m/a
 | 
				
			||||||
 | 
					// TODO: deleted data only visible for m/a
 | 
				
			||||||
 | 
					// TODO: restore deleted
 | 
				
			||||||
 | 
					// TODO: remove number_prefix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('/condition', () => {
 | 
					describe('/condition', () => {
 | 
				
			||||||
  let server;
 | 
					  let server;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,8 @@ import _ from 'lodash';
 | 
				
			|||||||
import MaterialModel from '../models/material';
 | 
					import MaterialModel from '../models/material';
 | 
				
			||||||
import TestHelper from "../test/helper";
 | 
					import TestHelper from "../test/helper";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: color name must be unique to get color number
 | 
				
			||||||
 | 
					// TODO: separate supplier/ material name into own collections
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('/material', () => {
 | 
					describe('/material', () => {
 | 
				
			||||||
  let server;
 | 
					  let server;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,9 @@ import should from 'should/as-function';
 | 
				
			|||||||
import MeasurementModel from '../models/measurement';
 | 
					import MeasurementModel from '../models/measurement';
 | 
				
			||||||
import TestHelper from "../test/helper";
 | 
					import TestHelper from "../test/helper";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: allow empty values
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('/measurement', () => {
 | 
					describe('/measurement', () => {
 | 
				
			||||||
  let server;
 | 
					  let server;
 | 
				
			||||||
  before(done => TestHelper.before(done));
 | 
					  before(done => TestHelper.before(done));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,9 @@ import NoteModel from '../models/note';
 | 
				
			|||||||
import NoteFieldModel from '../models/note_field';
 | 
					import NoteFieldModel from '../models/note_field';
 | 
				
			||||||
import TestHelper from "../test/helper";
 | 
					import TestHelper from "../test/helper";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: generate output for ML in format DPT -> data, implement filtering, field selection
 | 
				
			||||||
 | 
					// TODO: write script for data import
 | 
				
			||||||
 | 
					// TODO: delete everything (measurements, condition) with sample
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('/sample', () => {
 | 
					describe('/sample', () => {
 | 
				
			||||||
  let server;
 | 
					  let server;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import TemplateTreatmentModel from '../models/treatment_template';
 | 
				
			|||||||
import TemplateMeasurementModel from '../models/measurement_template';
 | 
					import TemplateMeasurementModel from '../models/measurement_template';
 | 
				
			||||||
import TestHelper from "../test/helper";
 | 
					import TestHelper from "../test/helper";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: do not allow usage of old templates for new samples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('/template', () => {
 | 
					describe('/template', () => {
 | 
				
			||||||
  let server;
 | 
					  let server;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ import should from 'should/as-function';
 | 
				
			|||||||
import UserModel from '../models/user';
 | 
					import UserModel from '../models/user';
 | 
				
			||||||
import TestHelper from "../test/helper";
 | 
					import TestHelper from "../test/helper";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: reject usernames containing admin, etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('/user', () => {
 | 
					describe('/user', () => {
 | 
				
			||||||
  let server;
 | 
					  let server;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,7 @@ export default class UserValidate {  // validate input for user
 | 
				
			|||||||
      .max(128),
 | 
					      .max(128),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pass: Joi.string()
 | 
					    pass: Joi.string()
 | 
				
			||||||
      .pattern(new RegExp('^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!"#%&\'()*+,-.\\/:;<=>?@[\\]^_`{|}~])(?=\\S+$).{8,}$'))
 | 
					      .pattern(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!"#%&'()*+,-.\/:;<=>?@[\]^_`{|}~])(?=\S+$)[a-zA-Z0-9!"#%&'()*+,\-.\/:;<=>?@[\]^_`{|}~]{8,}$/)
 | 
				
			||||||
      .max(128),
 | 
					      .max(128),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    level: Joi.string()
 | 
					    level: Joi.string()
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user