diff --git a/src/tests/paramParser.spec.js b/src/tests/paramParser.spec.js index ee225f4165..05a4bf8045 100644 --- a/src/tests/paramParser.spec.js +++ b/src/tests/paramParser.spec.js @@ -44,6 +44,19 @@ describe('Param Parser', () => { }); }); + describe('Include', () => { + it('Include Single', () => { + let parsed = paramParser(Page, {include: 'SomeId'}); + expect(parsed.searchParams).toEqual({_id: 'SomeId'}); + }); + + it('Include Multiple', () => { + let parsed = paramParser(Page, {include: 'SomeId,SomeSecondId'}); + expect(parsed.searchParams) + .toEqual({'$or':[{_id: 'SomeId'},{_id: 'SomeSecondId'}]}); + }); + }) + describe('Pagination / Limits', () => { it('Page number', () => { let parsed = paramParser(Page, {page: '2'}); diff --git a/src/utils/paramParser.js b/src/utils/paramParser.js index 7e552a6de0..fbb2e04b93 100644 --- a/src/utils/paramParser.js +++ b/src/utils/paramParser.js @@ -35,6 +35,17 @@ function convertToBoolean(str) { str === '1'; } +function addSearchParam(query, key, value) { + if (typeof query.searchParams[key] !== 'undefined') { + for (let i in value) { + query.searchParams[key][i] = value[i]; + } + } else { + query.searchParams[key] = value; + } + return query; +} + function parseParam(key, val, model, query) { const lcKey = key; let operator = val.match(/\{(.*)\}/); @@ -52,6 +63,13 @@ function parseParam(key, val, model, query) { const parts = val.split(','); query.sort = {}; query.sort[parts[0]] = parts[1] === 'asc' || parts.length <= 1 ? 1 : parts[1]; + } else if (lcKey === 'include') { + if (val.match(',')) { + let orArray = []; + val.split(',').map(id => orArray.push({_id: id})); + query = addSearchParam(query, '$or', orArray); + } else + query.searchParams['_id'] = val; } else { query = parseSchemaForKey(model.schema, query, '', lcKey, val, operator); } @@ -60,17 +78,7 @@ function parseParam(key, val, model, query) { function parseSchemaForKey(schema, query, keyPrefix, lcKey, val, operator) { let paramType; - const addSearchParam = value => { - const key = keyPrefix + lcKey; - - if (typeof query.searchParams[key] !== 'undefined') { - for (let i in value) { - query.searchParams[key][i] = value[i]; - } - } else { - query.searchParams[key] = value; - } - }; + const key = keyPrefix + lcKey; let matches = lcKey.match(/(.+)\.(.+)/); if (matches) { @@ -97,17 +105,17 @@ function parseSchemaForKey(schema, query, keyPrefix, lcKey, val, operator) { } if (paramType === 'Boolean') { - addSearchParam(convertToBoolean(val)); + addSearchParam(query, key, convertToBoolean(val)); } else if (paramType === 'Number') { if (val.match(/([0-9]+,?)/) && val.match(',')) { if (operator === 'all') { - addSearchParam({$all: val.split(',')}); + addSearchParam(query, key, {$all: val.split(',')}); } else if (operator === 'nin') { - addSearchParam({$nin: val.split(',')}); + addSearchParam(query, key, {$nin: val.split(',')}); } else if (operator === 'mod') { - addSearchParam({$mod: [val.split(',')[0], val.split(',')[1]]}); + addSearchParam(query, key, {$mod: [val.split(',')[0], val.split(',')[1]]}); } else { - addSearchParam({$in: val.split(',')}); + addSearchParam(query, key, {$in: val.split(',')}); } } else if (val.match(/([0-9]+)/)) { if (operator === 'gt' || @@ -117,9 +125,9 @@ function parseSchemaForKey(schema, query, keyPrefix, lcKey, val, operator) { operator === 'ne') { let newParam = {}; newParam['$' + operator] = val; - addSearchParam(newParam); + addSearchParam(query, key, newParam); } else { - addSearchParam(parseInt(val)); + addSearchParam(query, key, parseInt(val)); } } } else if (paramType === 'String') { @@ -127,11 +135,11 @@ function parseSchemaForKey(schema, query, keyPrefix, lcKey, val, operator) { const options = val.split(',').map(str => new RegExp(str, 'i')); if (operator === 'all') { - addSearchParam({$all: options}); + addSearchParam(query, key, {$all: options}); } else if (operator === 'nin') { - addSearchParam({$nin: options}); + addSearchParam(query, key, {$nin: options}); } else { - addSearchParam({$in: options}); + addSearchParam(query, key, {$in: options}); } } else if (val.match(/([0-9]+)/)) { if (operator === 'gt' || @@ -140,22 +148,22 @@ function parseSchemaForKey(schema, query, keyPrefix, lcKey, val, operator) { operator === 'lte') { let newParam = {}; newParam['$' + operator] = val; - addSearchParam(newParam); + addSearchParam(query, key, newParam); } else { - addSearchParam(val); + addSearchParam(query, key, val); } } else if (operator === 'ne' || operator === 'not') { const neregex = new RegExp(val, 'i'); - addSearchParam({'$not': neregex}); + addSearchParam(query, key, {'$not': neregex}); } else if (operator === 'like') { - addSearchParam({$regex: val, $options: '-i'}); + addSearchParam(query, key, {$regex: val, $options: '-i'}); } else { - addSearchParam(val); + addSearchParam(query, key, val); } } else if (paramType === 'ObjectId') { - addSearchParam(val); + addSearchParam(query, key, val); } else if (paramType === 'Array') { - addSearchParam(val); + addSearchParam(query, key, val); } return query; }