import getSSRApolloClient from '../api/ssrApollo' const SITE_URL = 'https://stacker.news' const SITE_TITLE = 'Stacker News' const SITE_SUBTITLE = '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 return ` ${guid} ${escapeXml(item.title)} ${escapeXml(link)} ${guid} Comments]]> ${new Date(item.createdAt).toUTCString()} ` } function generateRssFeed (items) { const itemsList = items.map(generateRssItem) return ` ${SITE_TITLE} ${SITE_URL} ${SITE_SUBTITLE} en ${new Date().toUTCString()} ${itemsList.join('')} ` } export default function getGetRssServerSideProps(query, variables = null) { return async function ({ req, res }) { const emptyProps = { props: {} } // to avoid server side warnings const client = await getSSRApolloClient(req) const { error, data: { items: { items } } } = await client.query({ query, variables }) if (!items || error) return emptyProps res.setHeader('Content-Type', 'text/xml; charset=utf-8') res.write(generateRssFeed(items)) res.end() return emptyProps } }