63 lines
No EOL
1.5 KiB
JavaScript
63 lines
No EOL
1.5 KiB
JavaScript
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)
|
|
const PAGE_SIZE = 1000
|
|
|
|
const fetchAllTags = async () => {
|
|
const { data, error } = await supabase
|
|
.from('links_tags')
|
|
.select('links_id, tags(name)')
|
|
|
|
if (error) {
|
|
console.error('Error fetching all tags from Supabase:', error)
|
|
return {}
|
|
}
|
|
|
|
return data.reduce((acc, { links_id, tags }) => {
|
|
if (!tags || !tags.name) return acc
|
|
if (!acc[links_id]) acc[links_id] = []
|
|
acc[links_id].push(tags['name'])
|
|
return acc
|
|
}, {})
|
|
}
|
|
|
|
const fetchAllLinks = async () => {
|
|
let links = []
|
|
let page = 0
|
|
let fetchMore = true
|
|
|
|
while (fetchMore) {
|
|
const { data, error } = await supabase
|
|
.from('links')
|
|
.select('*, authors (name, url, mastodon)')
|
|
.order('date', { ascending: false })
|
|
.range(page * PAGE_SIZE, (page + 1) * PAGE_SIZE - 1)
|
|
|
|
if (error) {
|
|
console.error('Error fetching links:', error)
|
|
return links
|
|
}
|
|
|
|
if (data.length < PAGE_SIZE) fetchMore = false
|
|
|
|
links = links.concat(data)
|
|
page++
|
|
}
|
|
|
|
return links
|
|
}
|
|
|
|
const processLinks = (links, tagsByLinkId) => {
|
|
return links.map(link => {
|
|
link['tags'] = tagsByLinkId[link['id']] || []
|
|
link['type'] = 'link'
|
|
return link
|
|
})
|
|
}
|
|
|
|
export default async function () {
|
|
const [links, tagsByLinkId] = await Promise.all([fetchAllLinks(), fetchAllTags()])
|
|
return processLinks(links, tagsByLinkId)
|
|
} |