-
-
Notifications
You must be signed in to change notification settings - Fork 229
/
functionalRouterHelpers.tsx
102 lines (97 loc) · 2.81 KB
/
functionalRouterHelpers.tsx
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import { FunctionalRouter } from "./FunctionalRouter.js"
import { Request, Response } from "express"
import * as db from "../db/db.js"
export function getRouteWithROTransaction<T>(
router: FunctionalRouter,
targetPath: string,
handler: (
req: Request,
res: Response,
trx: db.KnexReadonlyTransaction
) => Promise<T>
) {
return router.get(targetPath, (req: Request, res: Response) => {
return db.knexReadonlyTransaction((transaction) =>
handler(req, res, transaction)
)
})
}
/** Usually get routes should be idempotent (caching and retry reasons among others),
but for example the gdoc preview route is not because it updates the gdoc in the DB after
fetching it from the google API.
*/
export function getRouteNonIdempotentWithRWTransaction<T>(
router: FunctionalRouter,
targetPath: string,
handler: (
req: Request,
res: Response,
trx: db.KnexReadWriteTransaction
) => Promise<T>
) {
return router.get(targetPath, (req: Request, res: Response) => {
return db.knexReadWriteTransaction((transaction) =>
handler(req, res, transaction)
)
})
}
export function postRouteWithRWTransaction<T>(
router: FunctionalRouter,
targetPath: string,
handler: (
req: Request,
res: Response,
trx: db.KnexReadWriteTransaction
) => Promise<T>
) {
return router.post(targetPath, (req: Request, res: Response) => {
return db.knexReadWriteTransaction((transaction) =>
handler(req, res, transaction)
)
})
}
export function putRouteWithRWTransaction<T>(
router: FunctionalRouter,
targetPath: string,
handler: (
req: Request,
res: Response,
trx: db.KnexReadWriteTransaction
) => Promise<T>
) {
return router.put(targetPath, (req: Request, res: Response) => {
return db.knexReadWriteTransaction((transaction) =>
handler(req, res, transaction)
)
})
}
export function patchRouteWithRWTransaction<T>(
router: FunctionalRouter,
targetPath: string,
handler: (
req: Request,
res: Response,
trx: db.KnexReadWriteTransaction
) => Promise<T>
) {
return router.patch(targetPath, (req: Request, res: Response) => {
return db.knexReadWriteTransaction((transaction) =>
handler(req, res, transaction)
)
})
}
export function deleteRouteWithRWTransaction<T>(
router: FunctionalRouter,
targetPath: string,
handler: (
req: Request,
res: Response,
trx: db.KnexReadWriteTransaction
) => Promise<T>
) {
return router.delete(targetPath, (req: Request, res: Response) => {
return db.knexReadWriteTransaction((transaction) =>
handler(req, res, transaction)
)
})
}