Archived
2

separated groups and suppliers for material GET

This commit is contained in:
VLE2FE
2020-05-28 17:05:23 +02:00
parent c7d25bd7cb
commit 14ba1655ba
13 changed files with 291 additions and 33 deletions

View File

@ -4,7 +4,6 @@ import MaterialModel from '../models/material';
import TestHelper from "../test/helper";
import globals from '../globals';
// TODO: color name must be unique to get color number
// TODO: separate supplier/ material name into own collections
describe('/material', () => {
@ -80,7 +79,7 @@ describe('/material', () => {
});
});
describe('GET /materials/{group}', () => {
describe('GET /materials/{state}', () => {
it('returns all new materials', done => {
TestHelper.request(server, done, {
method: 'get',
@ -767,4 +766,92 @@ describe('/material', () => {
});
});
});
describe('GET /material/groups', () => {
it('returns all groups', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/material/groups',
auth: {basic: 'janedoe'},
httpStatus: 200
}).end((err, res) => {
if (err) return done(err);
const json = require('../test/db.json');
should(res.body).have.lengthOf(json.collections.material_groups.length);
should(res.body[0]).be.eql(json.collections.material_groups[0].name);
should(res.body).matchEach(group => {
should(group).be.type('string');
});
done();
});
});
it('works with an API key', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/material/groups',
auth: {basic: 'janedoe'},
httpStatus: 200
}).end((err, res) => {
if (err) return done(err);
const json = require('../test/db.json');
should(res.body).have.lengthOf(json.collections.material_groups.length);
should(res.body[0]).be.eql(json.collections.material_groups[0].name);
should(res.body).matchEach(group => {
should(group).be.type('string');
});
done();
});
});
it('rejects unauthorized requests', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/material/groups',
httpStatus: 401
});
});
});
describe('GET /material/suppliers', () => {
it('returns all suppliers', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/material/suppliers',
auth: {basic: 'janedoe'},
httpStatus: 200
}).end((err, res) => {
if (err) return done(err);
const json = require('../test/db.json');
should(res.body).have.lengthOf(json.collections.material_suppliers.length);
should(res.body[0]).be.eql(json.collections.material_suppliers[0].name);
should(res.body).matchEach(supplier => {
should(supplier).be.type('string');
});
done();
});
});
it('works with an API key', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/material/suppliers',
auth: {key: 'janedoe'},
httpStatus: 200
}).end((err, res) => {
if (err) return done(err);
const json = require('../test/db.json');
should(res.body).have.lengthOf(json.collections.material_suppliers.length);
should(res.body[0]).be.eql(json.collections.material_suppliers[0].name);
should(res.body).matchEach(supplier => {
should(supplier).be.type('string');
});
done();
});
});
it('rejects unauthorized requests', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/material/suppliers',
httpStatus: 401
});
});
});
});

View File

@ -4,6 +4,8 @@ import _ from 'lodash';
import MaterialValidate from './validate/material';
import MaterialModel from '../models/material'
import SampleModel from '../models/sample';
import MaterialGroupsModel from '../models/material_groups';
import MaterialSuppliersModel from '../models/material_suppliers';
import IdValidate from './validate/id';
import res400 from './validate/res400';
import mongoose from 'mongoose';
@ -16,17 +18,26 @@ const router = express.Router();
router.get('/materials', (req, res, next) => {
if (!req.auth(res, ['read', 'write', 'maintain', 'dev', 'admin'], 'all')) return;
MaterialModel.find({status:globals.status.validated}).lean().exec((err, data) => {
MaterialModel.find({status:globals.status.validated}).populate('group_id').populate('supplier_id').lean().exec((err, data) => {
if (err) return next(err);
console.log(data);
data.forEach((material: any) => { // map group and supplier
material.group = material.group_id.name;
material.supplier = material.supplier_id.name;
});
res.json(_.compact(data.map(e => MaterialValidate.output(e)))); // validate all and filter null values from validation errors
});
});
router.get('/materials/:group(new|deleted)', (req, res, next) => {
router.get('/materials/:state(new|deleted)', (req, res, next) => {
if (!req.auth(res, ['maintain', 'admin'], 'basic')) return;
MaterialModel.find({status: globals.status[req.params.group]}).lean().exec((err, data) => {
MaterialModel.find({status: globals.status[req.params.state]}).populate('group_id').populate('supplier_id').lean().exec((err, data) => {
if (err) return next(err);
data.forEach((material: any) => { // map group and supplier
material.group = material.group_id.name;
material.supplier = material.supplier_id.name;
});
res.json(_.compact(data.map(e => MaterialValidate.output(e)))); // validate all and filter null values from validation errors
});
});
@ -34,12 +45,15 @@ router.get('/materials/:group(new|deleted)', (req, res, next) => {
router.get('/material/' + IdValidate.parameter(), (req, res, next) => {
if (!req.auth(res, ['read', 'write', 'maintain', 'dev', 'admin'], 'all')) return;
MaterialModel.findById(req.params.id).lean().exec((err, data: any) => {
MaterialModel.findById(req.params.id).populate('group_id').populate('supplier_id').lean().exec((err, data: any) => {
if (err) return next(err);
if (!data) {
return res.status(404).json({status: 'Not found'});
}
data.group = data.group_id.name;
data.supplier = data.supplier_id.name;
if (data.status === globals.status.deleted && !req.auth(res, ['maintain', 'admin'], 'all')) return; // deleted materials only available for maintain/admin
res.json(MaterialValidate.output(data));
});
@ -108,7 +122,7 @@ router.put('/material/restore/' + IdValidate.parameter(), (req, res, next) => {
});
});
router.post('/material/new', async (req, res, next) => {
router.post('/material/new', async (req, res, next) => { // TODO: check supplier and group, also for PUT and DELETE
if (!req.auth(res, ['write', 'maintain', 'dev', 'admin'], 'basic')) return;
const {error, value: material} = MaterialValidate.input(req.body, 'new');
@ -123,6 +137,26 @@ router.post('/material/new', async (req, res, next) => {
});
});
router.get('/material/groups', (req, res, next) => {
if (!req.auth(res, ['read', 'write', 'maintain', 'dev', 'admin'], 'all')) return;
MaterialGroupsModel.find().lean().exec((err, data: any) => {
if (err) return next(err);
res.json(_.compact(data.map(e => MaterialValidate.outputGroups(e.name)))); // validate all and filter null values from validation errors
});
});
router.get('/material/suppliers', (req, res, next) => {
if (!req.auth(res, ['read', 'write', 'maintain', 'dev', 'admin'], 'all')) return;
MaterialSuppliersModel.find().lean().exec((err, data: any) => {
if (err) return next(err);
res.json(_.compact(data.map(e => MaterialValidate.outputSuppliers(e.name)))); // validate all and filter null values from validation errors
});
});
module.exports = router;

View File

@ -3,6 +3,7 @@ import MeasurementModel from '../models/measurement';
import TestHelper from "../test/helper";
import globals from '../globals';
// TODO: test unique material names and produced error code
describe('/measurement', () => {
let server;

View File

@ -84,7 +84,7 @@ describe('/sample', () => {
});
});
describe('GET /samples/{group}', () => {
describe('GET /samples/{state}', () => {
it('returns all new samples', done => {
TestHelper.request(server, done, {
method: 'get',

View File

@ -27,10 +27,10 @@ router.get('/samples', (req, res, next) => {
})
});
router.get('/samples/:group(new|deleted)', (req, res, next) => {
router.get('/samples/:state(new|deleted)', (req, res, next) => {
if (!req.auth(res, ['maintain', 'admin'], 'basic')) return;
SampleModel.find({status: globals.status[req.params.group]}).lean().exec((err, data) => {
SampleModel.find({status: globals.status[req.params.state]}).lean().exec((err, data) => {
if (err) return next(err);
res.json(_.compact(data.map(e => SampleValidate.output(e)))); // validate all and filter null values from validation errors
});

View File

@ -83,6 +83,16 @@ export default class MaterialValidate { // validate input for material
return error !== undefined? null : value;
}
static outputGroups (data) {// validate groups output and strip unwanted properties, returns null if not valid
const {value, error} = this.material.group.validate(data, {stripUnknown: true});
return error !== undefined? null : value;
}
static outputSuppliers (data) {// validate suppliers output and strip unwanted properties, returns null if not valid
const {value, error} = this.material.supplier.validate(data, {stripUnknown: true});
return error !== undefined? null : value;
}
static outputV() { // return output validator
return Joi.object({
_id: IdValidate.get(),