97 lines
2.3 KiB
JavaScript
Raw Normal View History

2016-01-26 18:03:52 +01:00
'use strict';
/**
* Module dependencies
*/
// Public node modules.
const _ = require('lodash');
/**
* JSON API helper
*/
module.exports = {
default: {},
/**
* Parse request
*/
parse: function * (ctx, cb) {
switch (ctx.method.toUpperCase()) {
case 'GET':
console.log('GET');
break;
case 'PUT':
case 'POST':
yield this.fetchSchema(ctx, function * (err) {
yield cb(err);
});
break;
case 'DELETE':
console.log('DELETE');
break;
default:
}
},
/**
* Fetch attributes schema
*/
fetchSchema: function * (ctx, cb) {
const attributes = ctx.request.body;
if (!attributes.hasOwnProperty('data')) {
return yield cb({
status: 403,
body: 'Missing `data` member'
});
} else if (!attributes.data.hasOwnProperty('type')) {
return yield cb({
status: 403,
body: 'Missing `type` member'
});
} else if (!strapi.models.hasOwnProperty(attributes.data.type)) {
return yield cb({
status: 403,
body: 'Unknow `type` ' + attributes.data.type
});
}
// Extract required attributes
const requiredAttributes = _.omit(_.mapValues(strapi.models[attributes.data.type].attributes, function (attr) {
return attr.required ? attr : undefined;
}), _.isUndefined);
// Identify missing attributes
const missingAttributes = _.difference(_.keys(requiredAttributes), _.keys(attributes.data.attributes));
if (!_.isEmpty(missingAttributes)) {
return yield cb({
status: 403,
body: 'Missing required attributes (' + missingAttributes.toString() + ')'
});
}
// Identify required relationships
const relationships = _.indexBy(strapi.models[attributes.data.type].associations, 'alias');
// Extract required relationships
const requiredRelationships = _.intersection(_.keys(requiredAttributes), _.keys(relationships));
// Identify missing relationships
const missingRelationships = _.difference(_.keys(requiredRelationships), _.keys(attributes.data.relationships));
if (!_.isEmpty(missingRelationships)) {
return yield cb({
status: 403,
body: 'Missing required relationships (' + missingRelationships.toString() + ')'
});
}
// Looks good
yield cb();
}
2016-01-26 18:03:52 +01:00
};