redirecter for ao3 that adds opengraph metadata

implement caching, uppercasing

Changed files
+10 -29
src
app
api
series
[seriesId]
works
[workId]
chapters
[chapterId]
series
[seriesId]
preview
works
[workId]
chapters
[chapterId]
preview
preview
lib
+2 -6
src/app/api/series/[seriesId]/route.js
···
import { getSeries } from "@fujocoded/ao3.js"
-
import { cache } from 'react'
-
const getItem = cache(async (seriesID) => {
-
const series = await getSeries({seriesId: seriesId})
-
return series
-
})
+
export const dynamic = 'force-static'
export async function GET(_req, ctx) {
const { seriesId } = await ctx.params
-
const series = await getItem(seriesId)
+
const series = await getSeries({seriesId: seriesId})
return Response.json(series)
}
+2 -5
src/app/api/works/[workId]/chapters/[chapterId]/route.js
···
import { getWork } from "@fujocoded/ao3.js"
-
const getItem = cache(async (workId, chapterId) => {
-
const work = await getWork({workId: workId, chapterId: chapterId})
-
return work
-
})
+
export const dynamic = 'force-static'
export async function GET(_req, ctx) {
const { workId, chapterId } = await ctx.params
-
const work = await getItem(workId, chapterId)
+
const work = await getWork({workId: workId, chapterId: chapterId})
return Response.json(work)
}
+2 -5
src/app/api/works/[workId]/route.js
···
import { getWork } from "@fujocoded/ao3.js"
-
const getItem = cache(async (workId) => {
-
const work = await getWork({workId: workId})
-
return work
-
})
+
export const dynamic = 'force-static'
export async function GET(_req, ctx) {
const { workId } = await ctx.params
-
const work = await getItem(id)
+
const work = await getWork({workId: workId})
return Response.json(work)
}
+1 -6
src/app/series/[seriesId]/preview/route.js
···
export const contentType = 'image/webp'
-
const getItem = cache(async (seriesId) => {
-
const series = await getSeries({seriesId: seriesId})
-
return series
-
})
-
export async function GET(req, ctx) {
const { seriesId } = await ctx.params
const p = await req.nextUrl.searchParams
const props = querystring.parse(p.toString())
const addr = `series/${seriesId}`
-
const data = await getItem(seriesId)
+
const data = await getSeries({seriesId: seriesId})
const imageParams = await sanitizeData({type: 'series', data: data, props: props})
const theme = imageParams.theme
const baseFont = baseFonts[imageParams.baseFont].displayName
+1 -7
src/app/works/[workId]/chapters/[chapterId]/preview/route.js
···
import { getWork } from "@fujocoded/ao3.js"
-
import { cache } from 'react'
import querystring from 'node:querystring'
import sanitizeData from "@/lib/sanitizeData.js"
import OGImage from "@/lib/ogimage.js"
···
export const contentType = 'image/webp'
-
const getItem = cache(async (workId, chapterId) => {
-
const work = await getWork({workId: workId, chapterId: chapterId})
-
return work
-
})
-
export async function GET(req, ctx) {
const { workId, chapterId } = await ctx.params
const p = await req.nextUrl.searchParams
const props = querystring.parse(p.toString())
const addr = `works/${workId}/chapters/${chapterId}`
-
const data = getItem(workId, chapterId)
+
const data = await getWork({workId: workId, chapterId: chapterId})
const imageParams = await sanitizeData({type: 'work', data: data, props: props})
const theme = imageParams.theme
const baseFont = baseFonts[imageParams.baseFont].displayName
+1
src/app/works/[workId]/preview/route.js
···
import { getWork } from "@fujocoded/ao3.js"
+
import { cache } from "react"
import querystring from 'node:querystring'
import sanitizeData from "@/lib/sanitizeData.js"
import OGImage from "@/lib/ogimage.js"
+1
src/lib/ogimage.js
···
style={{
fontSize: 54,
justifyContent: "center",
+
textAlign: "center",
fontFamily: titleFont,
fontWeight: "bold",
color: theme.color,