@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.
- package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -17
- package/.server/server/plugins/engine/components/PaymentField.js +12 -3
- package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
- package/.server/server/plugins/engine/helpers.d.ts +1 -0
- package/.server/server/plugins/engine/plugin.js +3 -1
- package/.server/server/plugins/engine/plugin.js.map +1 -1
- package/.server/server/plugins/engine/routes/payment-helper.d.ts +3 -1
- package/.server/server/plugins/engine/routes/payment-helper.js +5 -5
- package/.server/server/plugins/engine/routes/payment-helper.js.map +1 -1
- package/.server/server/plugins/engine/routes/payment-helper.test.js +4 -2
- package/.server/server/plugins/engine/routes/payment-helper.test.js.map +1 -1
- package/.server/server/plugins/engine/routes/payment.js +7 -1
- package/.server/server/plugins/engine/routes/payment.js.map +1 -1
- package/.server/server/plugins/engine/services/formsService.d.ts +7 -0
- package/.server/server/plugins/engine/services/formsService.js +11 -0
- package/.server/server/plugins/engine/services/formsService.js.map +1 -1
- package/.server/server/plugins/engine/services/formsService.test.js +4 -1
- package/.server/server/plugins/engine/services/formsService.test.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +5 -2
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/payment/helper.d.ts +4 -11
- package/.server/server/plugins/payment/helper.js +11 -19
- package/.server/server/plugins/payment/helper.js.map +1 -1
- package/.server/server/plugins/payment/helper.test.js +1 -22
- package/.server/server/plugins/payment/helper.test.js.map +1 -1
- package/.server/server/plugins/payment/service.d.ts +3 -3
- package/.server/server/plugins/payment/service.js +25 -15
- package/.server/server/plugins/payment/service.js.map +1 -1
- package/.server/server/plugins/payment/service.test.js +8 -6
- package/.server/server/plugins/payment/service.test.js.map +1 -1
- package/.server/server/types.d.ts +1 -0
- package/.server/server/types.js.map +1 -1
- package/.server/server/utils/file-form-service.js +10 -0
- package/.server/server/utils/file-form-service.js.map +1 -1
- package/.server/server/utils/file-form-service.test.js +5 -0
- package/.server/server/utils/file-form-service.test.js.map +1 -1
- package/.server/typings/hapi/index.d.js.map +1 -1
- package/package.json +1 -1
- package/src/server/plugins/engine/beta/form-context.test.ts +2 -1
- package/src/server/plugins/engine/components/PaymentField.test.ts +139 -5
- package/src/server/plugins/engine/components/PaymentField.ts +29 -21
- package/src/server/plugins/engine/plugin.ts +3 -1
- package/src/server/plugins/engine/routes/payment-helper.js +9 -5
- package/src/server/plugins/engine/routes/payment-helper.test.js +4 -1
- package/src/server/plugins/engine/routes/payment.js +8 -1
- package/src/server/plugins/engine/services/formsService.js +11 -0
- package/src/server/plugins/engine/services/formsService.test.js +6 -1
- package/src/server/plugins/engine/types.ts +6 -1
- package/src/server/plugins/payment/helper.js +15 -23
- package/src/server/plugins/payment/helper.test.js +1 -32
- package/src/server/plugins/payment/service.js +42 -28
- package/src/server/plugins/payment/service.test.js +22 -24
- package/src/server/types.ts +1 -0
- package/src/server/utils/file-form-service.js +11 -0
- package/src/server/utils/file-form-service.test.js +13 -0
- 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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
211
|
-
error
|
|
212
|
-
|
|
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
|
|
48
|
-
expect(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
|
|
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
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
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
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
|
package/src/server/types.ts
CHANGED
|
@@ -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
|
|