5a2ff18859
* Add really simple paging to markets endpoint * Document changes to markets endpoint * n -> limit
50 lines
1.6 KiB
TypeScript
50 lines
1.6 KiB
TypeScript
// 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
|
|
}
|
|
}
|