diff --git a/src/server/index.js b/src/server/index.js index 049489bc09fa187cab5aebdadb7978d87625ce96..0d503a5176343f7570467745c07cf399bbdd6395 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -17,61 +17,73 @@ app.use(function(req, res, next) { next(); }); -app.get(`${apiPath}/:resultClass/paginated`, (req, res, next) => { - return getPaginatedResults({ - resultClass: req.params.resultClass, - page: parseInt(req.query.page) || null, - pagesize: parseInt(req.query.pagesize) || null, - uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), - spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters), - sortBy: req.query.sortBy || null, - sortDirection: req.query.sortDirection || null - }).then(data => { +// https://medium.com/@Abazhenov/using-async-await-in-express-with-node-8-b8af872c0016 +app.get(`${apiPath}/:resultClass/paginated`, async (req, res, next) => { + try { + const data = await getPaginatedResults({ + resultClass: req.params.resultClass, + page: parseInt(req.query.page) || null, + pagesize: parseInt(req.query.pagesize) || null, + uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), + spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters), + sortBy: req.query.sortBy || null, + sortDirection: req.query.sortDirection || null + }); res.json(data); - }).catch(next); + } catch(error) { + next(error); + } }); -app.get(`${apiPath}/:resultClass/all`, (req, res, next) => { - return getAllResults({ - resultClass: req.params.resultClass, - facetClass: req.query.facetClass || null, - uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), - spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters), - variant: req.query.variant || null, - }).then(data => { +app.get(`${apiPath}/:resultClass/all`, async (req, res, next) => { + try { + const data = await getAllResults({ + resultClass: req.params.resultClass, + facetClass: req.query.facetClass || null, + uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), + spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters), + variant: req.query.variant || null, + }); res.json({ resultCount: data.count, results: data }); - }).catch(next); + } catch(error) { + next(error); + } }); -app.get(`${apiPath}/:resultClass/instance/:uri`, (req, res, next) => { - return getByURI({ - resultClass: req.params.resultClass, - facetClass: req.query.facetClass || null, - uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), - spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters), - variant: req.query.variant || null, - uri: req.params.uri - }) - .then(data => { - res.json(data[0]); - }).catch(next); +app.get(`${apiPath}/:resultClass/instance/:uri`, async (req, res, next) => { + try { + const data = await getByURI({ + resultClass: req.params.resultClass, + facetClass: req.query.facetClass || null, + uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), + spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters), + variant: req.query.variant || null, + uri: req.params.uri + }); + // there is always one object in the 'data' array + res.json(data[0]); + } catch(error) { + next(error); + } }); -app.get(`${apiPath}/:facetClass/facet/:id`, (req, res, next) => { - return getFacet({ - facetClass: req.params.facetClass, - facetID: req.params.id, - sortBy: req.query.sortBy, - sortDirection: req.query.sortDirection, - uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), - spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters) - }) - .then(data => { - res.json(data); - }).catch(next); +app.get(`${apiPath}/:facetClass/facet/:id`, async (req, res, next) => { + try { + const data = await getFacet({ + facetClass: req.params.facetClass, + facetID: req.params.id, + sortBy: req.query.sortBy, + sortDirection: req.query.sortDirection, + uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), + spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters) + }); + res.json(data); + } catch(error) { + next(error); + } }); /* Routes are matched to a url in order of their definition diff --git a/src/server/sparql/FacetResults.js b/src/server/sparql/FacetResults.js index 99e17b4d80cbe410d602c6cce22e13227764cb08..2eeb45348b9d42f50508ede73990c6f2b293f5b4 100644 --- a/src/server/sparql/FacetResults.js +++ b/src/server/sparql/FacetResults.js @@ -1,4 +1,4 @@ -import SparqlSearchEngine from './SparqlSearchEngine'; +import { runSelectQuery } from './SparqlApi'; import { prefixes } from './SparqlQueriesPrefixes'; import { endpoint, countQuery, facetResultSetQuery } from './SparqlQueriesGeneral'; import { manuscriptProperties, productionPlacesQuery, migrationsQuery } from './SparqlQueriesManuscripts'; @@ -11,9 +11,7 @@ import { mapCount } from './Mappers'; import { makeObjectList } from './SparqlObjectMapper'; import { generateFilter } from './Filters'; -const sparqlSearchEngine = new SparqlSearchEngine(); - -export const getPaginatedResults = ({ +export const getPaginatedResults = async ({ resultClass, page, pagesize, @@ -22,22 +20,34 @@ export const getPaginatedResults = ({ sortBy, sortDirection }) => { - return Promise.all([ + const [ resultCount, paginatedData ] = await Promise.all([ getResultCount(resultClass, uriFilters, spatialFilters), getPaginatedData({ resultClass, page, pagesize, uriFilters, spatialFilters, sortBy, sortDirection }), - ]) - .then(data => { - return { - resultCount: data[0].count, - pagesize: pagesize, - page: page, - results: data[1] - }; - }); + ]); + return { + resultCount: resultCount, + pagesize: pagesize, + page: page, + results: paginatedData + }; }; + // return Promise.all([ + // getResultCount(resultClass, uriFilters, spatialFilters), + // getPaginatedData({ resultClass, page, pagesize, uriFilters, spatialFilters, sortBy, sortDirection }), + // ]) + // .then(data => { + // return { + // resultCount: data[0].count, + // pagesize: pagesize, + // page: page, + // results: data[1] + // }; + // }); + + export const getAllResults = ({ - resultClass, + resultClass, // TODO: handle other classes than manuscripts facetClass, uriFilters, spatialFilters, @@ -73,7 +83,7 @@ export const getAllResults = ({ // if (variant == 'productionPlaces') { // console.log(prefixes + q) // } - return sparqlSearchEngine.doSearch(prefixes + q, endpoint, makeObjectList); + return runSelectQuery(prefixes + q, endpoint, makeObjectList); }; const getResultCount = (resultClass, uriFilters, spatialFilters) => { @@ -91,7 +101,7 @@ const getResultCount = (resultClass, uriFilters, spatialFilters) => { facetID: null })); } - return sparqlSearchEngine.doSearch(prefixes + q, endpoint, mapCount); + return runSelectQuery(prefixes + q, endpoint, mapCount); }; const getPaginatedData = ({ @@ -142,7 +152,7 @@ const getPaginatedData = ({ } q = q.replace('<RESULT_SET_PROPERTIES>', resultSetProperties); // console.log(prefixes + q) - return sparqlSearchEngine.doSearch(prefixes + q, endpoint, makeObjectList); + return runSelectQuery(prefixes + q, endpoint, makeObjectList); }; export const getByURI = ({ @@ -173,5 +183,5 @@ export const getByURI = ({ // if (variant === 'productionPlaces') { // console.log(prefixes + q) // } - return sparqlSearchEngine.doSearch(prefixes + q, endpoint, makeObjectList); + return runSelectQuery(prefixes + q, endpoint, makeObjectList); }; diff --git a/src/server/sparql/FacetValues.js b/src/server/sparql/FacetValues.js index ba62438f35dd85ddfeeb3bf90e65af651205b1ae..a380dadb4cc03d36310e0096467f58719f6dfeab 100644 --- a/src/server/sparql/FacetValues.js +++ b/src/server/sparql/FacetValues.js @@ -1,5 +1,5 @@ import { has } from 'lodash'; -import SparqlSearchEngine from './SparqlSearchEngine'; +import { runSelectQuery } from './SparqlApi'; import { endpoint, facetValuesQuery } from './SparqlQueriesGeneral'; import { prefixes } from './SparqlQueriesPrefixes'; import { facetConfigs } from './FacetConfigs'; @@ -9,8 +9,6 @@ import { mapHierarchicalFacet, } from './Mappers'; -const sparqlSearchEngine = new SparqlSearchEngine(); - export const getFacet = ({ facetClass, facetID, @@ -77,5 +75,5 @@ export const getFacet = ({ // //console.log(uriFilters) // console.log(prefixes + q) // } - return sparqlSearchEngine.doSearch(prefixes + q, endpoint, mapper); + return runSelectQuery(prefixes + q, endpoint, mapper); }; diff --git a/src/server/sparql/Mappers.js b/src/server/sparql/Mappers.js index b944a7c78cb9a2ff9f8b298451ed6e1ff4452240..6f88a5e5cb1ea1a59f6dd4d003637ee6292e5945 100644 --- a/src/server/sparql/Mappers.js +++ b/src/server/sparql/Mappers.js @@ -18,10 +18,8 @@ export const mapPlaces = (sparqlBindings) => { return results; }; -export const mapCount = (sparqlBindings) => { - return { - count: sparqlBindings[0].count.value - }; +export const mapCount = sparqlBindings => { + return sparqlBindings[0].count.value; }; export const mapFacet = sparqlBindings => { diff --git a/src/server/sparql/SparqlApi.js b/src/server/sparql/SparqlApi.js index 920ee226ea368c765e72b51fa95d64249b84b598..f0e21425017410e499c2131e9c0c34614dfdac25 100644 --- a/src/server/sparql/SparqlApi.js +++ b/src/server/sparql/SparqlApi.js @@ -1,64 +1,41 @@ -//import fetch from 'node-fetch'; import axios from 'axios'; -// const { URLSearchParams } = require('url'); +import querystring from 'querystring'; const defaultSelectHeaders = { 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/sparql-results+json; charset=utf-8' }; -const defaultConstructHeaders = { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'text/turtle' -}; - -class SparqlApi { - - constructor({ endpoint }) { - this.endpoint = endpoint; - } +// const defaultConstructHeaders = { +// 'Content-Type': 'application/x-www-form-urlencoded', +// 'Accept': 'text/turtle' +// }; - // query(query, { headers }) { - // return new Promise((resolve, reject) => { - // const params = new URLSearchParams(); - // params.append('query', query); - // fetch(this.endpoint, { - // method: 'post', - // body: params, - // headers: headers, - // }) - // .then(res => { - // if (res.ok) { // res.status >= 200 && res.status < 300 - // return resolve(res.text()); - // } else { - // return reject(res.statusText); - // } - // }); - // }); - // } - - selectQuery = async query => { - try { - const response = await axios({ - method: 'post', - headers: defaultSelectHeaders, - url: this.endpoint, - data: { query } - }); - return JSON.parse(response); - } catch(error) { - console.error(error); +export const runSelectQuery = async (query, endpoint, resultMapper) => { + try { + const response = await axios({ + method: 'post', + headers: defaultSelectHeaders, + url: endpoint, + data: querystring.stringify({ query }), + }); + const { bindings } = response.data.results; + return bindings.length === 0 ? [] : resultMapper(bindings); + } catch(error) { + if (error.response) { + // The request was made and the server responded with a status code + // that falls out of the range of 2xx + console.log(error.response.data); + //console.log(error.response.status); + //console.log(error.response.headers); + } else if (error.request) { + // The request was made but no response was received + // `error.request` is an instance of XMLHttpRequest in the browser and an instance of + // http.ClientRequest in node.js + console.log(error.request); + } else { + // Something happened in setting up the request that triggered an Error + console.log('Error', error.message); } + console.log(error.config); } - - // selectQuery(query, params = { headers: defaultSelectHeaders }) { - // return this.query(query, params).then(data => { - // return JSON.parse(data); - // }); - // } - // - // constructQuery(query, params = { headers: defaultConstructHeaders }) { - // return this.query(query, params); - // } -} - -export default SparqlApi; +}; diff --git a/src/server/sparql/SparqlSearchEngine.js b/src/server/sparql/SparqlSearchEngine.js deleted file mode 100644 index d2c08c106a1a5c46a69bdaa66814351a86608706..0000000000000000000000000000000000000000 --- a/src/server/sparql/SparqlSearchEngine.js +++ /dev/null @@ -1,16 +0,0 @@ -import SparqlApi from './SparqlApi'; - -class SparqlSearchEngine { - doSearch(sparqlQuery, endpoint, mapper) { - const sparqlApi = new SparqlApi({ endpoint }); - return sparqlApi.selectQuery(sparqlQuery) - .then((data) => { - if (data.results.bindings.length === 0) { - return []; - } - return mapper ? mapper(data.results.bindings) : data.results.bindings; - }); - } -} - -export default SparqlSearchEngine;