From da68e196884f570be7e76e61a936d7369c1f1d6e Mon Sep 17 00:00:00 2001 From: SylvainLap Date: Mon, 1 Feb 2016 08:43:17 +0100 Subject: [PATCH 1/3] fix function names --- lib/configuration/hooks/blueprints/actions/add.js | 2 +- lib/configuration/hooks/blueprints/actions/findOne.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/configuration/hooks/blueprints/actions/add.js b/lib/configuration/hooks/blueprints/actions/add.js index 82d5339da9..d7254ab74e 100644 --- a/lib/configuration/hooks/blueprints/actions/add.js +++ b/lib/configuration/hooks/blueprints/actions/add.js @@ -15,7 +15,7 @@ const actionUtil = require('../actionUtil'); * Add an entry to a specific parent entry */ -module.exports = function destroy(_ctx) { +module.exports = function add(_ctx) { const deferred = Promise.defer(); // Ensure a model and alias can be deduced from the request. diff --git a/lib/configuration/hooks/blueprints/actions/findOne.js b/lib/configuration/hooks/blueprints/actions/findOne.js index 4009ad2a86..a7999de3ee 100644 --- a/lib/configuration/hooks/blueprints/actions/findOne.js +++ b/lib/configuration/hooks/blueprints/actions/findOne.js @@ -11,7 +11,7 @@ const actionUtil = require('../actionUtil'); * Find a specific entry */ -module.exports = function destroy(_ctx) { +module.exports = function findOne(_ctx) { const deferred = Promise.defer(); // Return the model used. From ab4416c2b2ad6a34ff0d9131ece178a5e2b5611b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Georget?= Date: Tue, 2 Feb 2016 16:15:21 +0100 Subject: [PATCH 2/3] Add select attribute in blueprints --- .../hooks/blueprints/actionUtil.js | 26 ++++++++++++++++++- .../hooks/blueprints/actions/find.js | 2 +- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/configuration/hooks/blueprints/actionUtil.js b/lib/configuration/hooks/blueprints/actionUtil.js index 1fbf8cee95..6f806aaedd 100644 --- a/lib/configuration/hooks/blueprints/actionUtil.js +++ b/lib/configuration/hooks/blueprints/actionUtil.js @@ -21,8 +21,20 @@ module.exports = { */ populateEach: function (query, _ctx, model) { + const selectedAttributes = _.get(this.parseSelect(_ctx), 'select'); let shouldPopulate = strapi.config.blueprints.populate; let aliasFilter = (_ctx.request.query && _ctx.request.query.populate) || (_ctx.request.body && _ctx.request.body.populate); + let associationToPopulate; + + if (!_.isUndefined(selectedAttributes)) { + associationToPopulate = _.remove(_.map(model.associations, function (association) { + return _.includes(selectedAttributes, association.alias) ? association : undefined; + }), function (n) { + return !_.isUndefined(n); + }); + } else { + associationToPopulate = model.associations; + } // Convert the string representation of the filter list to an array. We // need this to provide flexibility in the request param. This way both @@ -34,7 +46,7 @@ module.exports = { aliasFilter = (aliasFilter) ? aliasFilter.split(',') : []; } - return _(model.associations).reduce(function populateEachAssociation(query, association) { + return _(associationToPopulate).reduce(function populateEachAssociation(query, association) { // If an alias filter was provided, override the blueprint config. if (aliasFilter) { @@ -236,5 +248,17 @@ module.exports = { skip = +skip; } return skip; + }, + + /** + * Parse select params. + * + * @param {Object} _ctx + */ + + parseSelect: function (_ctx) { + _ctx.options = _ctx.options || {}; + const select = _ctx.request.query.hasOwnProperty('select') ? _.pick(_ctx.request.query, 'select') : {}; + return select; } }; diff --git a/lib/configuration/hooks/blueprints/actions/find.js b/lib/configuration/hooks/blueprints/actions/find.js index 812bb96560..0a89d09466 100644 --- a/lib/configuration/hooks/blueprints/actions/find.js +++ b/lib/configuration/hooks/blueprints/actions/find.js @@ -23,7 +23,7 @@ module.exports = function find(_ctx) { const Model = actionUtil.parseModel(_ctx); // Init the query. - let query = Model.find() + let query = Model.find(actionUtil.parseSelect(_ctx)) .where(actionUtil.parseCriteria(_ctx)) .limit(actionUtil.parseLimit(_ctx)) .skip(actionUtil.parseSkip(_ctx)) From 53518623e44a4bbe105be72085b599e804972f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Georget?= Date: Tue, 2 Feb 2016 16:31:11 +0100 Subject: [PATCH 3/3] Add select for findOne method --- lib/configuration/hooks/blueprints/actions/findOne.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/configuration/hooks/blueprints/actions/findOne.js b/lib/configuration/hooks/blueprints/actions/findOne.js index a7999de3ee..fde7cc2218 100644 --- a/lib/configuration/hooks/blueprints/actions/findOne.js +++ b/lib/configuration/hooks/blueprints/actions/findOne.js @@ -20,8 +20,14 @@ module.exports = function findOne(_ctx) { // Locate and validate the required `id` parameter. const pk = actionUtil.requirePk(_ctx); + // Build criteria object + const criteria = {}; + criteria[Model.primaryKey] = pk; + + _.merge(criteria, actionUtil.parseSelect(_ctx)); + // Init the query. - let query = Model.findOne(pk); + let query = Model.findOne(criteria); query = actionUtil.populateEach(query, _ctx, Model); query.exec(function found(err, matchingRecord) { if (err) {