public/util/capiClient.js (83 lines of code) (raw):
import Reqwest from 'reqwest';
import {getStore} from '../util/storeAccessor';
function paramsObjectToQuery (params) {
if (!params) {
return '';
}
return Object.keys(params).map((paramName) => {
return params[paramName] ? paramName + '=' + params[paramName] : false;
}).filter(a => a).join('&');
}
function getCapiUrl() {
const store = getStore();
return store.getState().config.capiUrl + '/search?api-key=' + store.getState().config.capiKey;
}
function getCapiPreviewUrl() {
const store = getStore();
return store.getState().config.capiPreviewUrl + '/search?api-key=' + store.getState().config.capiKey;
}
// Ensure quoted strings are not split up into separate search tokens. For example:
// buildSearch('') === '';
// buildSearch('abc') === 'abc';
// buildSearch('abc def xyz') === 'abc AND def AND xyz';
// buildSearch('abc def') === 'abc AND def';
// buildSearch('"abc def" xyz') === '"abc def" AND xyz';
// buildSearch('"abc def" xyz "beep beep" bloop') === '"abc def" AND xyz AND "beep beep" AND bloop';
function buildSearch(searchString) {
const tokens = [];
let token = '';
let withinQuote = false;
for(const char of searchString) {
if(char === '"') {
withinQuote = !withinQuote;
}
if(withinQuote) {
token += char;
} else {
if(char === ' ') {
if(token != '') {
tokens.push(token);
token = '';
}
} else {
token += char;
}
}
}
// grab the last one
if(token != '') {
tokens.push(token);
}
return tokens.join(' AND ');
}
export function getByTag (tag, params) {
const query = paramsObjectToQuery(params);
const prefixes = {
'ContentType': 'type/',
'Publication': 'publication/',
};
const tagPath = prefixes[tag.type] ? prefixes[tag.type] + tag.slug : tag.path;
return Reqwest({
url: getCapiUrl() + '&tag=' + tagPath + '&' + query,
contentType: 'application/json',
crossOrigin: true,
method: 'get'
});
}
export function searchContent (searchString, params) {
const query = paramsObjectToQuery(params);
const searchQueryString = searchString || '';
return Reqwest({
url: getCapiUrl() + '&q=' + buildSearch(searchQueryString) + '&' + query,
contentType: 'application/json',
crossOrigin: true,
method: 'get'
});
}
export function searchPreviewContent (searchString, byline, params) {
const query = paramsObjectToQuery(params);
const searchQueryString = searchString || '';
const bylineQueryString = byline || '';
return Reqwest({
url: getCapiPreviewUrl()
+ ( searchQueryString ? '&q=' + buildSearch(searchQueryString) : '')
+ ( byline ? '&byline=' + buildSearch(bylineQueryString) : '')
+ '&' + query
+ '&show-fields=isLive,internalComposerCode&order-by=newest',
contentType: 'application/json',
crossOrigin: true,
method: 'get'
});
}