Files
boris/api/article-og-refresh.ts
Gigi c81b7b89d1 feat: implement storage-backed OG previews with Upstash Redis
- Add ogStore service for Redis get/set operations
- Extract shared logic: ogHtml (generateHtml, escapeHtml) and articleMeta (relay/gateway fetching)
- Refactor article-og endpoint to read from Redis, try gateway on miss, trigger background refresh
- Add article-og-refresh endpoint for background relay fetching and caching
- Update vercel.json with refresh function config
- Remove WebSocket dependencies from main OG endpoint for faster crawler responses
2025-11-07 18:41:08 +01:00

36 lines
1.2 KiB
TypeScript

import type { VercelRequest, VercelResponse } from '@vercel/node'
import { setArticleMeta } from '../src/services/ogStore'
import { fetchArticleMetadataViaRelays } from '../src/services/articleMeta'
export default async function handler(req: VercelRequest, res: VercelResponse) {
// Validate refresh secret
const providedSecret = req.headers['x-refresh-key']
const expectedSecret = process.env.OG_REFRESH_SECRET || ''
if (providedSecret !== expectedSecret) {
return res.status(401).json({ error: 'Unauthorized' })
}
const naddr = (req.query.naddr as string | undefined)?.trim()
if (!naddr) {
return res.status(400).json({ error: 'Missing naddr parameter' })
}
try {
// Fetch metadata via relays (WebSockets)
const meta = await fetchArticleMetadataViaRelays(naddr)
if (meta) {
// Store in Redis
await setArticleMeta(naddr, meta)
return res.status(200).json({ ok: true, cached: true })
} else {
return res.status(200).json({ ok: true, cached: false })
}
} catch (err) {
console.error('Error refreshing article metadata:', err)
return res.status(500).json({ error: 'Internal server error' })
}
}