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))