Skip to content
Snippets Groups Projects
Commit 03e03a87 authored by esikkala's avatar esikkala
Browse files

Sitemap generator: support lang versions

parent 9041082b
No related branches found
No related tags found
No related merge requests found
...@@ -2,23 +2,19 @@ import { backendSearchConfig } from '../sparql/sampo/BackendSearchConfig' ...@@ -2,23 +2,19 @@ import { backendSearchConfig } from '../sparql/sampo/BackendSearchConfig'
import { createWriteStream } from 'fs' import { createWriteStream } from 'fs'
import { resolve } from 'path' import { resolve } from 'path'
import { createGzip } from 'zlib' import { createGzip } from 'zlib'
// import { Readable } from 'stream'
import { has } from 'lodash' import { has } from 'lodash'
import { import {
SitemapAndIndexStream, SitemapAndIndexStream,
SitemapStream SitemapStream
} from 'sitemap' } from 'sitemap'
import { sitemapQuery } from '../sparql/SparqlQueriesGeneral'
import { runSelectQuery } from '../sparql/SparqlApi' import { runSelectQuery } from '../sparql/SparqlApi'
const outputDir = './src/server/sitemap_generator/sitemap_output' const { sitemapConfig } = backendSearchConfig
const baseURL = 'https://sampo-ui.demo.seco.cs.aalto.fi/en'
const sitemapURL = 'https://sampo-ui.demo.seco.cs.aalto.fi/sitemap'
const mapURLs = sparqlBindings => { const mapURLs = sparqlBindings => {
const results = sparqlBindings.map(b => ({ const results = sparqlBindings.map(b => {
url: b.url.value return createSitemapEntry({ path: b.path.value })
})) })
return results return results
} }
...@@ -29,35 +25,33 @@ const getURLs = async resultClasses => { ...@@ -29,35 +25,33 @@ const getURLs = async resultClasses => {
// it needs to create a new sitemap file. You merely need to return a stream // 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 // for it to write the sitemap urls to and the expected url where that sitemap will be hosted
getSitemapStream: index => { getSitemapStream: index => {
const sitemapStream = new SitemapStream({ hostname: baseURL }) const sitemapStream = new SitemapStream({ hostname: sitemapConfig.baseUrl })
const fileName = `sitemap-${index}.xml.gz` const fileName = `sitemap-${index}.xml.gz`
sitemapStream sitemapStream
.pipe(createGzip()) // compress the output .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 sitemapStream
.pipe(createGzip()) // compress the output .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 // Add portal's main level URLs to sitemap
sitemapStream.write({ url: baseURL }) sitemapStream.write(createSitemapEntry({ path: null }))
sitemapStream.write({ url: `${baseURL}/about` }) sitemapStream.write(createSitemapEntry({ path: 'about' }))
sitemapStream.write({ url: `${baseURL}/instructions` }) sitemapStream.write(createSitemapEntry({ path: 'instructions' }))
sitemapStream.write({ url: `${baseURL}/feedback` }) sitemapStream.write(createSitemapEntry({ path: 'feedback' }))
// Then process each resultClass // Then process each resultClass
for (const resultClass of resultClasses) { for (const resultClass of resultClasses) {
if (resultClass.hasSearchPerspective) { if (resultClass.hasSearchPerspective) {
// If there is a search perspective, add it's URL to sitemap // If there is a search perspective, add it's URL to sitemap
const searchMode = resultClass.searchMode ? resultClass.searchMode : 'faceted-search' const searchMode = resultClass.searchMode ? resultClass.searchMode : 'faceted-search'
sitemapStream.write({ sitemapStream.write(createSitemapEntry({ path: `${resultClass.perspectiveID}/${searchMode}/table` }))
url: `${baseURL}/${resultClass.perspectiveID}/${searchMode}`
})
} }
const response = await queryInstancePageURLs(resultClass) const response = await queryInstancePageURLs(resultClass)
// Add instance page URLs to sitemap // Add instance page URLs to sitemap
...@@ -69,8 +63,9 @@ const getURLs = async resultClasses => { ...@@ -69,8 +63,9 @@ const getURLs = async resultClasses => {
const queryInstancePageURLs = config => { const queryInstancePageURLs = config => {
const { endpoint } = 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('<PERSPECTIVE>', config.perspectiveID)
q = q.replace('<DEFAULT_TAB>', config.instancePageDefaultTab)
return runSelectQuery({ return runSelectQuery({
query: endpoint.prefixes + q, query: endpoint.prefixes + q,
endpoint: endpoint.url, endpoint: endpoint.url,
...@@ -86,6 +81,7 @@ for (let [resultClass, config] of Object.entries(backendSearchConfig)) { ...@@ -86,6 +81,7 @@ for (let [resultClass, config] of Object.entries(backendSearchConfig)) {
if (config.includeInSitemap) { if (config.includeInSitemap) {
let rdfType let rdfType
let hasSearchPerspective let hasSearchPerspective
const instancePageDefaultTab = config.instance.defaultTab || 'table'
if (!has(config, 'facetClass')) { if (!has(config, 'facetClass')) {
rdfType = config.rdfType rdfType = config.rdfType
config = backendSearchConfig[config.perspectiveID] config = backendSearchConfig[config.perspectiveID]
...@@ -98,9 +94,22 @@ for (let [resultClass, config] of Object.entries(backendSearchConfig)) { ...@@ -98,9 +94,22 @@ for (let [resultClass, config] of Object.entries(backendSearchConfig)) {
endpoint: config.endpoint, endpoint: config.endpoint,
perspectiveID: resultClass, perspectiveID: resultClass,
hasSearchPerspective, 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) getURLs(resultClasses)
...@@ -125,12 +125,12 @@ export const facetValuesRange = ` ...@@ -125,12 +125,12 @@ export const facetValuesRange = `
} }
` `
export const sitemapQuery = ` export const sitemapInstancePageQuery = `
SELECT ?url SELECT ?path
WHERE { WHERE {
VALUES ?resultClass { <RESULT_CLASS> } VALUES ?resultClass { <RESULT_CLASS> }
?uri a ?resultClass . ?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
` `
...@@ -54,6 +54,7 @@ import { ...@@ -54,6 +54,7 @@ import {
import { hellerauMigrationsQuery } from './sparql_queries/SparqlQueriesHellerau' import { hellerauMigrationsQuery } from './sparql_queries/SparqlQueriesHellerau'
import { federatedSearchDatasets } from './sparql_queries/SparqlQueriesFederatedSearch' import { federatedSearchDatasets } from './sparql_queries/SparqlQueriesFederatedSearch'
import { fullTextSearchProperties } from './sparql_queries/SparqlQueriesFullText' import { fullTextSearchProperties } from './sparql_queries/SparqlQueriesFullText'
import { sitemapInstancePageQuery } from '../SparqlQueriesGeneral'
import { makeObjectList } from '../SparqlObjectMapper' import { makeObjectList } from '../SparqlObjectMapper'
import { import {
mapPlaces, mapPlaces,
...@@ -257,5 +258,13 @@ export const backendSearchConfig = { ...@@ -257,5 +258,13 @@ export const backendSearchConfig = {
}, },
federatedSearch: { federatedSearch: {
datasets: federatedSearchDatasets 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
} }
} }
...@@ -20,7 +20,8 @@ export const perspective1Config = { ...@@ -20,7 +20,8 @@ export const perspective1Config = {
}, },
instance: { instance: {
properties: manuscriptPropertiesInstancePage, properties: manuscriptPropertiesInstancePage,
relatedInstances: '' relatedInstances: '',
defaultTab: 'table'
}, },
facets: { facets: {
prefLabel: { prefLabel: {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment