gdq-archive/frontend/pages/sitemap.xml.ts

63 lines
1.4 KiB
TypeScript
Raw Normal View History

2020-08-22 20:25:57 +00:00
import { GetServerSideProps } from 'next';
import { create } from 'xmlbuilder2';
import { getIndex, getVideos } from '../util/api';
import sanitizeTitle from '../util/sanitizeTitle';
const urlsetNamespace = 'http://www.sitemaps.org/schemas/sitemap/0.9';
export const getServerSideProps: GetServerSideProps = async (ctx) => {
const { req, res } = ctx;
const { ids } = await getIndex();
const basePath = `https://${req.headers.host}`;
const url = [
{
loc: basePath,
},
];
const results = await Promise.all(
ids.map(async ({ id }) => {
const vodInfo = await getVideos(id);
const { lastUpdatedAt, videos } = vodInfo;
return [
{
loc: `${basePath}/${id}`,
lastmod: lastUpdatedAt,
},
...videos.map(({
title,
}) => ({
loc: `${basePath}/${id}/${sanitizeTitle(title)}`,
lastmod: lastUpdatedAt,
})),
];
}, url),
);
url.push(
...(results
.reduce((old, current) => [...old, ...current], [])),
);
const root = create({ version: '1.0' })
.ele(urlsetNamespace, 'urlset')
.ele({
url,
})
.doc();
// convert the XML tree to string
const xml = root.end({ prettyPrint: true });
res.setHeader('Content-Type', 'text/xml');
res.write(xml);
res.end();
return {
props: {},
};
};
export default () => {};