This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
website/src/pages/server-sitemap.xml/index.tsx

60 lines
1.7 KiB
TypeScript

import { GetServerSideProps } from 'next';
import { gql } from 'graphql-request';
import { getServerSideSitemap } from 'next-sitemap';
import { ISitemapField } from 'next-sitemap/dist/@types/interface';
import { createClient } from 'libs/graphql';
import { Query, QueryQualificationsArgs } from 'libs/graphql';
import { WEBSITE_URL, QUESTIONS } from 'config/app';
import { Route } from 'config/routing';
import resolveAs from 'utils/resolveAs';
const QUERY_QUALIFICATIONS = gql`
query qualifications($sort: [String!], $limit: Int) {
qualifications(sort: $sort, limit: $limit) {
items {
slug
}
}
}
`;
const LIMIT = 1000;
export const getServerSideProps: GetServerSideProps = async ctx => {
const client = createClient();
let fields: ISitemapField[] = [];
try {
const {
qualifications: { items },
} = await client.request<
Pick<Query, 'qualifications'>,
QueryQualificationsArgs
>(QUERY_QUALIFICATIONS, { limit: LIMIT, sort: ['code ASC'] });
if (Array.isArray(items)) {
fields = ([] as typeof fields).concat(
...QUESTIONS.map(limit => {
return items.map((item): ISitemapField => {
return {
loc: `${WEBSITE_URL}${resolveAs({
pathname: Route.TestPage,
query: { slug: item.slug, limit },
})}`,
lastmod: new Date().toISOString(),
changefreq: 'always',
};
});
})
);
}
} catch (e) {
console.log('server-sitemap.xml', e.message);
}
return getServerSideSitemap(ctx, fields);
};
// Default export to prevent next.js errors
const Index = () => <div />;
export default Index;