Allow hidden/protected props as an object

Fixes #1646
This commit is contained in:
Raymond Feng 2018-10-27 07:47:46 -07:00
parent 708826cc49
commit 2af2599a7d
3 changed files with 48 additions and 18 deletions

View File

@ -1646,22 +1646,32 @@ function coerceArray(val) {
DataAccessObject._getHiddenProperties = function() {
var settings = this.definition.settings || {};
var result = settings.hiddenProperties || settings.hidden;
var result = settings.hiddenProperties || settings.hidden || [];
if (typeof result === 'string') {
result = [result];
}
result = result || [];
return result;
if (Array.isArray(result)) {
return result;
} else {
// See https://github.com/strongloop/loopback-datasource-juggler/issues/1646
// `ModelBaseClass` normalize the properties to an object such as `{secret: true}`
return Object.keys(result);
}
};
DataAccessObject._getProtectedProperties = function() {
var settings = this.definition.settings || {};
var result = settings.protectedProperties || settings.protected;
var result = settings.protectedProperties || settings.protected || [];
if (typeof result === 'string') {
result = [result];
}
result = result || [];
return result;
if (Array.isArray(result)) {
return result;
} else {
// See https://github.com/strongloop/loopback-datasource-juggler/issues/1646
// `ModelBaseClass` normalize the properties to an object such as `{secret: true}`
return Object.keys(result);
}
};
DataAccessObject._sanitize = function(query, options) {

View File

@ -551,7 +551,7 @@ ModelBaseClass.prototype.toObject = function(onlySchema, removeHidden, removePro
/**
* Checks if property is protected.
* @param {String} propertyName Property name
* @returns {Boolean} true or false if proptected or not.
* @returns {Boolean} true or false if protected or not.
*/
ModelBaseClass.isProtectedProperty = function(propertyName) {
var Model = this;

View File

@ -338,26 +338,46 @@ describe('ModelDefinition class', function() {
describe('hidden properties', function() {
var Child;
beforeEach(givenChildren);
it('should be removed if used in where', function() {
return Child.find({
where: {secret: 'guess'},
}).then(assertHiddenPropertyIsIgnored);
describe('with hidden array', function() {
beforeEach(function() { givenChildren(); });
it('should be removed if used in where', function() {
return Child.find({
where: {secret: 'guess'},
}).then(assertHiddenPropertyIsIgnored);
});
it('should be removed if used in where.and', function() {
return Child.find({
where: {and: [{secret: 'guess'}]},
}).then(assertHiddenPropertyIsIgnored);
});
});
it('should be removed if used in where.and', function() {
return Child.find({
where: {and: [{secret: 'guess'}]},
}).then(assertHiddenPropertyIsIgnored);
describe('with hidden object', function() {
beforeEach(function() { givenChildren({hiddenProperties: {secret: true}}); });
it('should be removed if used in where', function() {
return Child.find({
where: {secret: 'guess'},
}).then(assertHiddenPropertyIsIgnored);
});
it('should be removed if used in where.and', function() {
return Child.find({
where: {and: [{secret: 'guess'}]},
}).then(assertHiddenPropertyIsIgnored);
});
});
/**
* Create two children with a hidden property, one with a matching
* value, the other with a non-matching value
*/
function givenChildren() {
Child = memory.createModel('child', {}, {hidden: ['secret']});
function givenChildren(hiddenProps) {
hiddenProps = hiddenProps || {hidden: ['secret']};
Child = memory.createModel('child', {}, hiddenProps);
return Child.create([{
name: 'childA',
secret: 'secret',