@defra/forms-engine-plugin 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/.server/server/plugins/engine/index.js +1 -1
  2. package/.server/server/plugins/engine/index.js.map +1 -1
  3. package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +1 -0
  4. package/.server/server/plugins/engine/models/SummaryViewModel.js +1 -0
  5. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  6. package/.server/server/plugins/engine/options.js +5 -1
  7. package/.server/server/plugins/engine/options.js.map +1 -1
  8. package/.server/server/plugins/engine/options.test.js +20 -0
  9. package/.server/server/plugins/engine/options.test.js.map +1 -1
  10. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +5 -0
  11. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +27 -1
  12. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  13. package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +2 -0
  14. package/.server/server/plugins/engine/pageControllers/StartPageController.js +3 -0
  15. package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -1
  16. package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +1 -0
  17. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +4 -0
  18. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  19. package/.server/server/plugins/engine/plugin.js +5 -2
  20. package/.server/server/plugins/engine/plugin.js.map +1 -1
  21. package/.server/server/plugins/engine/routes/exit.d.ts +46 -0
  22. package/.server/server/plugins/engine/routes/exit.js +36 -0
  23. package/.server/server/plugins/engine/routes/exit.js.map +1 -0
  24. package/.server/server/plugins/engine/types.d.ts +6 -2
  25. package/.server/server/plugins/engine/types.js.map +1 -1
  26. package/.server/server/plugins/engine/views/exit.html +31 -0
  27. package/.server/server/plugins/engine/views/partials/form.html +17 -6
  28. package/.server/server/routes/types.d.ts +2 -1
  29. package/.server/server/routes/types.js +1 -0
  30. package/.server/server/routes/types.js.map +1 -1
  31. package/.server/server/schemas/index.js +1 -1
  32. package/.server/server/schemas/index.js.map +1 -1
  33. package/.server/server/services/cacheService.d.ts +2 -0
  34. package/.server/server/services/cacheService.js +9 -5
  35. package/.server/server/services/cacheService.js.map +1 -1
  36. package/package.json +1 -1
  37. package/src/server/index.test.ts +39 -0
  38. package/src/server/plugins/engine/components/helpers.test.ts +31 -0
  39. package/src/server/plugins/engine/index.ts +1 -3
  40. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +59 -0
  41. package/src/server/plugins/engine/models/SummaryViewModel.ts +1 -0
  42. package/src/server/plugins/engine/options.js +5 -1
  43. package/src/server/plugins/engine/options.test.js +20 -0
  44. package/src/server/plugins/engine/pageControllers/PageController.test.ts +25 -0
  45. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +178 -1
  46. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +28 -1
  47. package/src/server/plugins/engine/pageControllers/StartPageController.ts +4 -0
  48. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +5 -0
  49. package/src/server/plugins/engine/plugin.ts +5 -1
  50. package/src/server/plugins/engine/routes/exit.ts +47 -0
  51. package/src/server/plugins/engine/types.ts +10 -4
  52. package/src/server/plugins/engine/views/exit.html +31 -0
  53. package/src/server/plugins/engine/views/partials/form.html +17 -6
  54. package/src/server/routes/types.ts +2 -1
  55. package/src/server/schemas/index.ts +2 -1
  56. package/src/server/services/cacheService.test.ts +45 -0
  57. package/src/server/services/cacheService.ts +20 -9
@@ -30,6 +30,12 @@ export class CacheService {
30
30
  request: Request | FormRequest | FormRequestPayload
31
31
  ) => Promise<FormSubmissionState | null>
32
32
 
33
+ customPersister?: (
34
+ key: string,
35
+ state: FormSubmissionState,
36
+ request: Request | FormRequest | FormRequestPayload
37
+ ) => Promise<void>
38
+
33
39
  logger: Server['logger']
34
40
 
35
41
  constructor({
@@ -46,9 +52,14 @@ export class CacheService {
46
52
  sessionHydrator?: (
47
53
  request: Request | FormRequest | FormRequestPayload
48
54
  ) => Promise<FormSubmissionState | null>
55
+ sessionPersister?: (
56
+ key: string,
57
+ state: FormSubmissionState,
58
+ request: Request | FormRequest | FormRequestPayload
59
+ ) => Promise<void>
49
60
  }
50
61
  }) {
51
- const { keyGenerator, sessionHydrator } = options ?? {}
62
+ const { keyGenerator, sessionHydrator, sessionPersister } = options ?? {}
52
63
  if (!cacheName) {
53
64
  server.log(
54
65
  'warn',
@@ -57,6 +68,7 @@ export class CacheService {
57
68
  }
58
69
  this.generateKey = keyGenerator ?? this.defaultKeyGenerator.bind(this)
59
70
  this.customFetcher = sessionHydrator ?? undefined
71
+ this.customPersister = sessionPersister ?? undefined
60
72
  this.cache = server.cache({ cache: cacheName, segment: 'formSubmission' })
61
73
  this.logger = server.logger
62
74
  }
@@ -64,18 +76,16 @@ export class CacheService {
64
76
  async getState(
65
77
  request: Request | FormRequest | FormRequestPayload
66
78
  ): Promise<FormSubmissionState> {
67
- let cached = await this.cache.get(this.Key(request))
79
+ const key = this.Key(request)
80
+
81
+ let cached = await this.cache.get(key)
68
82
 
69
83
  // If nothing in Redis, attempt to rehydrate from backend DB
70
84
  if (!cached && this.customFetcher) {
71
85
  const rehydrated = await this.customFetcher(request)
72
86
 
73
87
  if (rehydrated != null) {
74
- await this.cache.set(
75
- this.Key(request),
76
- rehydrated,
77
- config.get('sessionTimeout')
78
- )
88
+ await this.cache.set(key, rehydrated, config.get('sessionTimeout'))
79
89
  cached = await this.getState(request)
80
90
  }
81
91
  }
@@ -91,6 +101,7 @@ export class CacheService {
91
101
  const ttl = config.get('sessionTimeout')
92
102
 
93
103
  await this.cache.set(key, state, ttl)
104
+
94
105
  return this.getState(request)
95
106
  }
96
107
 
@@ -146,8 +157,8 @@ export class CacheService {
146
157
  throw new Error('No session ID found')
147
158
  }
148
159
 
149
- const state = request.params.state ?? ''
150
- const slug = request.params.slug ?? ''
160
+ const state = (request.params.state as string) || ''
161
+ const slug = (request.params.slug as string) || ''
151
162
  return `${request.yar.id}:${state}:${slug}:`
152
163
  }
153
164