-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.js
75 lines (56 loc) · 1.71 KB
/
index.js
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
'use strict'
const fp = require('fastify-plugin')
const defaultOptions = {
transaction: false,
dataSource: null,
match: () => true,
respIsError: () => false
}
function fastifyTypeORMQueryRunner (fastify, opts, done) {
fastify.decorateRequest('queryRunner', null)
if (!opts.dataSource) {
return done(new Error('dataSource is required'))
}
if (!('createQueryRunner' in opts.dataSource)) {
return done(new Error('dataSource.createQueryRunner is required'))
}
const options = Object.assign({}, defaultOptions, opts)
fastify.addHook('onRequest', async (request) => {
if (!options.match(request)) {
return
}
request.queryRunner = options.dataSource.createQueryRunner()
if (options.transaction) {
await request.queryRunner.startTransaction()
}
})
fastify.addHook('onSend', async (request, _reply, payload) => {
if (!options.match(request)) {
return
}
if (request.queryRunner.isReleased) {
return
}
if (options.transaction && request.queryRunner.isTransactionActive) {
options.respIsError(payload) ? await request.queryRunner.rollbackTransaction() : await request.queryRunner.commitTransaction()
}
await request.queryRunner.release()
})
fastify.addHook('onError', async (request) => {
if (!options.match(request)) {
return
}
if (request.queryRunner.isReleased) {
return
}
if (options.transaction && request.queryRunner.isTransactionActive) {
await request.queryRunner.rollbackTransaction()
}
await request.queryRunner.release()
})
done()
}
module.exports = fp(fastifyTypeORMQueryRunner, {
fastify: '4.x',
name: '@web-server-userland/fastify-typeorm-query-runner'
})