Skip to content

Commit fe91261

Browse files
author
James Vidler
authored
Merge pull request #24 from agility/additional-unittests
Additional unittests and Filter/Sort functionality.
2 parents 7fcf761 + fc509d8 commit fe91261

File tree

6 files changed

+227
-37
lines changed

6 files changed

+227
-37
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ logs
44
npm-debug.log*
55
yarn-debug.log*
66
yarn-error.log*
7+
.idea
78

89
# Runtime data
910
pids

package-lock.json

Lines changed: 34 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@agility/content-fetch",
3-
"version": "0.4.4",
3+
"version": "0.4.5",
44
"description": "JavaScript library for the Agility Fetch API (node and browser)",
55
"main": "dist/agility-content-fetch.node.js",
66
"scripts": {
@@ -24,7 +24,7 @@
2424
"@babel/node": "^7.2.2",
2525
"@babel/preset-env": "^7.3.4",
2626
"@babel/register": "^7.0.0",
27-
"agility-jsdoc-template": "1.0.0",
27+
"agility-jsdoc-template": "1.0.3",
2828
"babel-loader": "^8.0.5",
2929
"chai": "^4.2.0",
3030
"jsdoc": "^3.5.5",

src/methods/getContentList.js

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { buildRequestUrlPath, buildAuthHeader } from '../utils'
1+
import {buildPathUrl, buildRequestUrlPath, buildAuthHeader } from '../utils'
22

33
/**
44
* Retrieves a list of content items by reference name.
@@ -8,9 +8,10 @@ import { buildRequestUrlPath, buildAuthHeader } from '../utils'
88
* @param {string} requestParams.languageCode - The language code of the content you want to retrieve.
99
* @param {number} [requestParams.take] - The maximum number of items to retrieve in this request. Default is **10**. Maximum allowed is **50**.
1010
* @param {number} [requestParams.skip] - The number of items to skip from the list. Default is **0**. Used for implementing pagination.
11-
* @param {number} [requestParams.sort] - The field to sort the results by. Example *fields.title* or *properties.created*.
12-
* @param {number} [requestParams.direction] - The direction to sort the results by. Default is **asc**. Valid values are **asc**, **desc**.
13-
* @param {string} [requestParams.filter] - *Note: This parameter has not been implemented, but will be in a future version.*
11+
* @param {string} [requestParams.sort] - The field to sort the results by. Example *fields.title* or *properties.created*.
12+
* @param {string} [requestParams.direction] - The direction to sort the results by. Default is **asc**. Valid values are **asc**, **desc**.
13+
* @param {Array} [requestParams.filters] - The collection of filters to filter the results by. A filter object contains properties called **property**, **operator**, **value**. Operators can be **eq** Equal To, **ne** Not Equal To, **gt** Greater Than, **gte** Greater Than or Equal To, **lt * @param {Array} [requestParams.filters] - The collection of filters to filter the results by. A filter object contains properties called **property**, **operator**, **value**. Operators can be **eq** Equal To, **ne** Not Equal To, **gt** Greater Than, **gte** Greater Than or Equal To, **lt** Less Than, **lte** Less Than or Equal To, **like** Like (string only)
14+
* @param (string) [requestParams.filtersLogicOperator] - The logic operator to combine multiple filters. **AND** (default), **OR**.
1415
* @returns {Promise<AgilityFetch.Types.ContentList>} - Returns a list of content items.
1516
* @example
1617
*
@@ -43,7 +44,7 @@ function getContentList(requestParams) {
4344
validateRequestParams(requestParams);
4445

4546
const req = {
46-
url: `/list/${requestParams.referenceName}`,
47+
url: buildPathUrl("list", requestParams.referenceName, requestParams.sort, requestParams.direction, requestParams.filters, requestParams.filtersLogicOperator),
4748
method: 'get',
4849
baseURL: buildRequestUrlPath(this.config, requestParams.languageCode),
4950
headers: buildAuthHeader(this.config),
@@ -75,12 +76,30 @@ function validateRequestParams(requestParams) {
7576
} else if(requestParams.skip && !isNaN(requestParams.skip) && requestParams.skip < 0) {
7677
//skip parameter must be a number greater than 0
7778
throw new TypeError('Skip parameter must be 0 or greater');
78-
} else if (requestParams.direction && (requestParams.direction !== 'desc' || requestParams.direction !== 'asc')){
79+
} else if (requestParams.direction && (requestParams.direction !== 'desc' && requestParams.direction !== 'asc')){
7980
//check if the request direction parameter is valid
8081
throw new TypeError('Direction parameter must have a value of "asc" or "desc"');
81-
} else {
82-
return;
82+
} else if (requestParams.filters && requestParams.filters.length > 0){
83+
//check if the request direction parameter is valid
84+
for(let i = 0; i < requestParams.filters.length; i++) {
85+
let filter = requestParams.filters[i];
86+
if (!filter.hasOwnProperty('property')) {
87+
throw new TypeError(JSON.stringify(filter) + " does not contain 'property'.");
88+
} else if (!filter.hasOwnProperty('operator')) {
89+
throw new TypeError(JSON.stringify(filter) + " does not contain 'operator'.");
90+
} else if (!filter.hasOwnProperty('value')) {
91+
throw new TypeError(JSON.stringify(filter) + " does not contain 'value'.");
92+
}
93+
94+
if (['eq','ne','gt','gte','lt','lte','like'].indexOf(filter.operator.toLowerCase()) < 0) {
95+
throw new TypeError(JSON.stringify(filter) + "Operator must be one of ['eq','ne','gt','gte','lt','lte','like'].");
96+
}
97+
}
98+
} else if (requestParams.filtersLogicOperator && requestParams.filtersLogicOperator.toLowerCase() !== 'and' && requestParams.filtersLogicOperator.toLowerCase() !== 'or') {
99+
throw new TypeError('FiltersLogicOperator parameter must have a value of "AND" or "OR"');
83100
}
101+
102+
return true;
84103
}
85104

86105
export default getContentList;

src/utils.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,29 @@ function buildRequestUrlPath(config, languageCode) {
1212
return urlPath;
1313
}
1414

15+
function buildPathUrl(contentType, referenceName, sort, direction, filters, filtersLogicOperator) {
16+
let url = `/${contentType}/${referenceName}?`;
17+
filtersLogicOperator = filtersLogicOperator ? ` ${filtersLogicOperator} ` : ' AND ';
18+
19+
if (sort) {
20+
url += `sort=${sort}&`;
21+
22+
if (direction) {
23+
url += `direction=${direction}&`;
24+
}
25+
}
26+
27+
if (filters && filters.length > 0) {
28+
url += 'filter='
29+
for (let i = 0; i < filters.length; i++) {
30+
let filter = filters[i];
31+
url += `${filter.property}[${filter.operator}]${filter.value}` + (i < filters.length - 1 ? filtersLogicOperator : '');
32+
}
33+
url += '&';
34+
}
35+
return url;
36+
}
37+
1538
function buildAuthHeader(config) {
1639
let defaultAuthHeaders = {
1740
'APIKey': config.accessToken
@@ -37,6 +60,7 @@ function isHttps(url) {
3760

3861

3962
export {
63+
buildPathUrl,
4064
buildAuthHeader,
4165
buildRequestUrlPath,
4266
isHttps

0 commit comments

Comments
 (0)