separated groups and suppliers for material GET
This commit is contained in:
@ -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
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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',
|
||||
|
@ -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
|
||||
});
|
||||
|
@ -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(),
|
||||
|
Reference in New Issue
Block a user