diff --git a/src/server/sitemap_generator/SitemapGenerator.js b/src/server/sitemap_generator/SitemapGenerator.js index 7c2524a37656a615720e6962d01168f4021edb4b..6a430ef7398e665b10159cc1e31eb182d1b68981 100644 --- a/src/server/sitemap_generator/SitemapGenerator.js +++ b/src/server/sitemap_generator/SitemapGenerator.js @@ -2,23 +2,19 @@ import { backendSearchConfig } from '../sparql/sampo/BackendSearchConfig' import { createWriteStream } from 'fs' import { resolve } from 'path' import { createGzip } from 'zlib' -// import { Readable } from 'stream' import { has } from 'lodash' import { SitemapAndIndexStream, SitemapStream } from 'sitemap' -import { sitemapQuery } from '../sparql/SparqlQueriesGeneral' import { runSelectQuery } from '../sparql/SparqlApi' -const outputDir = './src/server/sitemap_generator/sitemap_output' -const baseURL = 'https://sampo-ui.demo.seco.cs.aalto.fi/en' -const sitemapURL = 'https://sampo-ui.demo.seco.cs.aalto.fi/sitemap' +const { sitemapConfig } = backendSearchConfig const mapURLs = sparqlBindings => { - const results = sparqlBindings.map(b => ({ - url: b.url.value - })) + const results = sparqlBindings.map(b => { + return createSitemapEntry({ path: b.path.value }) + }) return results } @@ -29,35 +25,33 @@ const getURLs = async resultClasses => { // it needs to create a new sitemap file. You merely need to return a stream // for it to write the sitemap urls to and the expected url where that sitemap will be hosted getSitemapStream: index => { - const sitemapStream = new SitemapStream({ hostname: baseURL }) + const sitemapStream = new SitemapStream({ hostname: sitemapConfig.baseUrl }) const fileName = `sitemap-${index}.xml.gz` sitemapStream .pipe(createGzip()) // compress the output - .pipe(createWriteStream(resolve(`${outputDir}/${fileName}`))) // write it to sitemap-NUMBER.xml.gz + .pipe(createWriteStream(resolve(`${sitemapConfig.outputDir}/${fileName}`))) // write it to sitemap-NUMBER.xml.gz - return [`${sitemapURL}/${fileName}`, sitemapStream] + return [`${sitemapConfig.sitemapUrl}/${fileName}`, sitemapStream] } }) sitemapStream .pipe(createGzip()) // compress the output - .pipe(createWriteStream(resolve(`${outputDir}/sitemap-index.xml.gz`))) // write it to sitemap-index.xml.gz + .pipe(createWriteStream(resolve(`${sitemapConfig.outputDir}/sitemap-index.xml.gz`))) // write it to sitemap-index.xml.gz // Add portal's main level URLs to sitemap - sitemapStream.write({ url: baseURL }) - sitemapStream.write({ url: `${baseURL}/about` }) - sitemapStream.write({ url: `${baseURL}/instructions` }) - sitemapStream.write({ url: `${baseURL}/feedback` }) + sitemapStream.write(createSitemapEntry({ path: null })) + sitemapStream.write(createSitemapEntry({ path: 'about' })) + sitemapStream.write(createSitemapEntry({ path: 'instructions' })) + sitemapStream.write(createSitemapEntry({ path: 'feedback' })) // Then process each resultClass for (const resultClass of resultClasses) { if (resultClass.hasSearchPerspective) { // If there is a search perspective, add it's URL to sitemap const searchMode = resultClass.searchMode ? resultClass.searchMode : 'faceted-search' - sitemapStream.write({ - url: `${baseURL}/${resultClass.perspectiveID}/${searchMode}` - }) + sitemapStream.write(createSitemapEntry({ path: `${resultClass.perspectiveID}/${searchMode}/table` })) } const response = await queryInstancePageURLs(resultClass) // Add instance page URLs to sitemap @@ -69,8 +63,9 @@ const getURLs = async resultClasses => { const queryInstancePageURLs = config => { const { endpoint } = config - let q = sitemapQuery.replace('<RESULT_CLASS>', config.rdfType) + let q = sitemapConfig.sitemapInstancePageQuery.replace('<RESULT_CLASS>', config.rdfType) q = q.replace('<PERSPECTIVE>', config.perspectiveID) + q = q.replace('<DEFAULT_TAB>', config.instancePageDefaultTab) return runSelectQuery({ query: endpoint.prefixes + q, endpoint: endpoint.url, @@ -86,6 +81,7 @@ for (let [resultClass, config] of Object.entries(backendSearchConfig)) { if (config.includeInSitemap) { let rdfType let hasSearchPerspective + const instancePageDefaultTab = config.instance.defaultTab || 'table' if (!has(config, 'facetClass')) { rdfType = config.rdfType config = backendSearchConfig[config.perspectiveID] @@ -98,9 +94,22 @@ for (let [resultClass, config] of Object.entries(backendSearchConfig)) { endpoint: config.endpoint, perspectiveID: resultClass, hasSearchPerspective, - rdfType + rdfType, + instancePageDefaultTab }) } } +const createSitemapEntry = ({ path }) => { + path = path ? `/${path}` : '' // do not add trailing slash + const entry = { + url: `${sitemapConfig.baseUrl}/${sitemapConfig.langPrimary}${path}`, + links: [ + { lang: sitemapConfig.langPrimary, url: `${sitemapConfig.baseUrl}/${sitemapConfig.langPrimary}${path}` }, + { lang: sitemapConfig.langSecondary, url: `${sitemapConfig.baseUrl}/${sitemapConfig.langSecondary}${path}` } + ] + } + return entry +} + getURLs(resultClasses) diff --git a/src/server/sparql/SparqlQueriesGeneral.js b/src/server/sparql/SparqlQueriesGeneral.js index 9b5d864ccc520b1243a08768f7e5a3c552ba0b18..f215c72085deabde15c6b9fd0abff9e352818e1e 100644 --- a/src/server/sparql/SparqlQueriesGeneral.js +++ b/src/server/sparql/SparqlQueriesGeneral.js @@ -125,12 +125,12 @@ export const facetValuesRange = ` } ` -export const sitemapQuery = ` - SELECT ?url +export const sitemapInstancePageQuery = ` + SELECT ?path WHERE { VALUES ?resultClass { <RESULT_CLASS> } ?uri a ?resultClass . - BIND(CONCAT("/<PERSPECTIVE>/page/", REPLACE(STR(?uri), "^.*\\\\/(.+)", "$1")) AS ?url) + BIND(CONCAT("<PERSPECTIVE>/page/", REPLACE(STR(?uri), "^.*\\\\/(.+)", "$1"), "/<DEFAULT_TAB>") AS ?path) } - # LIMIT 10 + # LIMIT 100 ` diff --git a/src/server/sparql/sampo/BackendSearchConfig.js b/src/server/sparql/sampo/BackendSearchConfig.js index 302b788655fe30f165146370a7936684509582cd..ffc0df91a0140facd36bac61f0da8ced58e47650 100644 --- a/src/server/sparql/sampo/BackendSearchConfig.js +++ b/src/server/sparql/sampo/BackendSearchConfig.js @@ -54,6 +54,7 @@ import { import { hellerauMigrationsQuery } from './sparql_queries/SparqlQueriesHellerau' import { federatedSearchDatasets } from './sparql_queries/SparqlQueriesFederatedSearch' import { fullTextSearchProperties } from './sparql_queries/SparqlQueriesFullText' +import { sitemapInstancePageQuery } from '../SparqlQueriesGeneral' import { makeObjectList } from '../SparqlObjectMapper' import { mapPlaces, @@ -257,5 +258,13 @@ export const backendSearchConfig = { }, federatedSearch: { datasets: federatedSearchDatasets + }, + sitemapConfig: { + baseUrl: 'https://sampo-ui.demo.seco.cs.aalto.fi', + langPrimary: 'en', + langSecondary: 'fi', + outputDir: './src/server/sitemap_generator/sitemap_output', + sitemapUrl: 'https://sampo-ui.demo.seco.cs.aalto.fi/sitemap', + sitemapInstancePageQuery } } diff --git a/src/server/sparql/sampo/perspective_configs/Perspective1Config.js b/src/server/sparql/sampo/perspective_configs/Perspective1Config.js index b8230865f890433da9fa332ab5d4a59f1a234427..0c44e8cd125b283ccfb9e3580f78f76cb14885b9 100644 --- a/src/server/sparql/sampo/perspective_configs/Perspective1Config.js +++ b/src/server/sparql/sampo/perspective_configs/Perspective1Config.js @@ -20,7 +20,8 @@ export const perspective1Config = { }, instance: { properties: manuscriptPropertiesInstancePage, - relatedInstances: '' + relatedInstances: '', + defaultTab: 'table' }, facets: { prefLabel: {