-
-
Notifications
You must be signed in to change notification settings - Fork 139
/
Copy pathquery.ts
87 lines (74 loc) · 2.35 KB
/
query.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import { FastifyInstance, FastifyRequest } from 'fastify'
import { PostgresMeta } from '../../lib/index.js'
import * as Parser from '../../lib/Parser.js'
import { DEFAULT_POOL_CONFIG } from '../constants.js'
import { extractRequestForLogging, translateErrorToResponseCode } from '../utils.js'
const errorOnEmptyQuery = (request: FastifyRequest) => {
if (!(request.body as any).query) {
throw new Error('query not found')
}
}
export default async (fastify: FastifyInstance) => {
fastify.post<{
Headers: { pg: string }
Body: {
query: string
}
}>('/', async (request, reply) => {
errorOnEmptyQuery(request)
const connectionString = request.headers.pg
const pgMeta = new PostgresMeta({ ...DEFAULT_POOL_CONFIG, connectionString })
const { data, error } = await pgMeta.query(request.body.query, false)
await pgMeta.end()
if (error) {
request.log.error({ error, request: extractRequestForLogging(request) })
reply.code(translateErrorToResponseCode(error))
return { error: error.formattedError ?? error.message, ...error }
}
return data || []
})
fastify.post<{
Headers: { pg: string }
Body: {
query: string
}
}>('/format', async (request, reply) => {
errorOnEmptyQuery(request)
const { data, error } = await Parser.Format(request.body.query)
if (error) {
request.log.error({ error, request: extractRequestForLogging(request) })
reply.code(translateErrorToResponseCode(error))
return { error: error.message }
}
return data
})
fastify.post<{
Headers: { pg: string }
Body: {
query: string
}
}>('/parse', async (request, reply) => {
errorOnEmptyQuery(request)
const { data, error } = Parser.Parse(request.body.query)
if (error) {
request.log.error({ error, request: extractRequestForLogging(request) })
reply.code(translateErrorToResponseCode(error))
return { error: error.message }
}
return data
})
fastify.post<{
Headers: { pg: string }
Body: {
ast: object
}
}>('/deparse', async (request, reply) => {
const { data, error } = Parser.Deparse(request.body.ast)
if (error) {
request.log.error({ error, request: extractRequestForLogging(request) })
reply.code(translateErrorToResponseCode(error))
return { error: error.message }
}
return data
})
}