-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathplugin.ts
More file actions
126 lines (111 loc) · 3.88 KB
/
plugin.ts
File metadata and controls
126 lines (111 loc) · 3.88 KB
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import {
type Lifecycle,
type Plugin,
type RouteOptions,
type Server,
type ServerRoute
} from '@hapi/hapi'
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
import { validatePluginOptions } from '~/src/server/plugins/engine/options.js'
import { getRoutes as getFileUploadStatusRoutes } from '~/src/server/plugins/engine/routes/file-upload.js'
import { makeLoadFormPreHandler } from '~/src/server/plugins/engine/routes/index.js'
import { getRoutes as getQuestionRoutes } from '~/src/server/plugins/engine/routes/questions.js'
import { getRoutes as getRepeaterItemDeleteRoutes } from '~/src/server/plugins/engine/routes/repeaters/item-delete.js'
import { getRoutes as getRepeaterSummaryRoutes } from '~/src/server/plugins/engine/routes/repeaters/summary.js'
import { type PluginOptions } from '~/src/server/plugins/engine/types.js'
import { registerVision } from '~/src/server/plugins/engine/vision.js'
import { mapPlugin } from '~/src/server/plugins/map/index.js'
import { postcodeLookupPlugin } from '~/src/server/plugins/postcode-lookup/index.js'
import {
type FormRequestPayloadRefs,
type FormRequestRefs
} from '~/src/server/routes/types.js'
import { CacheService } from '~/src/server/services/index.js'
export const plugin = {
name: '@defra/forms-engine-plugin',
dependencies: ['@hapi/crumb', '@hapi/yar', 'hapi-pino'],
multiple: true,
async register(server: Server, options: PluginOptions) {
options = validatePluginOptions(options)
const {
model,
cache,
saveAndExit,
nunjucks: nunjucksOptions,
viewContext,
preparePageEventRequestOptions,
onRequest,
ordnanceSurveyApiKey,
ordnanceSurveyApiSecret
} = options
const cacheService =
typeof cache === 'string'
? new CacheService({ server, cacheName: cache })
: cache
await registerVision(server, options)
// Register the postcode lookup plugin only if we have an OS api key
if (ordnanceSurveyApiKey) {
await server.register({
plugin: postcodeLookupPlugin,
options: {
ordnanceSurveyApiKey
}
})
}
// Register the maps plugin only if we have an OS api key & secret
if (ordnanceSurveyApiKey && ordnanceSurveyApiSecret) {
await server.register({
plugin: mapPlugin,
options: {
ordnanceSurveyApiKey,
ordnanceSurveyApiSecret
}
})
}
server.expose('baseLayoutPath', nunjucksOptions.baseLayoutPath)
server.expose('viewContext', viewContext)
server.expose('cacheService', cacheService)
server.expose('saveAndExit', saveAndExit)
server.app.model = model
// In-memory cache of FormModel items, exposed
// (for testing purposes) through `server.app.models`
const itemCache = new Map<string, { model: FormModel; updatedAt: Date }>()
server.app.models = itemCache
const loadFormPreHandler = makeLoadFormPreHandler(server, options)
const getRouteOptions: RouteOptions<FormRequestRefs> = {
pre: [
{
method:
loadFormPreHandler as unknown as Lifecycle.Method<FormRequestRefs>
}
]
}
const postRouteOptions: RouteOptions<FormRequestPayloadRefs> = {
payload: {
parse: true
},
pre: [
{
method:
loadFormPreHandler as unknown as Lifecycle.Method<FormRequestPayloadRefs>
}
]
}
const routes = [
...getQuestionRoutes(
getRouteOptions,
postRouteOptions,
preparePageEventRequestOptions,
onRequest
),
...getRepeaterSummaryRoutes(getRouteOptions, postRouteOptions, onRequest),
...getRepeaterItemDeleteRoutes(
getRouteOptions,
postRouteOptions,
onRequest
),
...getFileUploadStatusRoutes()
]
server.route(routes as unknown as ServerRoute[]) // TODO
}
} satisfies Plugin<PluginOptions>