added deleted status for /samples
This commit is contained in:
parent
63d14acc3c
commit
4ce65ad7cc
@ -8,11 +8,13 @@
|
|||||||
- /sample
|
- /sample
|
||||||
parameters:
|
parameters:
|
||||||
- name: status
|
- name: status
|
||||||
description: 'values: validated|new|all, defaults to validated'
|
description: 'values: validated|new, for dev/admin also deleted, defaults to validated'
|
||||||
in: query
|
in: query
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: array
|
||||||
example: all
|
items:
|
||||||
|
type: string
|
||||||
|
example: ['validated']
|
||||||
- name: from-id
|
- name: from-id
|
||||||
description: first id of the requested page, if not given the results are displayed from start
|
description: first id of the requested page, if not given the results are displayed from start
|
||||||
in: query
|
in: query
|
||||||
|
@ -51,7 +51,7 @@ export default class db {
|
|||||||
connectTimeoutMS: 10000
|
connectTimeoutMS: 10000
|
||||||
}, err => {
|
}, err => {
|
||||||
if (err) done(err);
|
if (err) done(err);
|
||||||
}).then(() => {});
|
});
|
||||||
mongoose.connection.on('error', console.error.bind(console, 'connection error:'));
|
mongoose.connection.on('error', console.error.bind(console, 'connection error:'));
|
||||||
mongoose.connection.on('connected', () => { // evaluation connection behaviour on prod
|
mongoose.connection.on('connected', () => { // evaluation connection behaviour on prod
|
||||||
if (process.env.NODE_ENV !== 'test') { // Do not interfere with testing
|
if (process.env.NODE_ENV !== 'test') { // Do not interfere with testing
|
||||||
@ -69,7 +69,7 @@ export default class db {
|
|||||||
mongoose.connection.close(() => {
|
mongoose.connection.close(() => {
|
||||||
console.info('Mongoose default connection disconnected through app termination');
|
console.info('Mongoose default connection disconnected through app termination');
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}).then(() => {});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mongoose.connection.once('open', () => {
|
mongoose.connection.once('open', () => {
|
||||||
@ -85,7 +85,7 @@ export default class db {
|
|||||||
console.info(process.env.NODE_ENV === 'test' ? '' : `Disconnected from database`);
|
console.info(process.env.NODE_ENV === 'test' ? '' : `Disconnected from database`);
|
||||||
this.state.db = 0;
|
this.state.db = 0;
|
||||||
done();
|
done();
|
||||||
}).then(() => {});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static getState () {
|
static getState () {
|
||||||
|
@ -10,50 +10,52 @@ export default class Mail{
|
|||||||
static mailPass: string;
|
static mailPass: string;
|
||||||
|
|
||||||
static init() {
|
static init() {
|
||||||
this.mailPass = Array(64).fill(0).map(() => Math.floor(Math.random() * 10)).join('');
|
if (process.env.NODE_ENV === 'production') { // only send mails in production
|
||||||
this.uri = JSON.parse(process.env.VCAP_SERVICES).Mail[0].credentials.uri;
|
this.mailPass = Array(64).fill(0).map(() => Math.floor(Math.random() * 10)).join('');
|
||||||
this.auth.username = JSON.parse(process.env.VCAP_SERVICES).Mail[0].credentials.username;
|
this.uri = JSON.parse(process.env.VCAP_SERVICES).Mail[0].credentials.uri;
|
||||||
this.auth.password = JSON.parse(process.env.VCAP_SERVICES).Mail[0].credentials.password;
|
this.auth.username = JSON.parse(process.env.VCAP_SERVICES).Mail[0].credentials.username;
|
||||||
axios({ // get registered mail addresses
|
this.auth.password = JSON.parse(process.env.VCAP_SERVICES).Mail[0].credentials.password;
|
||||||
method: 'get',
|
axios({ // get registered mail addresses
|
||||||
url: this.uri + '/management/userDomainMapping',
|
method: 'get',
|
||||||
auth: this.auth
|
url: this.uri + '/management/userDomainMapping',
|
||||||
}).then(res => {
|
auth: this.auth
|
||||||
return new Promise(async (resolve, reject) => {
|
}).then(res => {
|
||||||
try {
|
return new Promise(async (resolve, reject) => {
|
||||||
if (res.data.addresses.indexOf(this.address) < 0) { // mail address not registered
|
try {
|
||||||
if (res.data.addresses.length) { // delete wrong registered mail address
|
if (res.data.addresses.indexOf(this.address) < 0) { // mail address not registered
|
||||||
await axios({
|
if (res.data.addresses.length) { // delete wrong registered mail address
|
||||||
method: 'delete',
|
await axios({
|
||||||
url: this.uri + '/management/mailAddresses/' + res.data.addresses[0],
|
method: 'delete',
|
||||||
|
url: this.uri + '/management/mailAddresses/' + res.data.addresses[0],
|
||||||
|
auth: this.auth
|
||||||
|
});
|
||||||
|
}
|
||||||
|
await axios({ // register right mail address
|
||||||
|
method: 'post',
|
||||||
|
url: this.uri + '/management/mailAddresses/' + this.address,
|
||||||
auth: this.auth
|
auth: this.auth
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
await axios({ // register right mail address
|
resolve();
|
||||||
method: 'post',
|
|
||||||
url: this.uri + '/management/mailAddresses/' + this.address,
|
|
||||||
auth: this.auth
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
resolve();
|
catch (e) {
|
||||||
}
|
reject(e);
|
||||||
catch (e) {
|
}
|
||||||
reject(e);
|
});
|
||||||
}
|
}).then(() => {
|
||||||
|
return axios({ // set new mail password
|
||||||
|
method: 'put',
|
||||||
|
url: this.uri + '/management/mailAddresses/' + this.address + '/password/' + this.mailPass,
|
||||||
|
auth: this.auth
|
||||||
|
});
|
||||||
|
}).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
|
||||||
|
console.error(`Mail init error: ${err.request.method} ${err.request.path}: ${err.response.status}`,
|
||||||
|
err.response.data);
|
||||||
});
|
});
|
||||||
}).then(() => {
|
}
|
||||||
return axios({ // set new mail password
|
|
||||||
method: 'put',
|
|
||||||
url: this.uri + '/management/mailAddresses/' + this.address + '/password/' + this.mailPass,
|
|
||||||
auth: this.auth
|
|
||||||
});
|
|
||||||
}).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
|
|
||||||
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
|
||||||
|
@ -48,6 +48,22 @@ describe('/sample', () => {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it('returns deleted samples for admin', done => {
|
||||||
|
TestHelper.request(server, done, {
|
||||||
|
method: 'get',
|
||||||
|
url: '/samples?status[]=deleted&fields[]=number&fields=status',
|
||||||
|
auth: {basic: 'admin'},
|
||||||
|
httpStatus: 200
|
||||||
|
}).end((err, res) => {
|
||||||
|
if (err) return done(err);
|
||||||
|
const json = require('../test/db.json');
|
||||||
|
should(res.body).have.lengthOf(json.collections.samples.filter(e => e.status ==='deleted').length);
|
||||||
|
should(res.body).matchEach(sample => {
|
||||||
|
should(sample).have.property('status', 'deleted').be.type('string');
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
it('works with an API key', done => {
|
it('works with an API key', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
@ -78,7 +94,7 @@ describe('/sample', () => {
|
|||||||
it('allows filtering by state', done => {
|
it('allows filtering by state', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=new',
|
url: '/samples?status[]=new',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -104,7 +120,7 @@ describe('/sample', () => {
|
|||||||
it('uses the given page size', done => {
|
it('uses the given page size', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&page-size=3',
|
url: '/samples?status[]=new&status[]=validated&page-size=3',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -116,7 +132,7 @@ describe('/sample', () => {
|
|||||||
it('returns results starting from first-id', done => {
|
it('returns results starting from first-id', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&from-id=400000000000000000000002',
|
url: '/samples?status[]=new&status[]=validated&from-id=400000000000000000000002',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -129,7 +145,7 @@ describe('/sample', () => {
|
|||||||
it('returns the right page number', done => {
|
it('returns the right page number', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&to-page=2&page-size=2',
|
url: '/samples?status[]=new&status[]=validated&to-page=2&page-size=2',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -141,7 +157,7 @@ describe('/sample', () => {
|
|||||||
it('works with negative page numbers', done => {
|
it('works with negative page numbers', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&to-page=-1&page-size=2&from-id=400000000000000000000004',
|
url: '/samples?status[]=new&status[]=validated&to-page=-1&page-size=2&from-id=400000000000000000000004',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -154,7 +170,7 @@ describe('/sample', () => {
|
|||||||
it('returns an empty array for a page number out of range', done => {
|
it('returns an empty array for a page number out of range', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&to-page=100&page-size=2',
|
url: '/samples?status[]=new&status[]=validated&to-page=100&page-size=2',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -167,7 +183,7 @@ describe('/sample', () => {
|
|||||||
it('returns an empty array for a page number out of negative range', done => {
|
it('returns an empty array for a page number out of negative range', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&to-page=-100&page-size=3&from-id=400000000000000000000004',
|
url: '/samples?status[]=new&status[]=validated&to-page=-100&page-size=3&from-id=400000000000000000000004',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -180,7 +196,7 @@ describe('/sample', () => {
|
|||||||
it('sorts the samples ascending', done => {
|
it('sorts the samples ascending', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&sort=color-asc',
|
url: '/samples?status[]=new&status[]=validated&sort=color-asc',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -193,7 +209,7 @@ describe('/sample', () => {
|
|||||||
it('sorts the samples descending', done => {
|
it('sorts the samples descending', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&sort=number-desc',
|
url: '/samples?status[]=new&status[]=validated&sort=number-desc',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -207,7 +223,7 @@ describe('/sample', () => {
|
|||||||
it('sorts the samples correctly in combination with paging', done => {
|
it('sorts the samples correctly in combination with paging', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&sort=color-asc&page-size=2&from-id=400000000000000000000006',
|
url: '/samples?status[]=new&status[]=validated&sort=color-asc&page-size=2&from-id=400000000000000000000006',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -220,7 +236,7 @@ describe('/sample', () => {
|
|||||||
it('sorts the samples correctly in combination with going pages backward', done => {
|
it('sorts the samples correctly in combination with going pages backward', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&sort=color-desc&page-size=2&from-id=400000000000000000000004&to-page=-1',
|
url: '/samples?status[]=new&status[]=validated&sort=color-desc&page-size=2&from-id=400000000000000000000004&to-page=-1',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -233,7 +249,7 @@ describe('/sample', () => {
|
|||||||
it('sorts the samples correctly for material keys', done => {
|
it('sorts the samples correctly for material keys', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&sort=material.name-desc',
|
url: '/samples?status[]=new&status[]=validated&sort=material.name-desc',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -247,7 +263,7 @@ describe('/sample', () => {
|
|||||||
it('adds the status if specified', done => {
|
it('adds the status if specified', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=status',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=status',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -260,7 +276,7 @@ describe('/sample', () => {
|
|||||||
it('adds the specified measurements', done => {
|
it('adds the specified measurements', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=measurements.kf',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=measurements.kf',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -273,7 +289,7 @@ describe('/sample', () => {
|
|||||||
it('multiplies the sample information for each spectrum', done => {
|
it('multiplies the sample information for each spectrum', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=measurements.spectrum.dpt',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=measurements.spectrum.dpt',
|
||||||
auth: {basic: 'admin'},
|
auth: {basic: 'admin'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -287,7 +303,7 @@ describe('/sample', () => {
|
|||||||
it('filters a sample property', done => { // TODO: implement filters
|
it('filters a sample property', done => { // TODO: implement filters
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=type&filters[]=%7B%22mode%22%3A%22eq%22%2C%22field%22%3A%22type%22%2C%22values%22%3A%5B%22part%22%5D%7D',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=type&filters[]=%7B%22mode%22%3A%22eq%22%2C%22field%22%3A%22type%22%2C%22values%22%3A%5B%22part%22%5D%7D',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -303,7 +319,7 @@ describe('/sample', () => {
|
|||||||
it('filters a material property', done => {
|
it('filters a material property', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=material.name&filters[]=%7B%22mode%22%3A%22in%22%2C%22field%22%3A%22material.name%22%2C%22values%22%3A%5B%22Schulamid%2066%20GF%2025%20H%22%2C%22Stanyl%20TW%20200%20F8%22%5D%7D',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=material.name&filters[]=%7B%22mode%22%3A%22in%22%2C%22field%22%3A%22material.name%22%2C%22values%22%3A%5B%22Schulamid%2066%20GF%2025%20H%22%2C%22Stanyl%20TW%20200%20F8%22%5D%7D',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -319,7 +335,7 @@ describe('/sample', () => {
|
|||||||
it('filters by measurement value', done => {
|
it('filters by measurement value', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=material.name&fields[]=measurements.kf.weight%20%25&filters[]=%7B%22mode%22%3A%22gt%22%2C%22field%22%3A%22measurements.kf.weight%20%25%22%2C%22values%22%3A%5B0.5%5D%7D',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=material.name&fields[]=measurements.kf.weight%20%25&filters[]=%7B%22mode%22%3A%22gt%22%2C%22field%22%3A%22measurements.kf.weight%20%25%22%2C%22values%22%3A%5B0.5%5D%7D',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -335,7 +351,7 @@ describe('/sample', () => {
|
|||||||
it('filters by measurement value not in the fields', done => {
|
it('filters by measurement value not in the fields', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=material.name&filters[]=%7B%22mode%22%3A%22gt%22%2C%22field%22%3A%22measurements.kf.weight%20%25%22%2C%22values%22%3A%5B0.5%5D%7D',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=material.name&filters[]=%7B%22mode%22%3A%22gt%22%2C%22field%22%3A%22measurements.kf.weight%20%25%22%2C%22values%22%3A%5B0.5%5D%7D',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -349,7 +365,7 @@ describe('/sample', () => {
|
|||||||
it('filters by a measurement properties property', done => {
|
it('filters by a measurement properties property', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=material.name&fields[]=material.properties.glass_fiber&filters[]=%7B%22mode%22%3A%22eq%22%2C%22field%22%3A%22material.properties.glass_fiber%22%2C%22values%22%3A%5B%2225%22%5D%7D',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=material.name&fields[]=material.properties.glass_fiber&filters[]=%7B%22mode%22%3A%22eq%22%2C%22field%22%3A%22material.properties.glass_fiber%22%2C%22values%22%3A%5B%2225%22%5D%7D',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -364,7 +380,7 @@ describe('/sample', () => {
|
|||||||
it('filters and sorts by a measurement properties property', done => {
|
it('filters and sorts by a measurement properties property', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&sort=material.properties.glass_fiber-desc&fields[]=number&fields[]=material.name&fields[]=material.properties.glass_fiber&filters[]=%7B%22mode%22%3A%22eq%22%2C%22field%22%3A%22material.properties.glass_fiber%22%2C%22values%22%3A%5B%2225%22%5D%7D',
|
url: '/samples?status[]=new&status[]=validated&sort=material.properties.glass_fiber-desc&fields[]=number&fields[]=material.name&fields[]=material.properties.glass_fiber&filters[]=%7B%22mode%22%3A%22eq%22%2C%22field%22%3A%22material.properties.glass_fiber%22%2C%22values%22%3A%5B%2225%22%5D%7D',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -381,7 +397,7 @@ describe('/sample', () => {
|
|||||||
it('filters multiple properties', done => {
|
it('filters multiple properties', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=batch&filters[]=%7B%22mode%22%3A%22lte%22%2C%22field%22%3A%22number%22%2C%22values%22%3A%5B%22Rng33%22%5D%7D&filters[]=%7B%22mode%22%3A%22nin%22%2C%22field%22%3A%22batch%22%2C%22values%22%3A%5B%221704-005%22%5D%7D',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=batch&filters[]=%7B%22mode%22%3A%22lte%22%2C%22field%22%3A%22number%22%2C%22values%22%3A%5B%22Rng33%22%5D%7D&filters[]=%7B%22mode%22%3A%22nin%22%2C%22field%22%3A%22batch%22%2C%22values%22%3A%5B%221704-005%22%5D%7D',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -394,7 +410,7 @@ describe('/sample', () => {
|
|||||||
it('rejects returning spectral data for a write user', done => {
|
it('rejects returning spectral data for a write user', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=measurements.spectrum.dpt',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=measurements.spectrum.dpt',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 403
|
httpStatus: 403
|
||||||
});
|
});
|
||||||
@ -402,7 +418,7 @@ describe('/sample', () => {
|
|||||||
it('rejects an invalid JSON string as a filters parameter', done => {
|
it('rejects an invalid JSON string as a filters parameter', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=material.glass_fiber&fields[]=batch&filters[]=xx',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=material.glass_fiber&fields[]=batch&filters[]=xx',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 400,
|
httpStatus: 400,
|
||||||
res: {status: 'Invalid body format', details: 'Invalid JSON string for filter parameter'}
|
res: {status: 'Invalid body format', details: 'Invalid JSON string for filter parameter'}
|
||||||
@ -411,7 +427,7 @@ describe('/sample', () => {
|
|||||||
it('rejects an invalid filter mode', done => {
|
it('rejects an invalid filter mode', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=batch&filters[]=%7B%22mode%22%3A%22xx%22%2C%22field%22%3A%22batch%22%2C%22values%22%3A%5B%221704-005%22%5D%7D',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=batch&filters[]=%7B%22mode%22%3A%22xx%22%2C%22field%22%3A%22batch%22%2C%22values%22%3A%5B%221704-005%22%5D%7D',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 400,
|
httpStatus: 400,
|
||||||
res: {status: 'Invalid body format', details: '"filters[0].mode" must be one of [eq, ne, lt, lte, gt, gte, in, nin, stringin]'}
|
res: {status: 'Invalid body format', details: '"filters[0].mode" must be one of [eq, ne, lt, lte, gt, gte, in, nin, stringin]'}
|
||||||
@ -420,7 +436,7 @@ describe('/sample', () => {
|
|||||||
it('rejects an filter field not existing', done => {
|
it('rejects an filter field not existing', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=material.glass_fiber&fields[]=batch&filters[]=%7B%22mode%22%3A%22eq%22%2C%22field%22%3A%22xx%22%2C%22values%22%3A%5B%221704-005%22%5D%7D',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=material.glass_fiber&fields[]=batch&filters[]=%7B%22mode%22%3A%22eq%22%2C%22field%22%3A%22xx%22%2C%22values%22%3A%5B%221704-005%22%5D%7D',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 400,
|
httpStatus: 400,
|
||||||
res: {status: 'Invalid body format', details: 'Invalid JSON string for filter parameter'}
|
res: {status: 'Invalid body format', details: 'Invalid JSON string for filter parameter'}
|
||||||
@ -429,7 +445,7 @@ describe('/sample', () => {
|
|||||||
it('rejects unknown measurement names', done => {
|
it('rejects unknown measurement names', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=measurements.xx',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=measurements.xx',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 400,
|
httpStatus: 400,
|
||||||
res: {status: 'Invalid body format', details: 'Measurement key not found'}
|
res: {status: 'Invalid body format', details: 'Measurement key not found'}
|
||||||
@ -438,7 +454,7 @@ describe('/sample', () => {
|
|||||||
it('returns a correct csv file if specified', done => {
|
it('returns a correct csv file if specified', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&page-size=2&csv=true',
|
url: '/samples?status[]=new&status[]=validated&page-size=2&csv=true',
|
||||||
contentType: /text\/csv/,
|
contentType: /text\/csv/,
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
@ -453,7 +469,7 @@ describe('/sample', () => {
|
|||||||
it('returns only the fields specified', done => {
|
it('returns only the fields specified', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&page-size=1&fields[]=number&fields[]=condition&fields[]=color&fields[]=material.name&fields[]=material.supplier',
|
url: '/samples?status[]=new&status[]=validated&page-size=1&fields[]=number&fields[]=condition&fields[]=color&fields[]=material.name&fields[]=material.supplier',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200,
|
httpStatus: 200,
|
||||||
res: [{number: '1', condition: {material: 'copper', weeks: 3, condition_template: '200000000000000000000001'}, color: 'black', material: {name: 'Schulamid 66 GF 25 H', supplier: 'Schulmann'}}]
|
res: [{number: '1', condition: {material: 'copper', weeks: 3, condition_template: '200000000000000000000001'}, color: 'black', material: {name: 'Schulamid 66 GF 25 H', supplier: 'Schulmann'}}]
|
||||||
@ -462,7 +478,7 @@ describe('/sample', () => {
|
|||||||
it('returns specified material properties fields', done => {
|
it('returns specified material properties fields', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&fields[]=number&fields[]=material.properties.glass_fiber&fields[]=material.name',
|
url: '/samples?status[]=new&status[]=validated&fields[]=number&fields[]=material.properties.glass_fiber&fields[]=material.name',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 200
|
httpStatus: 200
|
||||||
}).end((err, res) => {
|
}).end((err, res) => {
|
||||||
@ -490,7 +506,7 @@ describe('/sample', () => {
|
|||||||
it('rejects an invalid fields parameter', done => {
|
it('rejects an invalid fields parameter', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&page-size=1&fields=number',
|
url: '/samples?status[]=new&status[]=validated&page-size=1&fields=number',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 400,
|
httpStatus: 400,
|
||||||
res: {status: 'Invalid body format', details: '"fields" must be an array'}
|
res: {status: 'Invalid body format', details: '"fields" must be an array'}
|
||||||
@ -499,7 +515,7 @@ describe('/sample', () => {
|
|||||||
it('rejects an unknown field name', done => {
|
it('rejects an unknown field name', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=all&page-size=1&fields[]=xx',
|
url: '/samples?status[]=new&status[]=validated&page-size=1&fields[]=xx',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 400,
|
httpStatus: 400,
|
||||||
res: {status: 'Invalid body format', details: 'Invalid field name'}
|
res: {status: 'Invalid body format', details: 'Invalid field name'}
|
||||||
@ -535,10 +551,10 @@ describe('/sample', () => {
|
|||||||
it('rejects an invalid state name', done => {
|
it('rejects an invalid state name', done => {
|
||||||
TestHelper.request(server, done, {
|
TestHelper.request(server, done, {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/samples?status=xxx',
|
url: '/samples?status[]=xxx',
|
||||||
auth: {basic: 'janedoe'},
|
auth: {basic: 'janedoe'},
|
||||||
httpStatus: 400,
|
httpStatus: 400,
|
||||||
res: {status: 'Invalid body format', details: '"status" must be one of [validated, new, all]'}
|
res: {status: 'Invalid body format', details: '"status[0]" must be one of [validated, new]'}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('rejects unauthorized requests', done => {
|
it('rejects unauthorized requests', done => {
|
||||||
|
@ -31,7 +31,7 @@ const router = express.Router();
|
|||||||
router.get('/samples', async (req, res, next) => {
|
router.get('/samples', async (req, res, next) => {
|
||||||
if (!req.auth(res, ['read', 'write', 'dev', 'admin'], 'all')) return;
|
if (!req.auth(res, ['read', 'write', 'dev', 'admin'], 'all')) return;
|
||||||
|
|
||||||
const {error, value: filters} = SampleValidate.query(req.query);
|
const {error, value: filters} = SampleValidate.query(req.query, ['dev', 'admin'].indexOf(req.authDetails.level) >= 0);
|
||||||
if (error) return res400(error, res);
|
if (error) return res400(error, res);
|
||||||
|
|
||||||
// spectral data not allowed for read/write users
|
// spectral data not allowed for read/write users
|
||||||
@ -460,7 +460,6 @@ router.put('/sample/' + IdValidate.parameter(), (req, res, next) => {
|
|||||||
if (!req.auth(res, ['write', 'dev', 'admin'], 'basic')) return;
|
if (!req.auth(res, ['write', 'dev', 'admin'], 'basic')) return;
|
||||||
|
|
||||||
const {error, value: sample} = SampleValidate.input(req.body, 'change');
|
const {error, value: sample} = SampleValidate.input(req.body, 'change');
|
||||||
console.log(error);
|
|
||||||
if (error) return res400(error, res);
|
if (error) return res400(error, res);
|
||||||
|
|
||||||
SampleModel.findById(req.params.id).lean().exec(async (err, sampleData: any) => { // check if id exists
|
SampleModel.findById(req.params.id).lean().exec(async (err, sampleData: any) => { // check if id exists
|
||||||
@ -824,17 +823,7 @@ function sortQuery(filters, sortKeys, sortStartValue) { // sortKeys = ['primary
|
|||||||
}
|
}
|
||||||
|
|
||||||
function statusQuery(filters, field) {
|
function statusQuery(filters, field) {
|
||||||
if (filters.hasOwnProperty('status')) {
|
return {$or: filters.status.map(e => ({[field]: e}))};
|
||||||
if(filters.status === 'all') {
|
|
||||||
return {$or: [{[field]: 'validated'}, {[field]: 'new'}]};
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return {[field]: filters.status};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else { // default
|
|
||||||
return {[field]: 'validated'};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function addFilterQueries (queryPtr, filters) { // returns array of match queries from given filters
|
function addFilterQueries (queryPtr, filters) { // returns array of match queries from given filters
|
||||||
|
@ -168,11 +168,10 @@ export default class SampleValidate {
|
|||||||
joiObject[param] = Joi.any();
|
joiObject[param] = Joi.any();
|
||||||
});
|
});
|
||||||
const {value, error} = Joi.object(joiObject).validate(data, {stripUnknown: true});
|
const {value, error} = Joi.object(joiObject).validate(data, {stripUnknown: true});
|
||||||
console.log(error);
|
|
||||||
return error !== undefined? null : value;
|
return error !== undefined? null : value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static query (data) {
|
static query (data, dev = false) {
|
||||||
if (data.filters && data.filters.length) {
|
if (data.filters && data.filters.length) {
|
||||||
const filterValidation = Joi.array().items(Joi.string()).validate(data.filters);
|
const filterValidation = Joi.array().items(Joi.string()).validate(data.filters);
|
||||||
if (filterValidation.error) return filterValidation;
|
if (filterValidation.error) return filterValidation;
|
||||||
@ -216,8 +215,12 @@ export default class SampleValidate {
|
|||||||
return {error: {details: [{message: 'Invalid JSON string for filter parameter'}]}, value: null}
|
return {error: {details: [{message: 'Invalid JSON string for filter parameter'}]}, value: null}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const acceptedStatuses = ['validated', 'new'];
|
||||||
|
if (dev) { // dev and admin can also access deleted samples
|
||||||
|
acceptedStatuses.push('deleted')
|
||||||
|
}
|
||||||
return Joi.object({
|
return Joi.object({
|
||||||
status: Joi.string().valid('validated', 'new', 'all'),
|
status: Joi.array().items(Joi.string().valid(...acceptedStatuses)).default(['validated']),
|
||||||
'from-id': IdValidate.get(),
|
'from-id': IdValidate.get(),
|
||||||
'to-page': Joi.number().integer(),
|
'to-page': Joi.number().integer(),
|
||||||
'page-size': Joi.number().integer().min(1),
|
'page-size': Joi.number().integer().min(1),
|
||||||
|
@ -82,7 +82,6 @@ export default class UserValidate { // validate input for user
|
|||||||
location: this.user.location,
|
location: this.user.location,
|
||||||
devices: this.user.devices
|
devices: this.user.devices
|
||||||
}).validate(data, {stripUnknown: true});
|
}).validate(data, {stripUnknown: true});
|
||||||
console.log(data);
|
|
||||||
return error !== undefined? null : value;
|
return error !== undefined? null : value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user