diff --git a/src/server/index.js b/src/server/index.js index 2d0a4168b3cf0ea173ec101daa487a5324e46aec..57baaea91c00658c813e33e2ecd2b42ed6955ebd 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -41,12 +41,19 @@ app.get(`${apiPath}/:resultClass/paginated`, async (req, res, next) => { try { const data = await getPaginatedResults({ resultClass: req.params.resultClass, - page: parseInt(req.query.page) || null, + page: req.query.page == null ? null : req.query.page, pagesize: parseInt(req.query.pagesize) || null, sortBy: req.query.sortBy || null, sortDirection: req.query.sortDirection || null, constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints), + resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat }); + // test csv result format + // res.writeHead(200, { + // 'Content-Type': 'text/csv', + // 'Content-Disposition': 'attachment; filename=results.csv' + // }); + // res.end(data); res.json(data); } catch(error) { next(error); @@ -60,6 +67,7 @@ app.get(`${apiPath}/:resultClass/all`, async (req, res, next) => { facetClass: req.query.facetClass || null, constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints), variant: req.query.variant || null, + resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat }); res.json({ results: data @@ -74,6 +82,7 @@ app.get(`${apiPath}/:resultClass/count`, async (req, res, next) => { const count = await getResultCount({ resultClass: req.params.resultClass, constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints), + resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat }); res.json({ count }); } catch(error) { @@ -88,7 +97,8 @@ app.get(`${apiPath}/:resultClass/instance/:uri`, async (req, res, next) => { facetClass: req.query.facetClass || null, constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints), variant: req.query.variant || null, - uri: req.params.uri + uri: req.params.uri, + resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat }); // there is always one object in the 'data' array res.json(data[0]); @@ -105,6 +115,7 @@ app.get(`${apiPath}/:facetClass/facet/:id`, async (req, res, next) => { sortBy: req.query.sortBy || null, sortDirection: req.query.sortDirection || null, constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints), + resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat }); res.json(data); } catch(error) { @@ -134,6 +145,7 @@ app.get(`${apiPath}/search`, async (req, res, next) => { longMin: longMin, latMax: latMax, longMax: longMax, + resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat }); res.json(data); } catch(error) { diff --git a/src/server/sparql/FacetResults.js b/src/server/sparql/FacetResults.js index 65b427d4cbb163b2513c84dd1bec884a2edaa9a5..f482e703e4eed656021748edf6b37a69673d58eb 100644 --- a/src/server/sparql/FacetResults.js +++ b/src/server/sparql/FacetResults.js @@ -24,7 +24,8 @@ export const getPaginatedResults = async ({ pagesize, constraints, sortBy, - sortDirection + sortDirection, + resultFormat }) => { const data = await getPaginatedData({ resultClass, @@ -32,20 +33,26 @@ export const getPaginatedResults = async ({ pagesize, constraints, sortBy, - sortDirection + sortDirection, + resultFormat }); - return { - pagesize: pagesize, - page: page, - results: data - }; + if (resultFormat === 'json') { + return { + pagesize: pagesize, + page: page, + results: data + }; + } else { + return data; + } }; export const getAllResults = ({ // resultClass, // TODO: handle other classes than manuscripts facetClass, constraints, - variant + variant, + resultFormat }) => { let q = ''; let filterTarget = ''; @@ -80,12 +87,13 @@ export const getAllResults = ({ // if (variant == 'productionPlaces') { // console.log(prefixes + q) // } - return runSelectQuery(prefixes + q, endpoint, makeObjectList); + return runSelectQuery(prefixes + q, endpoint, makeObjectList, resultFormat); }; export const getResultCount = ({ resultClass, - constraints + constraints, + resultFormat }) => { let q = countQuery; q = q.replace('<FACET_CLASS>', facetConfigs[resultClass].facetClass); @@ -100,7 +108,7 @@ export const getResultCount = ({ facetID: null })); } - return runSelectQuery(prefixes + q, endpoint, mapCount); + return runSelectQuery(prefixes + q, endpoint, mapCount, resultFormat); }; const getPaginatedData = ({ @@ -109,7 +117,8 @@ const getPaginatedData = ({ pagesize, constraints, sortBy, - sortDirection + sortDirection, + resultFormat }) => { let q = facetResultSetQuery; const facetConfig = facetConfigs[resultClass]; @@ -163,8 +172,8 @@ const getPaginatedData = ({ resultSetProperties = ''; } q = q.replace('<RESULT_SET_PROPERTIES>', resultSetProperties); - // console.log(prefixes + q) - return runSelectQuery(prefixes + q, endpoint, makeObjectList); + console.log(prefixes + q); + return runSelectQuery(prefixes + q, endpoint, makeObjectList, resultFormat); }; export const getByURI = ({ @@ -172,7 +181,8 @@ export const getByURI = ({ facetClass, constraints, //variant, - uri + uri, + resultFormat }) => { let q; switch (resultClass) { @@ -194,5 +204,5 @@ export const getByURI = ({ // if (variant === 'productionPlaces') { // console.log(prefixes + q) // } - return runSelectQuery(prefixes + q, endpoint, makeObjectList); + return runSelectQuery(prefixes + q, endpoint, makeObjectList, resultFormat); }; diff --git a/src/server/sparql/FacetValues.js b/src/server/sparql/FacetValues.js index 10f065eff8c7f957469e51e1a7e05058cdebf9b6..3a3c2fd9b1eef74b93f75d39884b2313cd8f35b4 100644 --- a/src/server/sparql/FacetValues.js +++ b/src/server/sparql/FacetValues.js @@ -25,6 +25,7 @@ export const getFacet = ({ sortBy, sortDirection, constraints, + resultFormat }) => { const facetConfig = facetConfigs[facetClass][facetID]; // choose query template and result mapper: @@ -104,7 +105,7 @@ export const getFacet = ({ // if (facetID == 'productionPlace') { // console.log(prefixes + q) // } - return runSelectQuery(prefixes + q, endpoint, mapper); + return runSelectQuery(prefixes + q, endpoint, mapper, resultFormat); }; const generateSelectedBlock = ({ diff --git a/src/server/sparql/SparqlApi.js b/src/server/sparql/SparqlApi.js index e119b7d8236d6ece714905b5e9b607fdf269bef8..8cd4c1a100aa6d5fb5788dd97cf3bd11d4145aae 100644 --- a/src/server/sparql/SparqlApi.js +++ b/src/server/sparql/SparqlApi.js @@ -1,24 +1,31 @@ import axios from 'axios'; 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' // }; -export const runSelectQuery = async (query, endpoint, resultMapper) => { +export const runSelectQuery = async (query, endpoint, resultMapper, resultFormat) => { + let MIMEtype = resultFormat === 'json' + ? 'application/sparql-results+json; charset=utf-8' + : 'text/csv; charset=utf-8'; + const headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': MIMEtype + }; try { const response = await axios({ method: 'post', - headers: defaultSelectHeaders, + headers: headers, url: endpoint, data: querystring.stringify({ query }), }); - return resultMapper(response.data.results.bindings); + if (resultFormat === 'json') { + return resultMapper(response.data.results.bindings); + } else { + return response.data; + } + } catch(error) { if (error.response) { // The request was made and the server responded with a status code