manifold/web/pages/api/v0/markets.ts

50 lines
1.6 KiB
TypeScript
Raw Normal View History

// Next.js API route support: https://vercel.com/docs/concepts/functions/serverless-functions
import type { NextApiRequest, NextApiResponse } from 'next'
import { listAllContracts } from 'web/lib/firebase/contracts'
import { applyCorsHeaders, CORS_UNRESTRICTED } from 'web/lib/api/cors'
import { toLiteMarket } from './_types'
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
await applyCorsHeaders(req, res, CORS_UNRESTRICTED)
let before: string | undefined
let limit: number | undefined
if (req.query.before != null) {
if (typeof req.query.before !== 'string') {
res.status(400).json({ error: 'before must be null or a market ID.' })
return
}
before = req.query.before
}
if (req.query.limit != null) {
if (typeof req.query.limit !== 'string') {
res
.status(400)
.json({ error: 'limit must be null or a number of markets to return.' })
return
}
limit = parseInt(req.query.limit)
} else {
limit = 1000
}
if (limit < 1 || limit > 1000) {
res.status(400).json({ error: 'limit must be between 1 and 1000.' })
return
}
try {
const contracts = await listAllContracts(limit, before)
// Serve from Vercel cache, then update. see https://vercel.com/docs/concepts/functions/edge-caching
res.setHeader('Cache-Control', 's-maxage=1, stale-while-revalidate')
res.status(200).json(contracts.map(toLiteMarket))
} catch (e) {
res.status(400).json({
error:
'Failed to fetch markets (did you pass an invalid ID as the before parameter?)',
})
return
}
}