migrations.ts57 lines · main
1import { NextApiRequest, NextApiResponse } from 'next'
2
3import { constructHeaders } from '@/lib/api/apiHelpers'
4import apiWrapper from '@/lib/api/apiWrapper'
5import { applyAndTrackMigrations, listMigrationVersions } from '@/lib/api/self-hosted/migrations'
6import { PgMetaDatabaseError } from '@/lib/api/self-hosted/types'
7
8export default (req: NextApiRequest, res: NextApiResponse) =>
9 apiWrapper(req, res, handler, { withAuth: true })
10
11async function handler(req: NextApiRequest, res: NextApiResponse) {
12 const { method } = req
13
14 switch (method) {
15 case 'GET':
16 return handleGetAll(req, res)
17 case 'POST':
18 return handlePost(req, res)
19 default:
20 res.setHeader('Allow', ['GET', 'POST'])
21 res.status(405).json({ error: { message: `Method ${method} Not Allowed` } })
22 }
23}
24
25const handleGetAll = async (req: NextApiRequest, res: NextApiResponse) => {
26 const headers = constructHeaders(req.headers)
27 const { data, error } = await listMigrationVersions(headers)
28
29 if (error) {
30 if (error instanceof PgMetaDatabaseError) {
31 const { statusCode, message, formattedError } = error
32 return res.status(statusCode).json({ message, formattedError })
33 }
34 const { message } = error
35 return res.status(500).json({ message, formattedError: message })
36 } else {
37 return res.status(200).json(data)
38 }
39}
40
41const handlePost = async (req: NextApiRequest, res: NextApiResponse) => {
42 const headers = constructHeaders(req.headers)
43 const { query, name } = req.body
44
45 const { data, error } = await applyAndTrackMigrations({ query, name, headers })
46
47 if (error) {
48 if (error instanceof PgMetaDatabaseError) {
49 const { statusCode, message, formattedError } = error
50 return res.status(statusCode).json({ message, formattedError })
51 }
52 const { message } = error
53 return res.status(500).json({ message, formattedError: message })
54 } else {
55 return res.status(200).json(data)
56 }
57}