import getSSRApolloClient from '../api/ssrApollo'
const SITE_URL = 'https://stacker.news'
const SITE_TITLE = 'stacker news'
const SITE_SUBTITLE = 'It\'s like Hacker News, but we pay you Bitcoin.'
function escapeXml (unsafe) {
return unsafe.replace(/[<>&'"]/g, function (c) {
switch (c) {
case '<': return '<'
case '>': return '>'
case '&': return '&'
case '\'': return '''
case '"': return '"'
}
})
}
const generateRssItem = (item) => {
const guid = `${SITE_URL}/items/${item.id}`
const link = item.url || guid
let title = item.title
if (item.isJob) {
title = item.title + ' \\ ' + item.company + ' \\ ' + `${item.location || ''}${item.location && item.remote ? ' or ' : ''}${item.remote ? 'Remote' : ''}`
}
return `
-
${guid}
${escapeXml(title)}
${escapeXml(link)}
${guid}
Comments]]>
${new Date(item.createdAt).toUTCString()}
`
}
function generateRssFeed (items, sub = null) {
const itemsList = items.map(generateRssItem)
return `
${SITE_TITLE}${sub ? ` ~${sub}` : ''}
${SITE_URL}${sub ? `/~${sub}` : ''}
${SITE_SUBTITLE}
en
${new Date().toUTCString()}
${itemsList.join('')}
`
}
export default function getGetRssServerSideProps (query, variables = null) {
return async function ({ req, res, params }) {
const emptyProps = { props: {} } // to avoid server side warnings
const client = await getSSRApolloClient(req)
const { error, data: { items: { items } } } = await client.query({
query, variables: { ...params, ...variables }
})
if (!items || error) return emptyProps
res.setHeader('Content-Type', 'text/xml; charset=utf-8')
res.write(generateRssFeed(items, params?.sub))
res.end()
return emptyProps
}
}