diff --git a/src/lib/slug-reserved-words.ts b/src/lib/slug-reserved-words.ts index c268d1f9..e6656c75 100644 --- a/src/lib/slug-reserved-words.ts +++ b/src/lib/slug-reserved-words.ts @@ -8,6 +8,7 @@ const slugReservedWords = [ "sitemap.xml", "dashboard", "robots.txt", + "nft", ] export const checkSlugReservedWords = (word: string) => { diff --git a/src/pages/_site/[site]/robots.txt.tsx b/src/pages/_site/[site]/robots.txt.tsx new file mode 100644 index 00000000..e71b848a --- /dev/null +++ b/src/pages/_site/[site]/robots.txt.tsx @@ -0,0 +1,22 @@ +import { GetServerSideProps } from "next" + +export const getServerSideProps: GetServerSideProps = async (ctx) => { + ctx.res.setHeader("Content-Type", "text/plain") + ctx.res.setHeader("Access-Control-Allow-Methods", "GET") + ctx.res.setHeader("Access-Control-Allow-Origin", "*") + + ctx.res.write(`User-agent: * +Disallow: /dashboard/ +Disallow: /preview/ + +Sitemap: https://${ctx.req.headers.host}/sitemap.xml`) + ctx.res.end() + + return { + props: {}, + } +} + +const RobotsTxt: React.FC = () => null + +export default RobotsTxt diff --git a/src/pages/_site/[site]/sitemap.xml.tsx b/src/pages/_site/[site]/sitemap.xml.tsx new file mode 100644 index 00000000..61f6177f --- /dev/null +++ b/src/pages/_site/[site]/sitemap.xml.tsx @@ -0,0 +1,50 @@ +import { GetServerSideProps } from "next" +import { fetchGetSite } from "~/queries/site.server" +import { fetchGetPagesBySite } from "~/queries/page.server" +import { PageVisibilityEnum } from "~/lib/types" +import { getSiteLink } from "~/lib/helpers" +import { QueryClient } from "@tanstack/react-query" +import dayjs from "~/lib/date" + +export const getServerSideProps: GetServerSideProps = async (ctx) => { + const queryClient = new QueryClient() + ctx.res.setHeader("Content-Type", "text/xml") + ctx.res.setHeader("Access-Control-Allow-Methods", "GET") + ctx.res.setHeader("Access-Control-Allow-Origin", "*") + const domainOrSubdomain = ctx.params!.site as string + + const site = await fetchGetSite(domainOrSubdomain, queryClient) + const pages = await fetchGetPagesBySite( + { + site: domainOrSubdomain, + type: "post", + visibility: PageVisibilityEnum.Published, + take: 1000, + }, + queryClient, + ) + console.log(pages) + + const link = getSiteLink({ + subdomain: site.username || "", + }) + ctx.res.write(` + +${pages.list?.map( + (page: any) => ` + ${link}/${page.slug || page.id} + ${dayjs(page.date_updated).format("YYYY-MM-DD")} + `, +).join(` +`)} +`) + ctx.res.end() + + return { + props: {}, + } +} + +const SiteFeed: React.FC = () => null + +export default SiteFeed