@defra/forms-engine-plugin 4.0.61 → 4.1.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 (56) hide show
  1. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -17
  2. package/.server/server/plugins/engine/components/PaymentField.js +12 -3
  3. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  4. package/.server/server/plugins/engine/helpers.d.ts +1 -0
  5. package/.server/server/plugins/engine/plugin.js +3 -1
  6. package/.server/server/plugins/engine/plugin.js.map +1 -1
  7. package/.server/server/plugins/engine/routes/payment-helper.d.ts +3 -1
  8. package/.server/server/plugins/engine/routes/payment-helper.js +5 -5
  9. package/.server/server/plugins/engine/routes/payment-helper.js.map +1 -1
  10. package/.server/server/plugins/engine/routes/payment-helper.test.js +4 -2
  11. package/.server/server/plugins/engine/routes/payment-helper.test.js.map +1 -1
  12. package/.server/server/plugins/engine/routes/payment.js +7 -1
  13. package/.server/server/plugins/engine/routes/payment.js.map +1 -1
  14. package/.server/server/plugins/engine/services/formsService.d.ts +7 -0
  15. package/.server/server/plugins/engine/services/formsService.js +11 -0
  16. package/.server/server/plugins/engine/services/formsService.js.map +1 -1
  17. package/.server/server/plugins/engine/services/formsService.test.js +4 -1
  18. package/.server/server/plugins/engine/services/formsService.test.js.map +1 -1
  19. package/.server/server/plugins/engine/types.d.ts +5 -2
  20. package/.server/server/plugins/engine/types.js.map +1 -1
  21. package/.server/server/plugins/payment/helper.d.ts +4 -11
  22. package/.server/server/plugins/payment/helper.js +11 -19
  23. package/.server/server/plugins/payment/helper.js.map +1 -1
  24. package/.server/server/plugins/payment/helper.test.js +1 -22
  25. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  26. package/.server/server/plugins/payment/service.d.ts +3 -3
  27. package/.server/server/plugins/payment/service.js +25 -15
  28. package/.server/server/plugins/payment/service.js.map +1 -1
  29. package/.server/server/plugins/payment/service.test.js +8 -6
  30. package/.server/server/plugins/payment/service.test.js.map +1 -1
  31. package/.server/server/types.d.ts +1 -0
  32. package/.server/server/types.js.map +1 -1
  33. package/.server/server/utils/file-form-service.js +10 -0
  34. package/.server/server/utils/file-form-service.js.map +1 -1
  35. package/.server/server/utils/file-form-service.test.js +5 -0
  36. package/.server/server/utils/file-form-service.test.js.map +1 -1
  37. package/.server/typings/hapi/index.d.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/server/plugins/engine/beta/form-context.test.ts +2 -1
  40. package/src/server/plugins/engine/components/PaymentField.test.ts +139 -5
  41. package/src/server/plugins/engine/components/PaymentField.ts +29 -21
  42. package/src/server/plugins/engine/plugin.ts +3 -1
  43. package/src/server/plugins/engine/routes/payment-helper.js +9 -5
  44. package/src/server/plugins/engine/routes/payment-helper.test.js +4 -1
  45. package/src/server/plugins/engine/routes/payment.js +8 -1
  46. package/src/server/plugins/engine/services/formsService.js +11 -0
  47. package/src/server/plugins/engine/services/formsService.test.js +6 -1
  48. package/src/server/plugins/engine/types.ts +6 -1
  49. package/src/server/plugins/payment/helper.js +15 -23
  50. package/src/server/plugins/payment/helper.test.js +1 -32
  51. package/src/server/plugins/payment/service.js +42 -28
  52. package/src/server/plugins/payment/service.test.js +22 -24
  53. package/src/server/types.ts +1 -0
  54. package/src/server/utils/file-form-service.js +11 -0
  55. package/src/server/utils/file-form-service.test.js +13 -0
  56. package/src/typings/hapi/index.d.ts +1 -0
@@ -40,7 +40,7 @@ export class PaymentService {
40
40
  * @param {string} returnUrl
41
41
  * @param {string} reference
42
42
  * @param {boolean} isLivePayment
43
- * @param {{ formId: string, slug: string }} metadata
43
+ * @param {{ formId: string, slug: string } | undefined } metadata
44
44
  */
45
45
  async createPayment(
46
46
  amount,
@@ -50,30 +50,42 @@ export class PaymentService {
50
50
  isLivePayment,
51
51
  metadata
52
52
  ) {
53
- const response = await this.postToPayProvider({
54
- amount,
55
- description,
56
- reference,
57
- metadata,
58
- return_url: returnUrl,
59
- delayed_capture: true
60
- })
61
-
62
- logger.info(
63
- buildPaymentInfo(
64
- 'create-payment',
65
- 'success',
66
- `amount=${convertPenceToPounds(amount)}`,
67
- isLivePayment,
68
- response.payment_id
69
- ),
70
- `[payment] Created payment and user taken to enter pre-auth details for paymentId=${response.payment_id}`
71
- )
72
-
73
- return {
74
- paymentId: response.payment_id,
75
- paymentUrl: response._links.next_url.href
53
+ try {
54
+ const response = await this.postToPayProvider({
55
+ amount,
56
+ description,
57
+ reference,
58
+ metadata,
59
+ return_url: returnUrl,
60
+ delayed_capture: true
61
+ })
62
+
63
+ logger.info(
64
+ buildPaymentInfo(
65
+ 'create-payment',
66
+ 'success',
67
+ `amount=${convertPenceToPounds(amount)}`,
68
+ isLivePayment,
69
+ response.payment_id
70
+ ),
71
+ `[payment] Created payment and user taken to enter pre-auth details for paymentId=${response.payment_id}`
72
+ )
73
+
74
+ return {
75
+ paymentId: response.payment_id,
76
+ paymentUrl: response._links.next_url.href
77
+ }
78
+ } catch (err) {
79
+ const error =
80
+ /** @type {{ output?: { payload?: any }, message?: any }} */ (err)
81
+ if (isLivePayment) {
82
+ logger.error(
83
+ error.output?.payload ?? error.message,
84
+ `[payment] Failed to create payment session for reference ${reference}`
85
+ )
86
+ }
76
87
  }
88
+ return undefined
77
89
  }
78
90
 
79
91
  /**
@@ -207,10 +219,12 @@ export class PaymentService {
207
219
  return response.payload
208
220
  } catch (err) {
209
221
  const error = /** @type {Error} */ (err)
210
- logger.error(
211
- error,
212
- `[payment] Error creating payment for reference=${payload.reference}: ${error.message}`
213
- )
222
+ if (!error.message.includes('401 Unauthorized')) {
223
+ logger.error(
224
+ error,
225
+ `[payment] Error creating payment for reference=${payload.reference}: ${error.message}`
226
+ )
227
+ }
214
228
  throw err
215
229
  }
216
230
  }
@@ -44,11 +44,11 @@ describe('payment service', () => {
44
44
  false,
45
45
  metadata
46
46
  )
47
- expect(payment.paymentId).toBe('payment-id-12345')
48
- expect(payment.paymentUrl).toBe('http://next-url-href/payment')
47
+ expect(payment?.paymentId).toBe('payment-id-12345')
48
+ expect(payment?.paymentUrl).toBe('http://next-url-href/payment')
49
49
  })
50
50
 
51
- it('should throw if fails to create a payment - failed API call', async () => {
51
+ it('should return undefined if fails to create a payment - failed API call', async () => {
52
52
  jest
53
53
  .mocked(postJson)
54
54
  .mockRejectedValueOnce(new Error('internal creation error'))
@@ -56,19 +56,18 @@ describe('payment service', () => {
56
56
  const referenceNumber = 'ABC-DEF-123'
57
57
  const returnUrl = 'http://localhost:3009/payment-callback-handler'
58
58
  const metadata = { formId: 'form-id', slug: 'my-form-slug' }
59
- await expect(() =>
60
- service.createPayment(
61
- 100,
62
- 'Payment description',
63
- returnUrl,
64
- referenceNumber,
65
- false,
66
- metadata
67
- )
68
- ).rejects.toThrow('internal creation error')
59
+ const res = await service.createPayment(
60
+ 100,
61
+ 'Payment description',
62
+ returnUrl,
63
+ referenceNumber,
64
+ false,
65
+ metadata
66
+ )
67
+ expect(res).toBeUndefined()
69
68
  })
70
69
 
71
- it('should throw if fails to create a payment - bad result from API call', async () => {
70
+ it('should return undefined if fails to create a payment - bad result from API call', async () => {
72
71
  const createPaymentResult = {
73
72
  state: {
74
73
  status: 'failed'
@@ -86,16 +85,15 @@ describe('payment service', () => {
86
85
  const referenceNumber = 'ABC-DEF-123'
87
86
  const returnUrl = 'http://localhost:3009/payment-callback-handler'
88
87
  const metadata = { formId: 'form-id', slug: 'my-form-slug' }
89
- await expect(() =>
90
- service.createPayment(
91
- 100,
92
- 'Payment description',
93
- returnUrl,
94
- referenceNumber,
95
- false,
96
- metadata
97
- )
98
- ).rejects.toThrow('Failed to create payment')
88
+ const res = await service.createPayment(
89
+ 100,
90
+ 'Payment description',
91
+ returnUrl,
92
+ referenceNumber,
93
+ false,
94
+ metadata
95
+ )
96
+ expect(res).toBeUndefined()
99
97
  })
100
98
  })
101
99
 
@@ -29,6 +29,7 @@ export interface FormsService {
29
29
  id: string,
30
30
  state: FormStatus
31
31
  ) => Promise<FormDefinition | undefined>
32
+ getFormSecret: (formId: string, secretName: string) => Promise<string>
32
33
  }
33
34
 
34
35
  export interface FormSubmissionService {
@@ -160,6 +160,17 @@ export class FileFormService {
160
160
  */
161
161
  getFormDefinition: (id) => {
162
162
  return Promise.resolve(this.getFormDefinition(id))
163
+ },
164
+
165
+ /**
166
+ * Get a form secret
167
+ * @param {string} _formId
168
+ * @param {string} _secretName
169
+ * @returns {Promise<string>}
170
+ */
171
+ getFormSecret: (_formId, _secretName) => {
172
+ // For local env only
173
+ return Promise.resolve(process.env.PAYMENT_PROVIDER_API_KEY_TEST ?? '')
163
174
  }
164
175
  }
165
176
  }
@@ -101,6 +101,19 @@ describe('File-form-service', () => {
101
101
  )
102
102
  expect(res3?.name).toBe('All components')
103
103
  expect(res3?.startPage).toBe('/all-components')
104
+
105
+ const res4 = await interfaceImpl.getFormSecret(
106
+ '95e92559-968d-44ae-8666-2b1ad3dffd31',
107
+ 'my-secret-name'
108
+ )
109
+ expect(res4).toBe('test-api-key')
110
+
111
+ delete process.env.PAYMENT_PROVIDER_API_KEY_TEST
112
+ const res5 = await interfaceImpl.getFormSecret(
113
+ '95e92559-968d-44ae-8666-2b1ad3dffd31',
114
+ 'my-secret-name'
115
+ )
116
+ expect(res5).toBe('')
104
117
  })
105
118
  })
106
119
 
@@ -39,6 +39,7 @@ declare module '@hapi/hapi' {
39
39
  ) => Record<string, unknown> | Promise<Record<string, unknown>>
40
40
  saveAndExit?: PluginOptions['saveAndExit']
41
41
  baseUrl: string
42
+ services: PluginOptions['services']
42
43
  }
43
44
  }
44
45