feat: remote sitemap

This commit is contained in:
Cory Dransfeldt 2024-10-19 13:43:07 -07:00
parent 193366e946
commit 0275c8f02f
No known key found for this signature in database
7 changed files with 86 additions and 52 deletions

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "coryd.dev",
"version": "1.4.0",
"version": "1.5.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "coryd.dev",
"version": "1.4.0",
"version": "1.5.0",
"license": "MIT",
"dependencies": {
"@cdransf/api-text": "^1.5.0",

View file

@ -1,6 +1,6 @@
{
"name": "coryd.dev",
"version": "1.4.0",
"version": "1.5.0",
"description": "The source for my personal site. Built using 11ty (and other tools).",
"type": "module",
"engines": {

View file

@ -1,19 +0,0 @@
import { createClient } from '@supabase/supabase-js'
const SUPABASE_URL = process.env.SUPABASE_URL
const SUPABASE_KEY = process.env.SUPABASE_KEY
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY)
export default async function fetchSitemap() {
const { data, error } = await supabase
.from('optimized_sitemap')
.select('sitemap')
if (error) {
console.error('Error fetching sitemap data:', error)
return []
}
const [{ sitemap } = {}] = data
return sitemap || []
}

View file

@ -1,16 +0,0 @@
---
permalink: "/sitemap.xml"
layout: null
eleventyExcludeFromCollections: true
---
<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{% for page in sitemap -%}
<url>
<loc>{{ page.url }}</loc>
<lastmod>{{ page.date | date: '%Y-%m-%dT%H:%M:%S%:z' }}</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
{% endfor %}
</urlset>

View file

@ -3,7 +3,9 @@ WITH sitemap_data AS (
SELECT
p.date AS content_date,
p.title,
CONCAT('https://coryd.dev', p.url) AS url
CONCAT('https://coryd.dev', p.url) AS url,
'monthly' AS changefreq,
0.7 AS priority
FROM optimized_posts p
UNION ALL
@ -11,7 +13,9 @@ WITH sitemap_data AS (
SELECT
b.date_finished AS content_date,
b.title,
CONCAT('https://coryd.dev', b.url) AS url
CONCAT('https://coryd.dev', b.url) AS url,
'monthly' AS changefreq,
0.5 AS priority
FROM optimized_books b
UNION ALL
@ -19,7 +23,9 @@ WITH sitemap_data AS (
SELECT
m.last_watched AS content_date,
m.title,
CONCAT('https://coryd.dev', m.url) AS url
CONCAT('https://coryd.dev', m.url) AS url,
'weekly' AS changefreq,
0.6 AS priority
FROM optimized_movies m
UNION ALL
@ -27,7 +33,9 @@ WITH sitemap_data AS (
SELECT
NULL AS content_date,
ar.name AS title,
CONCAT('https://coryd.dev', ar.url) AS url
CONCAT('https://coryd.dev', ar.url) AS url,
'monthly' AS changefreq,
0.5 AS priority
FROM optimized_artists ar
UNION ALL
@ -35,7 +43,9 @@ WITH sitemap_data AS (
SELECT
NULL AS content_date,
g.name AS title,
CONCAT('https://coryd.dev', g.url) AS url
CONCAT('https://coryd.dev', g.url) AS url,
'yearly' AS changefreq,
0.3 AS priority
FROM optimized_genres g
UNION ALL
@ -43,16 +53,16 @@ WITH sitemap_data AS (
SELECT
s.last_watched_at AS content_date,
s.title,
CONCAT('https://coryd.dev', s.url) AS url
CONCAT('https://coryd.dev', s.url) AS url,
'weekly' AS changefreq,
0.8 AS priority
FROM optimized_shows s
)
SELECT
json_agg(
json_build_object(
'url', sd.url,
'title', sd.title,
'date', sd.content_date
)
) AS sitemap
FROM sitemap_data sd;
url,
title,
content_date AS lastmod,
changefreq,
priority
FROM sitemap_data;

47
workers/sitemap/index.js Normal file
View file

@ -0,0 +1,47 @@
import { createClient } from '@supabase/supabase-js'
export default {
async fetch(request, env) {
const supabaseUrl = env.SUPABASE_URL || process.env.SUPABASE_URL
const supabaseKey = env.SUPABASE_KEY || process.env.SUPABASE_KEY
const supabase = createClient(supabaseUrl, supabaseKey)
try {
const { data, error } = await supabase
.from('optimized_sitemap')
.select('url, lastmod, changefreq, priority')
if (error) {
console.error('Error fetching sitemap data:', error)
return new Response('Error fetching sitemap data', { status: 500 })
}
const sitemapXml = generateSitemapXml(data)
return new Response(sitemapXml, {
headers: {
'Content-Type': 'application/xml',
'Access-Control-Allow-Origin': '*',
},
})
} catch (error) {
console.error('Unexpected error:', error)
return new Response('Internal Server Error', { status: 500 })
}
}
}
function generateSitemapXml(data) {
const urls = data.map(({ url, lastmod, changefreq, priority }) => `
<url>
<loc>${url}</loc>
${lastmod ? `<lastmod>${new Date(lastmod).toISOString()}</lastmod>` : ''}
<changefreq>${changefreq}</changefreq>
<priority>${priority}</priority>
</url>
`).join('')
return `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
${urls}
</urlset>`
}

View file

@ -0,0 +1,12 @@
name = "sitemap-worker"
main = "./index.js"
compatibility_date = "2023-01-01"
account_id = "${CF_ACCOUNT_ID}"
workers_dev = true
[env.production]
name = "sitemap-worker-production"
routes = [
{ pattern = "coryd.dev/sitemap.xml", zone_id = "${CF_ZONE_ID}" },
]