Files
kotobane/app/api/revalidate/route.ts
T

78 lines
2.3 KiB
TypeScript

import { revalidatePath } from 'next/cache'
import { NextRequest, NextResponse } from 'next/server'
import { createDirectus, rest, staticToken, readItem, readItems } from '@directus/sdk'
export async function POST(req: NextRequest) {
const body = await req.json()
if (body.secret !== process.env.REVALIDATE_SECRET) {
return NextResponse.json({ error: 'Invalid secret' }, { status: 401 })
}
if (body.type === 'homepage') {
revalidatePath('/')
return NextResponse.json({ revalidated: true, path: '/' })
}
if (body.type === 'all') {
const directus = createDirectus(process.env.DIRECTUS_URL!)
.with(staticToken(process.env.DIRECTUS_TOKEN!))
.with(rest())
revalidatePath('/')
const [categories, articles] = await Promise.all([
directus.request(readItems('categories', { fields: ['slug'] })) as Promise<{ slug: string }[]>,
directus.request(readItems('articles', {
fields: ['slug', 'category.slug'],
filter: { status: { _eq: 'published' } },
limit: 500,
})) as Promise<{ slug: string; category: { slug: string } }[]>,
])
const paths = ['/']
for (const cat of categories) {
revalidatePath(`/${cat.slug}`)
paths.push(`/${cat.slug}`)
}
for (const article of articles) {
const p = `/${article.category.slug}/${article.slug}`
revalidatePath(p)
paths.push(p)
}
return NextResponse.json({ revalidated: true, paths: paths.slice(0, 20), total: paths.length })
}
const { article_id } = body
if (!article_id) {
return NextResponse.json({ error: 'Missing article_id' }, { status: 400 })
}
const directus = createDirectus(process.env.DIRECTUS_URL!)
.with(staticToken(process.env.DIRECTUS_TOKEN!))
.with(rest())
const article = (await directus.request(
readItem('articles', article_id, {
fields: ['slug', 'category.slug'],
})
)) as { slug: string; category: { slug: string } } | null
if (!article) {
return NextResponse.json({ error: 'Article not found' }, { status: 404 })
}
const categorySlug = article.category.slug
const { slug } = article
revalidatePath('/')
revalidatePath(`/${categorySlug}`)
revalidatePath(`/${categorySlug}/${slug}`)
return NextResponse.json({
revalidated: true,
paths: ['/', `/${categorySlug}`, `/${categorySlug}/${slug}`],
})
}