vona-module-pay-paypal 5.0.4 → 5.0.5

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.
@@ -20,15 +20,23 @@ export declare class PayProviderPaypal extends BeanBase implements IPayProviderE
20
20
  createRefund(input: IPayProviderRefundInput, clientOptions: IPayProviderPaypalClientOptions): Promise<IPayProviderRefundSnapshot>;
21
21
  queryRefund(input: IPayProviderRefundInput, clientOptions: IPayProviderPaypalClientOptions): Promise<IPayProviderRefundSnapshot>;
22
22
  verifyWebhook(input: IPayProviderWebhookInput, clientOptions: IPayProviderPaypalClientOptions): Promise<IPayProviderVerifiedWebhook>;
23
+ private _mapRefundWebhook;
24
+ private _mapCaptureRefundedWebhook;
25
+ private _mapCaptureRefundedRefund;
26
+ private _ignoredCaptureRefund;
23
27
  private _mapWebhook;
24
28
  private _inputFromOrder;
25
29
  private _mapOrder;
30
+ private _approvalUrl;
26
31
  private _mapRefund;
32
+ private _isDefinitiveRefundRejection;
33
+ private _isPaypalNotFound;
27
34
  private _gateway;
28
35
  private _gatewayOptions;
29
36
  private _throwGatewayError;
30
37
  private _assertReady;
31
38
  private _assertMerchant;
39
+ private _merchantReference;
32
40
  }
33
41
  declare module 'vona-module-a-pay' {
34
42
  interface IPayProviderRecord {
@@ -1 +1 @@
1
- {"version":3,"file":"payProvider.paypal.d.ts","sourceRoot":"","sources":["../../src/bean/payProvider.paypal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAU,MAAM,MAAM,CAAC;AAIxC,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,yBAAyB,CAAC;AAIrF,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;CAAG;AAEnF,MAAM,WAAW,+BAAgC,SAAQ,yBAAyB;IAChF,gBAAgB,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACrF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AASD,MAAM,WAAW,yBAA0B,SAAQ,4BAA4B,CAC7E,8BAA8B,EAC9B,+BAA+B,CAChC;CAAG;AAEJ,qBAwBa,iBACX,SAAQ,QACR,YAAW,mBAAmB,CAAC,+BAA+B,CAAC;IAEzD,YAAY,CAChB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;IA0CjC,cAAc,CAClB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;IAajC,YAAY,CAChB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;IASjC,YAAY,CAChB,KAAK,EAAE,uBAAuB,EAC9B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,0BAA0B,CAAC;IAoBhC,WAAW,CACf,KAAK,EAAE,uBAAuB,EAC9B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,0BAA0B,CAAC;IAahC,aAAa,CACjB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;YAezB,WAAW;IA+EzB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,SAAS;IAkEjB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,eAAe;CAaxB;AAuED,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAiB,kBAAkB;QACjC,mBAAmB,EAAE,yBAAyB,CAAC;KAChD;CACF"}
1
+ {"version":3,"file":"payProvider.paypal.d.ts","sourceRoot":"","sources":["../../src/bean/payProvider.paypal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAU,MAAM,MAAM,CAAC;AAIxC,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,yBAAyB,CAAC;AAIrF,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;CAAG;AAEnF,MAAM,WAAW,+BAAgC,SAAQ,yBAAyB;IAChF,gBAAgB,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACrF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AASD,MAAM,WAAW,yBAA0B,SAAQ,4BAA4B,CAC7E,8BAA8B,EAC9B,+BAA+B,CAChC;CAAG;AAEJ,qBAwBa,iBACX,SAAQ,QACR,YAAW,mBAAmB,CAAC,+BAA+B,CAAC;IAEzD,YAAY,CAChB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;IAsCjC,cAAc,CAClB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;IAcjC,YAAY,CAChB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;IASjC,YAAY,CAChB,KAAK,EAAE,uBAAuB,EAC9B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,0BAA0B,CAAC;IAyBhC,WAAW,CACf,KAAK,EAAE,uBAAuB,EAC9B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,0BAA0B,CAAC;IAahC,aAAa,CACjB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;YAezB,iBAAiB;YAsDjB,0BAA0B;YAuD1B,yBAAyB;IAsDvC,OAAO,CAAC,qBAAqB;YAiBf,WAAW;YA+CX,eAAe;IAqC7B,OAAO,CAAC,SAAS;IAwEjB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,4BAA4B;IAIpC,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,kBAAkB;CAU3B;AAmED,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAiB,kBAAkB;QACjC,mBAAmB,EAAE,yBAAyB,CAAC;KAChD;CACF"}
package/dist/index.js CHANGED
@@ -1,10 +1,11 @@
1
- import { PaymentsController, OrdersController, Client, Environment, CheckoutPaymentIntent, OrderStatus } from '@cabloy/paypal-server-sdk';
1
+ import { PaymentsController, OrdersController, Client, Environment, CheckoutPaymentIntent, OrderStatus, ApiError } from '@cabloy/paypal-server-sdk';
2
2
  import { useApp, BeanInfo, BeanBase, BeanScopeBase } from 'vona';
3
3
  import { __decorate } from 'tslib';
4
4
  import { PayProvider } from 'vona-module-a-pay';
5
5
  import { z } from 'zod';
6
6
  import { Scope } from 'vona-module-a-bean';
7
7
 
8
+ const PaypalRequestTimeoutMilliseconds = 15_000;
8
9
  class PaypalGatewayError extends Error {
9
10
  constructor(status, message) {
10
11
  super(message);
@@ -26,6 +27,9 @@ function createPaypalGateway(fetcher) {
26
27
  async refundCapturedPayment(options, input) {
27
28
  return (await new PaymentsController(createClient(options)).refundCapturedPayment(input)).result;
28
29
  },
30
+ async getCapturedPayment(options, input) {
31
+ return (await new PaymentsController(createClient(options)).getCapturedPayment(input)).result;
32
+ },
29
33
  async getRefund(options, input) {
30
34
  return (await new PaymentsController(createClient(options)).getRefund(input)).result;
31
35
  },
@@ -82,7 +86,7 @@ function createClient(options) {
82
86
  oAuthClientId: options.clientId,
83
87
  oAuthClientSecret: options.clientSecret
84
88
  },
85
- timeout: 0,
89
+ timeout: PaypalRequestTimeoutMilliseconds,
86
90
  environment: options.environment === 'live' ? Environment.Production : Environment.Sandbox
87
91
  });
88
92
  }
@@ -107,7 +111,7 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
107
111
  async startPayment(input, clientOptions) {
108
112
  if (input.providerOrderId) return await this.queryPayment(input, clientOptions);
109
113
  if (!input.returnUrl || !input.cancelUrl) {
110
- this.app.throw(422, 'PayPal payment requires return and cancel URLs');
114
+ this.app.throw(500, 'PayPal payment requires return and cancel URLs');
111
115
  }
112
116
  this._assertReady(clientOptions);
113
117
  const order = await this._gateway(clientOptions).createOrder(this._gatewayOptions(clientOptions), {
@@ -119,8 +123,8 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
119
123
  cancelUrl: input.cancelUrl
120
124
  },
121
125
  purchaseUnits: [{
122
- customId: String(input.paymentSessionId),
123
- invoiceId: input.businessReference,
126
+ customId: input.providerCorrelationReference,
127
+ invoiceId: input.providerInvoiceReference,
124
128
  amount: {
125
129
  currencyCode: input.currency,
126
130
  value: formatMinorAmount(input.amountMinor, input.currency)
@@ -129,7 +133,7 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
129
133
  }
130
134
  });
131
135
  const orderRecord = asRecord(order);
132
- const approvalUrl = readString(asArray(orderRecord.links).map(asRecord).find(item => item.rel === 'approve')?.href);
136
+ const approvalUrl = this._approvalUrl(orderRecord);
133
137
  const orderId = readString(orderRecord.id);
134
138
  if (!orderId || !approvalUrl) this.app.throw(502, 'PayPal did not return an approval order');
135
139
  return {
@@ -147,7 +151,8 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
147
151
  if (!input.providerOrderId) this.app.throw(409, 'PayPal payment has no provider order');
148
152
  const order = await this._gateway(clientOptions).captureOrder(this._gatewayOptions(clientOptions), {
149
153
  id: input.providerOrderId,
150
- paypalRequestId: input.idempotencyKey
154
+ paypalRequestId: input.idempotencyKey,
155
+ prefer: 'return=representation'
151
156
  });
152
157
  return this._mapOrder(order, input, clientOptions);
153
158
  }
@@ -161,19 +166,26 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
161
166
  }
162
167
  async createRefund(input, clientOptions) {
163
168
  this._assertReady(clientOptions);
164
- const refund = await this._gateway(clientOptions).refundCapturedPayment(this._gatewayOptions(clientOptions), {
165
- captureId: input.providerCaptureId,
166
- paypalRequestId: input.idempotencyKey,
167
- body: {
168
- amount: {
169
- currencyCode: input.currency,
170
- value: formatMinorAmount(input.amountMinor, input.currency)
171
- },
172
- customId: String(input.refundOperationId),
173
- invoiceId: input.businessReference
174
- }
175
- });
176
- return this._mapRefund(refund, input, clientOptions);
169
+ try {
170
+ const refund = await this._gateway(clientOptions).refundCapturedPayment(this._gatewayOptions(clientOptions), {
171
+ captureId: input.providerCaptureId,
172
+ paypalRequestId: input.idempotencyKey,
173
+ body: {
174
+ amount: {
175
+ currencyCode: input.currency,
176
+ value: formatMinorAmount(input.amountMinor, input.currency)
177
+ },
178
+ customId: input.providerCorrelationReference,
179
+ invoiceId: input.providerInvoiceReference
180
+ }
181
+ });
182
+ return this._mapRefund(refund, input, clientOptions);
183
+ } catch (error) {
184
+ if (this._isDefinitiveRefundRejection(error)) return {
185
+ state: 'failed'
186
+ };
187
+ throw error;
188
+ }
177
189
  }
178
190
  async queryRefund(input, clientOptions) {
179
191
  this._assertReady(clientOptions);
@@ -194,42 +206,140 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
194
206
  }
195
207
  return await this._mapWebhook(webhook.data, clientOptions);
196
208
  }
209
+ async _mapRefundWebhook(event, resource, resourceId, clientOptions) {
210
+ const captureId = readNestedString(resource, ['supplementary_data', 'related_ids', 'capture_id']);
211
+ if (!captureId) this.app.throw(400, 'PayPal refund webhook has no capture identifier');
212
+ const refundByProviderId = await this.$scope.pay.model.refundOperation.get({
213
+ providerRefundId: resourceId
214
+ });
215
+ const customId = readString(readField(resource, 'customId', 'custom_id'));
216
+ const refund = refundByProviderId ?? (customId ? await this.$scope.pay.model.refundOperation.get({
217
+ providerCorrelationReference: customId
218
+ }) : undefined);
219
+ if (!refund) this.app.throw(400, 'PayPal refund webhook is not correlated');
220
+ const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
221
+ if (!session || session.providerCaptureId !== captureId) {
222
+ this.app.throw(409, 'PayPal refund webhook capture conflicts');
223
+ }
224
+ const snapshot = this._mapRefund(resource, {
225
+ paymentSessionId: session.id,
226
+ refundOperationId: refund.id,
227
+ businessReference: refund.businessReference,
228
+ providerInvoiceReference: refund.providerInvoiceReference,
229
+ providerCorrelationReference: refund.providerCorrelationReference,
230
+ idempotencyKey: '',
231
+ amountMinor: refund.amountMinor,
232
+ currency: refund.currency,
233
+ providerCaptureId: captureId,
234
+ providerRefundId: resourceId
235
+ }, clientOptions);
236
+ return {
237
+ eventId: event.id,
238
+ eventType: event.event_type,
239
+ refundOperationId: refund.id,
240
+ refund: snapshot,
241
+ summary: {
242
+ amountMinor: refund.amountMinor,
243
+ currency: refund.currency
244
+ }
245
+ };
246
+ }
247
+ async _mapCaptureRefundedWebhook(event, resource, resourceId, clientOptions) {
248
+ const relatedCaptureId = readNestedString(resource, ['supplementary_data', 'related_ids', 'capture_id']);
249
+ const relatedRefundId = readNestedString(resource, ['supplementary_data', 'related_ids', 'refund_id']);
250
+ if (relatedRefundId) {
251
+ return await this._mapCaptureRefundedRefund(event, await this._gateway(clientOptions).getRefund(this._gatewayOptions(clientOptions), {
252
+ refundId: relatedRefundId
253
+ }), relatedRefundId, relatedCaptureId, clientOptions);
254
+ }
255
+ try {
256
+ const capture = asRecord(await this._gateway(clientOptions).getCapturedPayment(this._gatewayOptions(clientOptions), {
257
+ captureId: resourceId
258
+ }));
259
+ const captureId = readString(capture.id);
260
+ if (!captureId || captureId !== resourceId) {
261
+ this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
262
+ }
263
+ if (relatedCaptureId && relatedCaptureId !== captureId) {
264
+ this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
265
+ }
266
+ return this._ignoredCaptureRefund(event, resource, captureId);
267
+ } catch (error) {
268
+ if (!this._isPaypalNotFound(error)) throw error;
269
+ }
270
+ return await this._mapCaptureRefundedRefund(event, await this._gateway(clientOptions).getRefund(this._gatewayOptions(clientOptions), {
271
+ refundId: resourceId
272
+ }), resourceId, relatedCaptureId, clientOptions);
273
+ }
274
+ async _mapCaptureRefundedRefund(event, refundResource, refundId, relatedCaptureId, clientOptions) {
275
+ const refundRecord = asRecord(refundResource);
276
+ if (readString(refundRecord.id) !== refundId) {
277
+ this.app.throw(409, 'PayPal capture refund webhook refund conflicts');
278
+ }
279
+ const customId = readString(readField(refundRecord, 'customId', 'custom_id'));
280
+ const invoiceId = readString(readField(refundRecord, 'invoiceId', 'invoice_id'));
281
+ if (!customId || !invoiceId) {
282
+ this.app.throw(400, 'PayPal capture refund webhook is not correlated');
283
+ }
284
+ const refund = await this.$scope.pay.model.refundOperation.get({
285
+ providerCorrelationReference: customId
286
+ });
287
+ if (!refund || refund.providerInvoiceReference !== invoiceId) {
288
+ this.app.throw(400, 'PayPal capture refund webhook is not correlated');
289
+ }
290
+ const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
291
+ if (!session?.providerCaptureId) {
292
+ this.app.throw(409, 'PayPal capture refund webhook payment session conflicts');
293
+ }
294
+ if (relatedCaptureId && session.providerCaptureId !== relatedCaptureId) {
295
+ this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
296
+ }
297
+ const snapshot = this._mapRefund(refundRecord, {
298
+ paymentSessionId: session.id,
299
+ refundOperationId: refund.id,
300
+ businessReference: refund.businessReference,
301
+ providerInvoiceReference: refund.providerInvoiceReference,
302
+ providerCorrelationReference: refund.providerCorrelationReference,
303
+ idempotencyKey: '',
304
+ amountMinor: refund.amountMinor,
305
+ currency: refund.currency,
306
+ providerCaptureId: session.providerCaptureId,
307
+ providerRefundId: refundId
308
+ }, clientOptions);
309
+ return {
310
+ eventId: event.id,
311
+ eventType: event.event_type,
312
+ refundOperationId: refund.id,
313
+ refund: snapshot,
314
+ summary: {
315
+ amountMinor: refund.amountMinor,
316
+ currency: refund.currency
317
+ }
318
+ };
319
+ }
320
+ _ignoredCaptureRefund(event, resource, captureId) {
321
+ return {
322
+ eventId: event.id,
323
+ eventType: event.event_type,
324
+ providerCaptureId: captureId,
325
+ ignored: true,
326
+ summary: {
327
+ amountMinor: parsePaypalAmount(resource.amount),
328
+ currency: parsePaypalCurrency(resource.amount)
329
+ }
330
+ };
331
+ }
197
332
  async _mapWebhook(event, clientOptions) {
198
333
  const resource = event.resource;
199
334
  const amount = parsePaypalAmount(resource.amount);
200
335
  const currency = parsePaypalCurrency(resource.amount);
201
336
  const resourceId = readString(resource.id);
202
- if (!resourceId || !amount || !currency) this.app.throw(400, 'PayPal webhook has invalid resource');
203
- if (isRefundEvent(event.event_type)) {
204
- const refundOperationId = readString(readField(resource, 'customId', 'custom_id'));
205
- const captureId = readNestedString(resource, ['supplementary_data', 'related_ids', 'capture_id']);
206
- if (!refundOperationId || !captureId) this.app.throw(400, 'PayPal refund webhook is not correlated');
207
- const refund = await this.$scope.pay.model.refundOperation.getById(refundOperationId);
208
- if (!refund) this.app.throw(404, 'PayPal refund operation not found');
209
- const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
210
- if (!session || session.providerCaptureId !== captureId) {
211
- this.app.throw(409, 'PayPal refund webhook capture conflicts');
212
- }
213
- const snapshot = this._mapRefund(resource, {
214
- paymentSessionId: session.id,
215
- refundOperationId: refund.id,
216
- businessReference: refund.businessReference,
217
- idempotencyKey: '',
218
- amountMinor: refund.amountMinor,
219
- currency: refund.currency,
220
- providerCaptureId: captureId,
221
- providerRefundId: resourceId
222
- }, clientOptions);
223
- return {
224
- eventId: event.id,
225
- eventType: event.event_type,
226
- refundOperationId: refund.id,
227
- refund: snapshot,
228
- summary: {
229
- amountMinor: amount,
230
- currency
231
- }
232
- };
337
+ if (!resourceId || amount === undefined || !currency) this.app.throw(400, 'PayPal webhook has invalid resource');
338
+ if (event.event_type.startsWith('PAYMENT.REFUND.')) {
339
+ return await this._mapRefundWebhook(event, resource, resourceId, clientOptions);
340
+ }
341
+ if (event.event_type === 'PAYMENT.CAPTURE.REFUNDED') {
342
+ return await this._mapCaptureRefundedWebhook(event, resource, resourceId, clientOptions);
233
343
  }
234
344
  if (event.event_type.startsWith('PAYMENT.CAPTURE.')) {
235
345
  const orderId = readNestedString(resource, ['supplementaryData', 'relatedIds', 'orderId']);
@@ -237,7 +347,7 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
237
347
  const order = await this._gateway(clientOptions).getOrder(this._gatewayOptions(clientOptions), {
238
348
  id: orderId
239
349
  });
240
- const input = this._inputFromOrder(order, orderId);
350
+ const input = await this._inputFromOrder(order, orderId);
241
351
  const payment = this._mapOrder(order, input, clientOptions);
242
352
  if (!['succeeded', 'failed', 'cancelled'].includes(payment.state)) {
243
353
  this.app.throw(400, 'PayPal capture webhook is not terminal');
@@ -258,20 +368,28 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
258
368
  }
259
369
  this.app.throw(400, 'PayPal webhook event type is unsupported');
260
370
  }
261
- _inputFromOrder(order, providerOrderId) {
371
+ async _inputFromOrder(order, providerOrderId) {
262
372
  const orderRecord = asRecord(order);
263
373
  const unit = asArray(readField(orderRecord, 'purchaseUnits', 'purchase_units'))[0];
264
374
  const unitRecord = asRecord(unit);
265
- const customId = readString(readField(unitRecord, 'customId', 'custom_id'));
266
- const businessReference = readString(readField(unitRecord, 'invoiceId', 'invoice_id'));
375
+ const providerCorrelationReference = readString(readField(unitRecord, 'customId', 'custom_id'));
376
+ const providerInvoiceReference = readString(readField(unitRecord, 'invoiceId', 'invoice_id'));
267
377
  const amountMinor = parsePaypalAmount(readField(unitRecord, 'amount'));
268
378
  const currency = parsePaypalCurrency(readField(unitRecord, 'amount'));
269
- if (!customId || !businessReference || amountMinor === undefined || !currency) {
379
+ if (!providerCorrelationReference || !providerInvoiceReference || amountMinor === undefined || !currency) {
380
+ this.app.throw(400, 'PayPal order is not correlated');
381
+ }
382
+ const session = await this.$scope.pay.model.paymentSession.get({
383
+ providerCorrelationReference
384
+ });
385
+ if (!session || session.providerInvoiceReference !== providerInvoiceReference) {
270
386
  this.app.throw(400, 'PayPal order is not correlated');
271
387
  }
272
388
  return {
273
- paymentSessionId: customId,
274
- businessReference,
389
+ paymentSessionId: session.id,
390
+ businessReference: session.businessReference,
391
+ providerInvoiceReference: session.providerInvoiceReference,
392
+ providerCorrelationReference: session.providerCorrelationReference,
275
393
  idempotencyKey: '',
276
394
  amountMinor,
277
395
  currency,
@@ -287,10 +405,10 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
287
405
  const units = asArray(readField(orderRecord, 'purchaseUnits', 'purchase_units'));
288
406
  if (units.length !== 1) this.app.throw(409, 'PayPal order has an invalid purchase-unit count');
289
407
  const unit = asRecord(units[0]);
290
- if (readString(readField(unit, 'customId', 'custom_id')) !== String(input.paymentSessionId) || readString(readField(unit, 'invoiceId', 'invoice_id')) !== input.businessReference || parsePaypalAmount(readField(unit, 'amount')) !== input.amountMinor || parsePaypalCurrency(readField(unit, 'amount')) !== input.currency) {
408
+ if (readString(readField(unit, 'customId', 'custom_id')) !== input.providerCorrelationReference || readString(readField(unit, 'invoiceId', 'invoice_id')) !== input.providerInvoiceReference || parsePaypalAmount(readField(unit, 'amount')) !== input.amountMinor || parsePaypalCurrency(readField(unit, 'amount')) !== input.currency) {
291
409
  this.app.throw(409, 'PayPal order facts conflict with the payment session');
292
410
  }
293
- this._assertMerchant(unit, clientOptions);
411
+ this._assertMerchant(unit, clientOptions, 'order');
294
412
  const captures = asArray(readField(asRecord(readField(unit, 'payments')), 'captures'));
295
413
  if (captures.length > 1) this.app.throw(409, 'PayPal order has multiple captures');
296
414
  const capture = asRecord(captures[0]);
@@ -335,22 +453,40 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
335
453
  providerOrderId: orderId
336
454
  };
337
455
  }
456
+ const approvalUrl = this._approvalUrl(orderRecord);
338
457
  return {
339
458
  state: 'requires_action',
340
459
  providerPaymentId: orderId,
341
- providerOrderId: orderId
460
+ providerOrderId: orderId,
461
+ ...(approvalUrl && {
462
+ nextAction: {
463
+ kind: 'redirect',
464
+ url: approvalUrl
465
+ }
466
+ })
342
467
  };
343
468
  }
344
- _mapRefund(refund, input, clientOptions) {
469
+ _approvalUrl(order) {
470
+ return readString(asArray(order.links).map(asRecord).find(item => item.rel === 'approve')?.href);
471
+ }
472
+ _mapRefund(refund, input, clientOptions, requireCorrelationMetadata = true) {
345
473
  const record = asRecord(refund);
346
474
  const providerRefundId = readString(record.id);
347
475
  if (!providerRefundId) this.app.throw(502, 'PayPal refund returned no identifier');
348
- if (input.providerRefundId && input.providerRefundId !== providerRefundId || readString(readField(record, 'customId', 'custom_id')) !== String(input.refundOperationId) || readString(readField(record, 'invoiceId', 'invoice_id')) !== input.businessReference || parsePaypalAmount(record.amount) !== input.amountMinor || parsePaypalCurrency(record.amount) !== input.currency) {
476
+ const customId = readString(readField(record, 'customId', 'custom_id'));
477
+ const invoiceId = readString(readField(record, 'invoiceId', 'invoice_id'));
478
+ if (input.providerRefundId && input.providerRefundId !== providerRefundId || customId && customId !== input.providerCorrelationReference || invoiceId && invoiceId !== input.providerInvoiceReference || requireCorrelationMetadata && (!customId || !invoiceId) || parsePaypalAmount(record.amount) !== input.amountMinor || parsePaypalCurrency(record.amount) !== input.currency) {
349
479
  this.app.throw(409, 'PayPal refund facts conflict with the refund operation');
350
480
  }
351
- this._assertMerchant(record, clientOptions);
481
+ this._assertMerchant(record, clientOptions, 'refund');
352
482
  return mapRefund(readString(record.status), providerRefundId);
353
483
  }
484
+ _isDefinitiveRefundRejection(error) {
485
+ return error instanceof ApiError && error.statusCode === 422;
486
+ }
487
+ _isPaypalNotFound(error) {
488
+ return error instanceof ApiError && error.statusCode === 404;
489
+ }
354
490
  _gateway(clientOptions) {
355
491
  return clientOptions.gateway ?? createPaypalGateway(this.bean.core.fetch);
356
492
  }
@@ -383,12 +519,24 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
383
519
  this.app.throw(503, 'PayPal is not fully configured');
384
520
  }
385
521
  }
386
- _assertMerchant(value, clientOptions) {
387
- const merchantId = readNestedString(value, ['payee', 'merchantId']) ?? readNestedString(value, ['payee', 'merchant_id']) ?? readNestedString(value, ['sellerReceivableBreakdown', 'payee', 'merchantId']) ?? readNestedString(value, ['seller_receivable_breakdown', 'payee', 'merchant_id']);
388
- if (!merchantId || merchantId !== clientOptions.merchantReference) {
522
+ _assertMerchant(value, clientOptions, resourceType) {
523
+ const merchant = this._merchantReference(value, resourceType);
524
+ if (!merchant.observedMerchantReference || merchant.observedMerchantReference !== clientOptions.merchantReference) {
525
+ this.$logger.warn({
526
+ event: 'paypal.merchant_reference_conflict',
527
+ observedMerchantSource: merchant.observedMerchantSource
528
+ });
389
529
  this.app.throw(409, 'PayPal merchant reference conflicts');
390
530
  }
391
531
  }
532
+ _merchantReference(value, resourceType) {
533
+ const field = resourceType === 'order' ? 'payee' : 'payer';
534
+ const merchantReference = readNestedString(value, [field, 'merchantId']) ?? readNestedString(value, [field, 'merchant_id']);
535
+ return {
536
+ observedMerchantReference: merchantReference,
537
+ observedMerchantSource: merchantReference ? `${field}.merchant_id` : 'missing'
538
+ };
539
+ }
392
540
  };
393
541
  PayProviderPaypal = __decorate([PayProvider({
394
542
  base: {
@@ -480,9 +628,6 @@ function parsePaypalCurrency(value) {
480
628
  const currency = readString(readField(amount, 'currencyCode', 'currency_code'));
481
629
  return currency === 'USD' ? currency : undefined;
482
630
  }
483
- function isRefundEvent(eventType) {
484
- return eventType === 'PAYMENT.CAPTURE.REFUNDED' || eventType.startsWith('PAYMENT.REFUND.');
485
- }
486
631
 
487
632
  let ScopeModulePayPaypal = class ScopeModulePayPaypal extends BeanScopeBase {};
488
633
  ScopeModulePayPaypal = __decorate([Scope(), BeanInfo({
@@ -490,5 +635,5 @@ ScopeModulePayPaypal = __decorate([Scope(), BeanInfo({
490
635
  })], ScopeModulePayPaypal);
491
636
  /** scope: end */
492
637
 
493
- export { PayProviderPaypal, PaypalGatewayError, ScopeModulePayPaypal, createPaypalGateway };
638
+ export { PayProviderPaypal, PaypalGatewayError, PaypalRequestTimeoutMilliseconds, ScopeModulePayPaypal, createPaypalGateway };
494
639
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/lib/paypalGateway.ts","../src/bean/payProvider.paypal.ts","../src/.metadata/index.ts"],"sourcesContent":[null,null,null],"names":["PaypalGatewayError","Error","constructor","status","message","createPaypalGateway","fetcher","createOrder","options","input","OrdersController","createClient","result","captureOrder","getOrder","refundCapturedPayment","PaymentsController","getRefund","verifyWebhookSignature","transmissionId","getHeader","headers","transmissionTime","certUrl","authAlgo","transmissionSig","apiBaseUrl","environment","tokenResponse","method","Buffer","from","clientId","clientSecret","toString","body","token","asRecord","ok","json","undefined","accessToken","readString","access_token","response","JSON","stringify","auth_algo","cert_url","transmission_id","transmission_sig","transmission_time","webhook_id","webhookId","webhook_event","verification_status","Client","clientCredentialsAuthCredentials","oAuthClientId","oAuthClientSecret","timeout","Environment","Production","Sandbox","value","key","Array","isArray","app","useApp","PaypalWebhookSchema","z","object","id","string","min","max","event_type","resource","record","unknown","PayProviderPaypal","BeanBase","startPayment","clientOptions","providerOrderId","queryPayment","returnUrl","cancelUrl","throw","_assertReady","order","_gateway","_gatewayOptions","paypalRequestId","idempotencyKey","intent","CheckoutPaymentIntent","Capture","applicationContext","purchaseUnits","customId","String","paymentSessionId","invoiceId","businessReference","amount","currencyCode","currency","formatMinorAmount","amountMinor","orderRecord","approvalUrl","asArray","links","map","find","item","rel","href","orderId","state","providerPaymentId","nextAction","kind","url","confirmPayment","_mapOrder","createRefund","refund","captureId","providerCaptureId","refundOperationId","_mapRefund","queryRefund","providerRefundId","refundId","verifyWebhook","webhook","safeParse","success","error","_throwGatewayError","_mapWebhook","data","event","parsePaypalAmount","parsePaypalCurrency","resourceId","isRefundEvent","readField","readNestedString","$scope","pay","model","refundOperation","getById","session","paymentSession","snapshot","eventId","eventType","summary","startsWith","_inputFromOrder","payment","includes","unit","unitRecord","units","length","_assertMerchant","captures","capture","captureStatus","OrderStatus","Voided","mapRefund","gateway","bean","core","fetch","secretCredential","merchantReference","merchantId","__decorate","PayProvider","base","capabilities","redirectCheckout","embeddedCheckout","automaticCapture","manualCapture","refunds","partialRefunds","webhooks","clients","default","meta","env","PAYPAL_ENVIRONMENT","PAYPAL_CLIENT_ID","PAYPAL_CLIENT_SECRET","PAYPAL_WEBHOOK_ID","PAYPAL_MERCHANT_REFERENCE","__z_BeanInfo","module","Number","isSafeInteger","Math","floor","padStart","keys","path","current","camelToSnake","replace","character","toLowerCase","decimal","test","whole","fractional","split","ScopeModulePayPaypal","BeanScopeBase","Scope"],"mappings":";;;;;;;AA0BM,MAAOA,kBAAmB,SAAQC,KAAK,CAAA;AAC3CC,EAAAA,WAAAA,CACWC,MAAc,EACvBC,OAAe,EAAA;IAEf,KAAK,CAACA,OAAO,CAAC;AAAC,IAAA,IAAA,CAHND,MAAA,GAAA,MAAA;IAAA,IAAA,CAAAA,MAAM,GAANA,MAAM;AAIjB,EAAA;AACD;AAEK,SAAUE,mBAAmBA,CAACC,OAAqB,EAAA;EACvD,OAAO;AACL,IAAA,MAAMC,WAAWA,CAACC,OAAO,EAAEC,KAAK,EAAA;AAC9B,MAAA,OAAO,CAAC,MAAM,IAAIC,gBAAgB,CAACC,YAAY,CAACH,OAAO,CAAC,CAAC,CAACD,WAAW,CAACE,KAAc,CAAC,EAAEG,MAAM;IAC/F,CAAC;AACD,IAAA,MAAMC,YAAYA,CAACL,OAAO,EAAEC,KAAK,EAAA;AAC/B,MAAA,OAAO,CAAC,MAAM,IAAIC,gBAAgB,CAACC,YAAY,CAACH,OAAO,CAAC,CAAC,CAACK,YAAY,CAACJ,KAAc,CAAC,EACnFG,MAAM;IACX,CAAC;AACD,IAAA,MAAME,QAAQA,CAACN,OAAO,EAAEC,KAAK,EAAA;AAC3B,MAAA,OAAO,CAAC,MAAM,IAAIC,gBAAgB,CAACC,YAAY,CAACH,OAAO,CAAC,CAAC,CAACM,QAAQ,CAACL,KAAc,CAAC,EAAEG,MAAM;IAC5F,CAAC;AACD,IAAA,MAAMG,qBAAqBA,CAACP,OAAO,EAAEC,KAAK,EAAA;AACxC,MAAA,OAAO,CACL,MAAM,IAAIO,kBAAkB,CAACL,YAAY,CAACH,OAAO,CAAC,CAAC,CAACO,qBAAqB,CAACN,KAAc,CAAC,EACzFG,MAAM;IACV,CAAC;AACD,IAAA,MAAMK,SAASA,CAACT,OAAO,EAAEC,KAAK,EAAA;AAC5B,MAAA,OAAO,CAAC,MAAM,IAAIO,kBAAkB,CAACL,YAAY,CAACH,OAAO,CAAC,CAAC,CAACS,SAAS,CAACR,KAAc,CAAC,EAAEG,MAAM;IAC/F,CAAC;AACD,IAAA,MAAMM,sBAAsBA,CAACV,OAAO,EAAEC,KAAK,EAAA;MACzC,MAAMU,cAAc,GAAGC,SAAS,CAACX,KAAK,CAACY,OAAO,EAAE,wBAAwB,CAAC;MACzE,MAAMC,gBAAgB,GAAGF,SAAS,CAACX,KAAK,CAACY,OAAO,EAAE,0BAA0B,CAAC;MAC7E,MAAME,OAAO,GAAGH,SAAS,CAACX,KAAK,CAACY,OAAO,EAAE,iBAAiB,CAAC;MAC3D,MAAMG,QAAQ,GAAGJ,SAAS,CAACX,KAAK,CAACY,OAAO,EAAE,kBAAkB,CAAC;MAC7D,MAAMI,eAAe,GAAGL,SAAS,CAACX,KAAK,CAACY,OAAO,EAAE,yBAAyB,CAAC;AAC3E,MAAA,IAAI,CAACF,cAAc,IAAI,CAACG,gBAAgB,IAAI,CAACC,OAAO,IAAI,CAACC,QAAQ,IAAI,CAACC,eAAe,EAAE;AACrF,QAAA,MAAM,IAAIzB,kBAAkB,CAAC,GAAG,EAAE,iDAAiD,CAAC;AACtF,MAAA;MACA,MAAM0B,UAAU,GACdlB,OAAO,CAACmB,WAAW,KAAK,SAAS,GAC7B,kCAAkC,GAClC,0BAA0B;MAChC,MAAMC,aAAa,GAAG,MAAMtB,OAAO,CAAC,CAAA,EAAGoB,UAAU,kBAAkB,EAAE;AACnEG,QAAAA,MAAM,EAAE,MAAM;AACdR,QAAAA,OAAO,EAAE;UACP,eAAe,EAAE,SAASS,MAAM,CAACC,IAAI,CAAC,CAAA,EAAGvB,OAAO,CAACwB,QAAQ,IAAIxB,OAAO,CAACyB,YAAY,CAAA,CAAE,CAAC,CAACC,QAAQ,CAAC,QAAQ,CAAC,CAAA,CAAE;AACzG,UAAA,cAAc,EAAE;SACjB;AACDC,QAAAA,IAAI,EAAE;AACP,OAAA,CAAC;AACF,MAAA,MAAMC,KAAK,GAAGC,UAAQ,CAACT,aAAa,CAACU,EAAE,GAAG,MAAMV,aAAa,CAACW,IAAI,EAAE,GAAGC,SAAS,CAAC;AACjF,MAAA,MAAMC,WAAW,GAAGC,YAAU,CAACN,KAAK,CAACO,YAAY,CAAC;MAClD,IAAI,CAACF,WAAW,EAAE;AAChB,QAAA,MAAM,IAAIzC,kBAAkB,CAAC,GAAG,EAAE,mDAAmD,CAAC;AACxF,MAAA;MACA,MAAM4C,QAAQ,GAAG,MAAMtC,OAAO,CAAC,CAAA,EAAGoB,UAAU,4CAA4C,EAAE;AACxFG,QAAAA,MAAM,EAAE,MAAM;AACdR,QAAAA,OAAO,EAAE;UACP,eAAe,EAAE,CAAA,OAAA,EAAUoB,WAAW,CAAA,CAAE;AACxC,UAAA,cAAc,EAAE;SACjB;AACDN,QAAAA,IAAI,EAAEU,IAAI,CAACC,SAAS,CAAC;AACnBC,UAAAA,SAAS,EAAEvB,QAAQ;AACnBwB,UAAAA,QAAQ,EAAEzB,OAAO;AACjB0B,UAAAA,eAAe,EAAE9B,cAAc;AAC/B+B,UAAAA,gBAAgB,EAAEzB,eAAe;AACjC0B,UAAAA,iBAAiB,EAAE7B,gBAAgB;UACnC8B,UAAU,EAAE5C,OAAO,CAAC6C,SAAS;UAC7BC,aAAa,EAAE7C,KAAK,CAAC0B;SACtB;AACF,OAAA,CAAC;AACF,MAAA,IAAI,CAACS,QAAQ,CAACN,EAAE,EAAE,MAAM,IAAItC,kBAAkB,CAAC,GAAG,EAAE,oCAAoC,CAAC;MACzF,MAAMY,MAAM,GAAGyB,UAAQ,CAAC,MAAMO,QAAQ,CAACL,IAAI,EAAE,CAAC;MAC9C,IAAIG,YAAU,CAAC9B,MAAM,CAAC2C,mBAAmB,CAAC,KAAK,SAAS,EAAE;AACxD,QAAA,MAAM,IAAIvD,kBAAkB,CAAC,GAAG,EAAE,qCAAqC,CAAC;AAC1E,MAAA;AACF,IAAA;GACD;AACH;AAEA,SAASW,YAAYA,CAACH,OAA8B,EAAA;EAClD,OAAO,IAAIgD,MAAM,CAAC;AAChBC,IAAAA,gCAAgC,EAAE;MAChCC,aAAa,EAAElD,OAAO,CAACwB,QAAQ;MAC/B2B,iBAAiB,EAAEnD,OAAO,CAACyB;KAC5B;AACD2B,IAAAA,OAAO,EAAE,CAAC;AACVjC,IAAAA,WAAW,EAAEnB,OAAO,CAACmB,WAAW,KAAK,MAAM,GAAGkC,WAAW,CAACC,UAAU,GAAGD,WAAW,CAACE;AACpF,GAAA,CAAC;AACJ;AAEA,SAAS1B,UAAQA,CAAC2B,KAAc,EAAA;EAC9B,OAAOA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,GAAIA,KAAiC,GAAG,EAAE;AACrF;AAEA,SAAStB,YAAUA,CAACsB,KAAc,EAAA;EAChC,OAAO,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,GAAGA,KAAK,GAAGxB,SAAS;AAC/D;AAEA,SAASpB,SAASA,CAACC,OAAsD,EAAE4C,GAAW,EAAA;AACpF,EAAA,MAAMD,KAAK,GAAG3C,OAAO,CAAC4C,GAAG,CAAC;AAC1B,EAAA,OAAOC,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,GAAGA,KAAK,CAAC,CAAC,CAAC,GAAGA,KAAK;AAChD;;AClGA,MAAMI,GAAG,GAAGC,MAAM,EAAE;AACpB,MAAMC,mBAAmB,GAAGC,CAAC,CAACC,MAAM,CAAC;AACnCC,EAAAA,EAAE,EAAEF,CAAC,CAACG,MAAM,EAAE,CAACC,GAAG,CAAC,CAAC,CAAC,CAACC,GAAG,CAAC,GAAG,CAAC;AAC9BC,EAAAA,UAAU,EAAEN,CAAC,CAACG,MAAM,EAAE,CAACC,GAAG,CAAC,CAAC,CAAC,CAACC,GAAG,CAAC,GAAG,CAAC;AACtCE,EAAAA,QAAQ,EAAEP,CAAC,CAACQ,MAAM,CAACR,CAAC,CAACG,MAAM,EAAE,EAAEH,CAAC,CAACS,OAAO,EAAE;AAC3C,CAAA,CAAC;AA+BK,IAAMC,iBAAiB,GAAvB,MAAMA,iBACX,SAAQC,QAAQ,CAAA;AAGhB,EAAA,MAAMC,YAAYA,CAChB1E,KAA+B,EAC/B2E,aAA8C,EAAA;AAE9C,IAAA,IAAI3E,KAAK,CAAC4E,eAAe,EAAE,OAAO,MAAM,IAAI,CAACC,YAAY,CAAC7E,KAAK,EAAE2E,aAAa,CAAC;IAC/E,IAAI,CAAC3E,KAAK,CAAC8E,SAAS,IAAI,CAAC9E,KAAK,CAAC+E,SAAS,EAAE;MACxC,IAAI,CAACpB,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,gDAAgD,CAAC;AACvE,IAAA;AACA,IAAA,IAAI,CAACC,YAAY,CAACN,aAAa,CAAC;AAChC,IAAA,MAAMO,KAAK,GAAG,MAAM,IAAI,CAACC,QAAQ,CAACR,aAAa,CAAC,CAAC7E,WAAW,CAC1D,IAAI,CAACsF,eAAe,CAACT,aAAa,CAAC,EACnC;MACEU,eAAe,EAAErF,KAAK,CAACsF,cAAc;AACrC5D,MAAAA,IAAI,EAAE;QACJ6D,MAAM,EAAEC,qBAAqB,CAACC,OAAO;AACrCC,QAAAA,kBAAkB,EAAE;UAAEZ,SAAS,EAAE9E,KAAK,CAAC8E,SAAS;UAAEC,SAAS,EAAE/E,KAAK,CAAC+E;SAAW;AAC9EY,QAAAA,aAAa,EAAE,CACb;AACEC,UAAAA,QAAQ,EAAEC,MAAM,CAAC7F,KAAK,CAAC8F,gBAAgB,CAAC;UACxCC,SAAS,EAAE/F,KAAK,CAACgG,iBAAiB;AAClCC,UAAAA,MAAM,EAAE;YACNC,YAAY,EAAElG,KAAK,CAACmG,QAAQ;YAC5B5C,KAAK,EAAE6C,iBAAiB,CAACpG,KAAK,CAACqG,WAAW,EAAErG,KAAK,CAACmG,QAAQ;AAC3D;SACF;AAEJ;AACF,KAAA,CACF;AACD,IAAA,MAAMG,WAAW,GAAG1E,QAAQ,CAACsD,KAAK,CAAC;AACnC,IAAA,MAAMqB,WAAW,GAAGtE,UAAU,CAC5BuE,OAAO,CAACF,WAAW,CAACG,KAAK,CAAC,CACvBC,GAAG,CAAC9E,QAAQ,CAAC,CACb+E,IAAI,CAACC,IAAI,IAAIA,IAAI,CAACC,GAAG,KAAK,SAAS,CAAC,EAAEC,IAAI,CAC9C;AACD,IAAA,MAAMC,OAAO,GAAG9E,UAAU,CAACqE,WAAW,CAACtC,EAAE,CAAC;AAC1C,IAAA,IAAI,CAAC+C,OAAO,IAAI,CAACR,WAAW,EAAE,IAAI,CAAC5C,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,yCAAyC,CAAC;IAC5F,OAAO;AACLgC,MAAAA,KAAK,EAAE,iBAAiB;AACxBC,MAAAA,iBAAiB,EAAEF,OAAO;AAC1BnC,MAAAA,eAAe,EAAEmC,OAAO;AACxBG,MAAAA,UAAU,EAAE;AAAEC,QAAAA,IAAI,EAAE,UAAU;AAAEC,QAAAA,GAAG,EAAEb;AAAW;KACjD;AACH,EAAA;AAEA,EAAA,MAAMc,cAAcA,CAClBrH,KAA+B,EAC/B2E,aAA8C,EAAA;AAE9C,IAAA,IAAI,CAACM,YAAY,CAACN,aAAa,CAAC;AAChC,IAAA,IAAI,CAAC3E,KAAK,CAAC4E,eAAe,EAAE,IAAI,CAACjB,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,sCAAsC,CAAC;AACvF,IAAA,MAAME,KAAK,GAAG,MAAM,IAAI,CAACC,QAAQ,CAACR,aAAa,CAAC,CAACvE,YAAY,CAC3D,IAAI,CAACgF,eAAe,CAACT,aAAa,CAAC,EACnC;MACEX,EAAE,EAAEhE,KAAK,CAAC4E,eAAe;MACzBS,eAAe,EAAErF,KAAK,CAACsF;AACxB,KAAA,CACF;IACD,OAAO,IAAI,CAACgC,SAAS,CAACpC,KAAK,EAAElF,KAAK,EAAE2E,aAAa,CAAC;AACpD,EAAA;AAEA,EAAA,MAAME,YAAYA,CAChB7E,KAA+B,EAC/B2E,aAA8C,EAAA;AAE9C,IAAA,IAAI,CAACM,YAAY,CAACN,aAAa,CAAC;AAChC,IAAA,IAAI,CAAC3E,KAAK,CAAC4E,eAAe,EAAE,IAAI,CAACjB,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,sCAAsC,CAAC;AACvF,IAAA,MAAME,KAAK,GAAG,MAAM,IAAI,CAACC,QAAQ,CAACR,aAAa,CAAC,CAACtE,QAAQ,CAAC,IAAI,CAAC+E,eAAe,CAACT,aAAa,CAAC,EAAE;MAC7FX,EAAE,EAAEhE,KAAK,CAAC4E;AACX,KAAA,CAAC;IACF,OAAO,IAAI,CAAC0C,SAAS,CAACpC,KAAK,EAAElF,KAAK,EAAE2E,aAAa,CAAC;AACpD,EAAA;AAEA,EAAA,MAAM4C,YAAYA,CAChBvH,KAA8B,EAC9B2E,aAA8C,EAAA;AAE9C,IAAA,IAAI,CAACM,YAAY,CAACN,aAAa,CAAC;AAChC,IAAA,MAAM6C,MAAM,GAAG,MAAM,IAAI,CAACrC,QAAQ,CAACR,aAAa,CAAC,CAACrE,qBAAqB,CACrE,IAAI,CAAC8E,eAAe,CAACT,aAAa,CAAC,EACnC;MACE8C,SAAS,EAAEzH,KAAK,CAAC0H,iBAAiB;MAClCrC,eAAe,EAAErF,KAAK,CAACsF,cAAc;AACrC5D,MAAAA,IAAI,EAAE;AACJuE,QAAAA,MAAM,EAAE;UACNC,YAAY,EAAElG,KAAK,CAACmG,QAAQ;UAC5B5C,KAAK,EAAE6C,iBAAiB,CAACpG,KAAK,CAACqG,WAAW,EAAErG,KAAK,CAACmG,QAAQ;SAC3D;AACDP,QAAAA,QAAQ,EAAEC,MAAM,CAAC7F,KAAK,CAAC2H,iBAAiB,CAAC;QACzC5B,SAAS,EAAE/F,KAAK,CAACgG;AAClB;AACF,KAAA,CACF;IACD,OAAO,IAAI,CAAC4B,UAAU,CAACJ,MAAM,EAAExH,KAAK,EAAE2E,aAAa,CAAC;AACtD,EAAA;AAEA,EAAA,MAAMkD,WAAWA,CACf7H,KAA8B,EAC9B2E,aAA8C,EAAA;AAE9C,IAAA,IAAI,CAACM,YAAY,CAACN,aAAa,CAAC;AAChC,IAAA,IAAI,CAAC3E,KAAK,CAAC8H,gBAAgB,EACzB,IAAI,CAACnE,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,iDAAiD,CAAC;AACxE,IAAA,MAAMwC,MAAM,GAAG,MAAM,IAAI,CAACrC,QAAQ,CAACR,aAAa,CAAC,CAACnE,SAAS,CACzD,IAAI,CAAC4E,eAAe,CAACT,aAAa,CAAC,EACnC;MACEoD,QAAQ,EAAE/H,KAAK,CAAC8H;AACjB,KAAA,CACF;IACD,OAAO,IAAI,CAACF,UAAU,CAACJ,MAAM,EAAExH,KAAK,EAAE2E,aAAa,CAAC;AACtD,EAAA;AAEA,EAAA,MAAMqD,aAAaA,CACjBhI,KAA+B,EAC/B2E,aAA8C,EAAA;AAE9C,IAAA,IAAI,CAACM,YAAY,CAACN,aAAa,CAAC;IAChC,MAAMsD,OAAO,GAAGpE,mBAAmB,CAACqE,SAAS,CAAClI,KAAK,CAAC0B,IAAI,CAAC;AACzD,IAAA,IAAI,CAACuG,OAAO,CAACE,OAAO,EAAE,IAAI,CAACxE,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,2BAA2B,CAAC;IACtE,IAAI;AACF,MAAA,MAAM,IAAI,CAACG,QAAQ,CAACR,aAAa,CAAC,CAAClE,sBAAsB,CACvD,IAAI,CAAC2E,eAAe,CAACT,aAAa,CAAC,EACnC3E,KAAK,CACN;IACH,CAAC,CAAC,OAAOoI,KAAK,EAAE;AACd,MAAA,IAAI,CAACC,kBAAkB,CAACD,KAAK,CAAC;AAChC,IAAA;IACA,OAAO,MAAM,IAAI,CAACE,WAAW,CAACL,OAAO,CAACM,IAAI,EAAE5D,aAAa,CAAC;AAC5D,EAAA;AAEQ,EAAA,MAAM2D,WAAWA,CACvBE,KAA0C,EAC1C7D,aAA8C,EAAA;AAE9C,IAAA,MAAMN,QAAQ,GAAGmE,KAAK,CAACnE,QAAQ;AAC/B,IAAA,MAAM4B,MAAM,GAAGwC,iBAAiB,CAACpE,QAAQ,CAAC4B,MAAM,CAAC;AACjD,IAAA,MAAME,QAAQ,GAAGuC,mBAAmB,CAACrE,QAAQ,CAAC4B,MAAM,CAAC;AACrD,IAAA,MAAM0C,UAAU,GAAG1G,UAAU,CAACoC,QAAQ,CAACL,EAAE,CAAC;AAC1C,IAAA,IAAI,CAAC2E,UAAU,IAAI,CAAC1C,MAAM,IAAI,CAACE,QAAQ,EACrC,IAAI,CAACxC,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,qCAAqC,CAAC;AAE5D,IAAA,IAAI4D,aAAa,CAACJ,KAAK,CAACpE,UAAU,CAAC,EAAE;AACnC,MAAA,MAAMuD,iBAAiB,GAAG1F,UAAU,CAAC4G,SAAS,CAACxE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAClF,MAAA,MAAMoD,SAAS,GAAGqB,gBAAgB,CAACzE,QAAQ,EAAE,CAC3C,oBAAoB,EACpB,aAAa,EACb,YAAY,CACb,CAAC;AACF,MAAA,IAAI,CAACsD,iBAAiB,IAAI,CAACF,SAAS,EAClC,IAAI,CAAC9D,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,yCAAyC,CAAC;AAChE,MAAA,MAAMwC,MAAM,GAAG,MAAM,IAAI,CAACuB,MAAM,CAACC,GAAG,CAACC,KAAK,CAACC,eAAe,CAACC,OAAO,CAChExB,iBAA0B,CAC3B;AACD,MAAA,IAAI,CAACH,MAAM,EAAE,IAAI,CAAC7D,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,mCAAmC,CAAC;AACrE,MAAA,MAAMoE,OAAO,GAAG,MAAM,IAAI,CAACL,MAAM,CAACC,GAAG,CAACC,KAAK,CAACI,cAAc,CAACF,OAAO,CAAC3B,MAAM,CAAC1B,gBAAgB,CAAC;MAC3F,IAAI,CAACsD,OAAO,IAAIA,OAAO,CAAC1B,iBAAiB,KAAKD,SAAS,EAAE;QACvD,IAAI,CAAC9D,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,yCAAyC,CAAC;AAChE,MAAA;AACA,MAAA,MAAMsE,QAAQ,GAAG,IAAI,CAAC1B,UAAU,CAC9BvD,QAAQ,EACR;QACEyB,gBAAgB,EAAEsD,OAAO,CAACpF,EAAE;QAC5B2D,iBAAiB,EAAEH,MAAM,CAACxD,EAAE;QAC5BgC,iBAAiB,EAAEwB,MAAM,CAACxB,iBAAiB;AAC3CV,QAAAA,cAAc,EAAE,EAAE;QAClBe,WAAW,EAAEmB,MAAM,CAACnB,WAAW;QAC/BF,QAAQ,EAAEqB,MAAM,CAACrB,QAAQ;AACzBuB,QAAAA,iBAAiB,EAAED,SAAS;AAC5BK,QAAAA,gBAAgB,EAAEa;OACnB,EACDhE,aAAa,CACd;MACD,OAAO;QACL4E,OAAO,EAAEf,KAAK,CAACxE,EAAE;QACjBwF,SAAS,EAAEhB,KAAK,CAACpE,UAAU;QAC3BuD,iBAAiB,EAAEH,MAAM,CAACxD,EAAE;AAC5BwD,QAAAA,MAAM,EAAE8B,QAAQ;AAChBG,QAAAA,OAAO,EAAE;AAAEpD,UAAAA,WAAW,EAAEJ,MAAM;AAAEE,UAAAA;AAAQ;OACzC;AACH,IAAA;IAEA,IAAIqC,KAAK,CAACpE,UAAU,CAACsF,UAAU,CAAC,kBAAkB,CAAC,EAAE;AACnD,MAAA,MAAM3C,OAAO,GAAG+B,gBAAgB,CAACzE,QAAQ,EAAE,CAAC,mBAAmB,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAC1F,MAAA,IAAI,CAAC0C,OAAO,EAAE,IAAI,CAACpD,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,gDAAgD,CAAC;AACnF,MAAA,MAAME,KAAK,GAAG,MAAM,IAAI,CAACC,QAAQ,CAACR,aAAa,CAAC,CAACtE,QAAQ,CACvD,IAAI,CAAC+E,eAAe,CAACT,aAAa,CAAC,EACnC;AACEX,QAAAA,EAAE,EAAE+C;AACL,OAAA,CACF;MACD,MAAM/G,KAAK,GAAG,IAAI,CAAC2J,eAAe,CAACzE,KAAK,EAAE6B,OAAO,CAAC;MAClD,MAAM6C,OAAO,GAAG,IAAI,CAACtC,SAAS,CAACpC,KAAK,EAAElF,KAAK,EAAE2E,aAAa,CAAC;AAC3D,MAAA,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAACkF,QAAQ,CAACD,OAAO,CAAC5C,KAAK,CAAC,EAAE;QACjE,IAAI,CAACrD,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,wCAAwC,CAAC;AAC/D,MAAA;MACA,IAAI4E,OAAO,CAAClC,iBAAiB,IAAIkC,OAAO,CAAClC,iBAAiB,KAAKiB,UAAU,EAAE;QACzE,IAAI,CAAChF,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,qDAAqD,CAAC;AAC5E,MAAA;MACA,OAAO;QACLuE,OAAO,EAAEf,KAAK,CAACxE,EAAE;QACjBwF,SAAS,EAAEhB,KAAK,CAACpE,UAAU;QAC3B0B,gBAAgB,EAAE9F,KAAK,CAAC8F,gBAAgB;QACxC8D,OAAO;AACPH,QAAAA,OAAO,EAAE;AAAEpD,UAAAA,WAAW,EAAEJ,MAAM;AAAEE,UAAAA;AAAQ;OACzC;AACH,IAAA;IACA,IAAI,CAACxC,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,0CAA0C,CAAC;AACjE,EAAA;AAEQ2E,EAAAA,eAAeA,CAACzE,KAAc,EAAEN,eAAuB,EAAA;AAC7D,IAAA,MAAM0B,WAAW,GAAG1E,QAAQ,CAACsD,KAAK,CAAC;AACnC,IAAA,MAAM4E,IAAI,GAAGtD,OAAO,CAACqC,SAAS,CAACvC,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,IAAA,MAAMyD,UAAU,GAAGnI,QAAQ,CAACkI,IAAI,CAAC;AACjC,IAAA,MAAMlE,QAAQ,GAAG3D,UAAU,CAAC4G,SAAS,CAACkB,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAC3E,IAAA,MAAM/D,iBAAiB,GAAG/D,UAAU,CAAC4G,SAAS,CAACkB,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACtF,MAAM1D,WAAW,GAAGoC,iBAAiB,CAACI,SAAS,CAACkB,UAAU,EAAE,QAAQ,CAAC,CAAC;IACtE,MAAM5D,QAAQ,GAAGuC,mBAAmB,CAACG,SAAS,CAACkB,UAAU,EAAE,QAAQ,CAAC,CAAC;AACrE,IAAA,IAAI,CAACnE,QAAQ,IAAI,CAACI,iBAAiB,IAAIK,WAAW,KAAKtE,SAAS,IAAI,CAACoE,QAAQ,EAAE;MAC7E,IAAI,CAACxC,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC;AACvD,IAAA;IACA,OAAO;AACLc,MAAAA,gBAAgB,EAAEF,QAAiB;MACnCI,iBAAiB;AACjBV,MAAAA,cAAc,EAAE,EAAE;MAClBe,WAAW;MACXF,QAAQ;AACRvB,MAAAA;KACD;AACH,EAAA;AAEQ0C,EAAAA,SAASA,CACfpC,KAAc,EACdlF,KAA+B,EAC/B2E,aAA8C,EAAA;AAE9C,IAAA,MAAM2B,WAAW,GAAG1E,QAAQ,CAACsD,KAAK,CAAC;AACnC,IAAA,MAAM6B,OAAO,GAAG9E,UAAU,CAACqE,WAAW,CAACtC,EAAE,CAAC;IAC1C,IAAI,CAAC+C,OAAO,IAAIA,OAAO,KAAK/G,KAAK,CAAC4E,eAAe,EAAE;MACjD,IAAI,CAACjB,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,mCAAmC,CAAC;AAC1D,IAAA;AACA,IAAA,MAAMgF,KAAK,GAAGxD,OAAO,CAACqC,SAAS,CAACvC,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAChF,IAAA,IAAI0D,KAAK,CAACC,MAAM,KAAK,CAAC,EAAE,IAAI,CAACtG,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,iDAAiD,CAAC;IAC9F,MAAM8E,IAAI,GAAGlI,QAAQ,CAACoI,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/B,IAAA,IACE/H,UAAU,CAAC4G,SAAS,CAACiB,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,KAAKjE,MAAM,CAAC7F,KAAK,CAAC8F,gBAAgB,CAAC,IACvF7D,UAAU,CAAC4G,SAAS,CAACiB,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,KAAK9J,KAAK,CAACgG,iBAAiB,IAClFyC,iBAAiB,CAACI,SAAS,CAACiB,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK9J,KAAK,CAACqG,WAAW,IAClEqC,mBAAmB,CAACG,SAAS,CAACiB,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK9J,KAAK,CAACmG,QAAQ,EACjE;MACA,IAAI,CAACxC,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,sDAAsD,CAAC;AAC7E,IAAA;AACA,IAAA,IAAI,CAACkF,eAAe,CAACJ,IAAI,EAAEnF,aAAa,CAAC;AACzC,IAAA,MAAMwF,QAAQ,GAAG3D,OAAO,CAACqC,SAAS,CAACjH,QAAQ,CAACiH,SAAS,CAACiB,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACtF,IAAA,IAAIK,QAAQ,CAACF,MAAM,GAAG,CAAC,EAAE,IAAI,CAACtG,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,oCAAoC,CAAC;IAClF,MAAMoF,OAAO,GAAGxI,QAAQ,CAACuI,QAAQ,CAAC,CAAC,CAAC,CAAC;AACrC,IAAA,MAAM1C,SAAS,GAAGxF,UAAU,CAACmI,OAAO,CAACpG,EAAE,CAAC;AACxC,IAAA,MAAMqG,aAAa,GAAGpI,UAAU,CAACmI,OAAO,CAAC1K,MAAM,CAAC;AAChD,IAAA,IAAI+H,SAAS,EAAE;MACb,IACEgB,iBAAiB,CAAC2B,OAAO,CAACnE,MAAM,CAAC,KAAKjG,KAAK,CAACqG,WAAW,IACvDqC,mBAAmB,CAAC0B,OAAO,CAACnE,MAAM,CAAC,KAAKjG,KAAK,CAACmG,QAAQ,EACtD;QACA,IAAI,CAACxC,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,wDAAwD,CAAC;AAC/E,MAAA;MACA,IAAIqF,aAAa,KAAK,WAAW,EAAE;QACjC,OAAO;AACLrD,UAAAA,KAAK,EAAE,WAAW;AAClBC,UAAAA,iBAAiB,EAAEF,OAAO;AAC1BnC,UAAAA,eAAe,EAAEmC,OAAO;AACxBW,UAAAA,iBAAiB,EAAED,SAAS;AAC5BP,UAAAA,UAAU,EAAE;AAAEC,YAAAA,IAAI,EAAE;AAAW;SAChC;AACH,MAAA;AACA,MAAA,IAAIkD,aAAa,KAAK,QAAQ,IAAIA,aAAa,KAAK,UAAU,EAAE;QAC9D,OAAO;AACLrD,UAAAA,KAAK,EAAE,QAAQ;AACfC,UAAAA,iBAAiB,EAAEF,OAAO;AAC1BnC,UAAAA,eAAe,EAAEmC,OAAO;AACxBW,UAAAA,iBAAiB,EAAED;SACpB;AACH,MAAA;MACA,IAAI4C,aAAa,KAAK,SAAS,EAAE;QAC/B,OAAO;AACLrD,UAAAA,KAAK,EAAE,YAAY;AACnBC,UAAAA,iBAAiB,EAAEF,OAAO;AAC1BnC,UAAAA,eAAe,EAAEmC,OAAO;AACxBW,UAAAA,iBAAiB,EAAED;SACpB;AACH,MAAA;AACF,IAAA;AACA,IAAA,IAAInB,WAAW,CAAC5G,MAAM,KAAK4K,WAAW,CAACC,MAAM,EAAE;MAC7C,OAAO;AAAEvD,QAAAA,KAAK,EAAE,WAAW;AAAEC,QAAAA,iBAAiB,EAAEF,OAAO;AAAEnC,QAAAA,eAAe,EAAEmC;OAAS;AACrF,IAAA;IACA,OAAO;AAAEC,MAAAA,KAAK,EAAE,iBAAiB;AAAEC,MAAAA,iBAAiB,EAAEF,OAAO;AAAEnC,MAAAA,eAAe,EAAEmC;KAAS;AAC3F,EAAA;AAEQa,EAAAA,UAAUA,CAChBJ,MAAe,EACfxH,KAA8B,EAC9B2E,aAA8C,EAAA;AAE9C,IAAA,MAAML,MAAM,GAAG1C,QAAQ,CAAC4F,MAAM,CAAC;AAC/B,IAAA,MAAMM,gBAAgB,GAAG7F,UAAU,CAACqC,MAAM,CAACN,EAAE,CAAC;AAC9C,IAAA,IAAI,CAAC8D,gBAAgB,EAAE,IAAI,CAACnE,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,sCAAsC,CAAC;AAClF,IAAA,IACGhF,KAAK,CAAC8H,gBAAgB,IAAI9H,KAAK,CAAC8H,gBAAgB,KAAKA,gBAAgB,IACtE7F,UAAU,CAAC4G,SAAS,CAACvE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,KAAKuB,MAAM,CAAC7F,KAAK,CAAC2H,iBAAiB,CAAC,IAC1F1F,UAAU,CAAC4G,SAAS,CAACvE,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,KAAKtE,KAAK,CAACgG,iBAAiB,IACpFyC,iBAAiB,CAACnE,MAAM,CAAC2B,MAAM,CAAC,KAAKjG,KAAK,CAACqG,WAAW,IACtDqC,mBAAmB,CAACpE,MAAM,CAAC2B,MAAM,CAAC,KAAKjG,KAAK,CAACmG,QAAQ,EACrD;MACA,IAAI,CAACxC,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,wDAAwD,CAAC;AAC/E,IAAA;AACA,IAAA,IAAI,CAACkF,eAAe,CAAC5F,MAAM,EAAEK,aAAa,CAAC;IAC3C,OAAO6F,SAAS,CAACvI,UAAU,CAACqC,MAAM,CAAC5E,MAAM,CAAC,EAAEoI,gBAAgB,CAAC;AAC/D,EAAA;EAEQ3C,QAAQA,CAACR,aAA8C,EAAA;AAC7D,IAAA,OAAOA,aAAa,CAAC8F,OAAO,IAAI7K,mBAAmB,CAAC,IAAI,CAAC8K,IAAI,CAACC,IAAI,CAACC,KAAK,CAAC;AAC3E,EAAA;EAEQxF,eAAeA,CAACT,aAA8C,EAAA;IACpE,MAAM;MAAEpD,QAAQ;AAAEC,MAAAA;KAAc,GAAGmD,aAAa,CAACkG,gBAAgB;AACjE,IAAA,MAAMjI,SAAS,GAAG+B,aAAa,CAAC/B,SAAS;IACzC,IAAI,CAACrB,QAAQ,IAAI,CAACC,YAAY,IAAI,CAACoB,SAAS,EAAE;MAC5C,IAAI,CAACe,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC;AACvD,IAAA;IACA,OAAO;MACL9D,WAAW,EAAEyD,aAAa,CAACzD,WAAW;MACtCK,QAAQ;MACRC,YAAY;AACZoB,MAAAA;KACD;AACH,EAAA;EAEQyF,kBAAkBA,CAACD,KAAc,EAAA;AACvC,IAAA,IAAIA,KAAK,YAAY7I,kBAAkB,EAAE,IAAI,CAACoE,GAAG,CAACqB,KAAK,CAACoD,KAAK,CAAC1I,MAAM,EAAE0I,KAAK,CAACzI,OAAO,CAAC;AACpF,IAAA,MAAMyI,KAAK;AACb,EAAA;EAEQnD,YAAYA,CAACN,aAA8C,EAAA;IACjE,MAAM;MAAEpD,QAAQ;AAAEC,MAAAA;KAAc,GAAGmD,aAAa,CAACkG,gBAAgB;AACjE,IAAA,IACE,CAACtJ,QAAQ,IACT,CAACC,YAAY,IACb,CAACmD,aAAa,CAAC/B,SAAS,IACxB,CAAC+B,aAAa,CAACmG,iBAAiB,EAChC;MACA,IAAI,CAACnH,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC;AACvD,IAAA;AACF,EAAA;AAEQkF,EAAAA,eAAeA,CACrB3G,KAA8B,EAC9BoB,aAA8C,EAAA;IAE9C,MAAMoG,UAAU,GACdjC,gBAAgB,CAACvF,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,IAChDuF,gBAAgB,CAACvF,KAAK,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,IACjDuF,gBAAgB,CAACvF,KAAK,EAAE,CAAC,2BAA2B,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,IAC7EuF,gBAAgB,CAACvF,KAAK,EAAE,CAAC,6BAA6B,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAClF,IAAI,CAACwH,UAAU,IAAIA,UAAU,KAAKpG,aAAa,CAACmG,iBAAiB,EAAE;MACjE,IAAI,CAACnH,GAAG,CAACqB,KAAK,CAAC,GAAG,EAAE,qCAAqC,CAAC;AAC5D,IAAA;AACF,EAAA;;AAhXWR,iBAAiB,GAAAwG,UAAA,CAAA,CAxB7BC,WAAW,CAA4B;AACtCC,EAAAA,IAAI,EAAE;AACJC,IAAAA,YAAY,EAAE;AACZC,MAAAA,gBAAgB,EAAE,IAAI;AACtBC,MAAAA,gBAAgB,EAAE,KAAK;AACvBC,MAAAA,gBAAgB,EAAE,IAAI;AACtBC,MAAAA,aAAa,EAAE,KAAK;AACpBC,MAAAA,OAAO,EAAE,IAAI;AACbC,MAAAA,cAAc,EAAE,IAAI;AACpBC,MAAAA,QAAQ,EAAE;AACX;GACF;AACDC,EAAAA,OAAO,EAAE;AACPC,IAAAA,OAAO,EAAE;AACP1K,MAAAA,WAAW,EAAEyC,GAAG,CAACkI,IAAI,CAACC,GAAG,CAACC,kBAAwC;AAClElB,MAAAA,gBAAgB,EAAE;AAChBtJ,QAAAA,QAAQ,EAAEoC,GAAG,CAACkI,IAAI,CAACC,GAAG,CAACE,gBAAgB;AACvCxK,QAAAA,YAAY,EAAEmC,GAAG,CAACkI,IAAI,CAACC,GAAG,CAACG;OAC5B;AACDrJ,MAAAA,SAAS,EAAEe,GAAG,CAACkI,IAAI,CAACC,GAAG,CAACI,iBAAiB;AACzCpB,MAAAA,iBAAiB,EAAEnH,GAAG,CAACkI,IAAI,CAACC,GAAG,CAACK;AACjC;AACF;CACF,CAAC,EAAAC,QAAA,CAAA;EAAAC,MAAA,EAAA;AAAA,CAAA,CAAA,CACW,EAAA7H,iBAAiB,CAiX7B;AAED,SAAS4B,iBAAiBA,CAACC,WAAmB,EAAEF,QAAgB,EAAA;AAC9D,EAAA,IAAI,CAACmG,MAAM,CAACC,aAAa,CAAClG,WAAW,CAAC,IAAIA,WAAW,GAAG,CAAC,IAAIF,QAAQ,KAAK,KAAK,EAAE;AAC/E,IAAA,MAAM,IAAI3G,KAAK,CAAC,yDAAyD,CAAC;AAC5E,EAAA;EACA,OAAO,CAAA,EAAGgN,IAAI,CAACC,KAAK,CAACpG,WAAW,GAAG,GAAG,CAAC,CAAA,CAAA,EAAIR,MAAM,CAACQ,WAAW,GAAG,GAAG,CAAC,CAACqG,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;AACzF;AAEA,SAASlC,SAASA,CAChB9K,MAA0B,EAC1BoI,gBAAwB,EAAA;AAExB,EAAA,IAAIpI,MAAM,KAAK,WAAW,EAAE,OAAO;AAAEsH,IAAAA,KAAK,EAAE,WAAW;AAAEc,IAAAA;GAAkB;AAC3E,EAAA,IAAIpI,MAAM,KAAK,QAAQ,EAAE,OAAO;AAAEsH,IAAAA,KAAK,EAAE,QAAQ;AAAEc,IAAAA;GAAkB;AACrE,EAAA,IAAIpI,MAAM,KAAK,WAAW,EAAE,OAAO;AAAEsH,IAAAA,KAAK,EAAE,WAAW;AAAEc,IAAAA;GAAkB;EAC3E,OAAO;AAAEd,IAAAA,KAAK,EAAE,SAAS;AAAEc,IAAAA;GAAkB;AAC/C;AAEA,SAASlG,QAAQA,CAAC2B,KAAc,EAAA;EAC9B,OAAOA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,GAAIA,KAAiC,GAAG,EAAE;AACrF;AAEA,SAASiD,OAAOA,CAACjD,KAAc,EAAA;EAC7B,OAAOE,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,GAAGA,KAAK,GAAG,EAAE;AAC1C;AAEA,SAAStB,UAAUA,CAACsB,KAAc,EAAA;EAChC,OAAO,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,GAAGA,KAAK,GAAGxB,SAAS;AAC/D;AAEA,SAAS8G,SAASA,CAACvE,MAA+B,EAAE,GAAGqI,IAAc,EAAA;AACnE,EAAA,KAAK,MAAMnJ,GAAG,IAAImJ,IAAI,EAAE;IACtB,IAAIrI,MAAM,CAACd,GAAG,CAAC,KAAKzB,SAAS,EAAE,OAAOuC,MAAM,CAACd,GAAG,CAAC;AACnD,EAAA;AACA,EAAA,OAAOzB,SAAS;AAClB;AAEA,SAAS+G,gBAAgBA,CAACvF,KAAc,EAAEqJ,IAAc,EAAA;EACtD,IAAIC,OAAO,GAAYtJ,KAAK;AAC5B,EAAA,KAAK,MAAMC,GAAG,IAAIoJ,IAAI,EAAE;AACtB,IAAA,MAAMtI,MAAM,GAAG1C,QAAQ,CAACiL,OAAO,CAAC;AAChCA,IAAAA,OAAO,GAAGvI,MAAM,CAACd,GAAG,CAAC,IAAIc,MAAM,CAACwI,YAAY,CAACtJ,GAAG,CAAC,CAAC;AACpD,EAAA;EACA,OAAOvB,UAAU,CAAC4K,OAAO,CAAC;AAC5B;AAEA,SAASC,YAAYA,CAACvJ,KAAa,EAAA;AACjC,EAAA,OAAOA,KAAK,CAACwJ,OAAO,CAAC,QAAQ,EAAEC,SAAS,IAAI,CAAA,CAAA,EAAIA,SAAS,CAACC,WAAW,EAAE,EAAE,CAAC;AAC5E;AAEA,SAASxE,iBAAiBA,CAAClF,KAAc,EAAA;AACvC,EAAA,MAAM0C,MAAM,GAAGrE,QAAQ,CAAC2B,KAAK,CAAC;AAC9B,EAAA,IAAItB,UAAU,CAAC4G,SAAS,CAAC5C,MAAM,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,KAAK,KAAK,EAAE,OAAOlE,SAAS;AAC9F,EAAA,MAAMmL,OAAO,GAAGjL,UAAU,CAACgE,MAAM,CAAC1C,KAAK,CAAC;AACxC,EAAA,IAAI,CAAC2J,OAAO,IAAI,CAAC,cAAc,CAACC,IAAI,CAACD,OAAO,CAAC,EAAE,OAAOnL,SAAS;EAC/D,MAAM,CAACqL,KAAK,EAAEC,UAAU,CAAC,GAAGH,OAAO,CAACI,KAAK,CAAC,GAAG,CAAC;AAC9C,EAAA,MAAMnN,MAAM,GAAGmM,MAAM,CAACc,KAAK,CAAC,GAAG,GAAG,GAAGd,MAAM,CAACe,UAAU,CAAC;EACvD,OAAOf,MAAM,CAACC,aAAa,CAACpM,MAAM,CAAC,GAAGA,MAAM,GAAG4B,SAAS;AAC1D;AAEA,SAAS2G,mBAAmBA,CAACnF,KAAc,EAAA;AACzC,EAAA,MAAM0C,MAAM,GAAGrE,QAAQ,CAAC2B,KAAK,CAAC;AAC9B,EAAA,MAAM4C,QAAQ,GAAGlE,UAAU,CAAC4G,SAAS,CAAC5C,MAAM,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AAC/E,EAAA,OAAOE,QAAQ,KAAK,KAAK,GAAGA,QAAQ,GAAGpE,SAAS;AAClD;AAEA,SAAS6G,aAAaA,CAACY,SAAiB,EAAA;EACtC,OAAOA,SAAS,KAAK,0BAA0B,IAAIA,SAAS,CAACE,UAAU,CAAC,iBAAiB,CAAC;AAC5F;;ACldO,IAAM6D,oBAAoB,GAA1B,MAAMA,oBAAqB,SAAQC,aAAa,CAAA;AAA1CD,oBAAoB,GAAAvC,UAAA,CAAA,CADhCyC,KAAK,EAAE,EAAArB,QAAA,CAAA;EAAAC,MAAA,EAAA;AAAA,CAAA,CAAA,CACK,EAAAkB,oBAAoB,CAAyB;AAuB1D;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/lib/paypalGateway.ts","../src/bean/payProvider.paypal.ts","../src/.metadata/index.ts"],"sourcesContent":[null,null,null],"names":["PaypalRequestTimeoutMilliseconds","PaypalGatewayError","Error","constructor","status","message","createPaypalGateway","fetcher","createOrder","options","input","OrdersController","createClient","result","captureOrder","getOrder","refundCapturedPayment","PaymentsController","getCapturedPayment","getRefund","verifyWebhookSignature","transmissionId","getHeader","headers","transmissionTime","certUrl","authAlgo","transmissionSig","apiBaseUrl","environment","tokenResponse","method","Buffer","from","clientId","clientSecret","toString","body","token","asRecord","ok","json","undefined","accessToken","readString","access_token","response","JSON","stringify","auth_algo","cert_url","transmission_id","transmission_sig","transmission_time","webhook_id","webhookId","webhook_event","verification_status","Client","clientCredentialsAuthCredentials","oAuthClientId","oAuthClientSecret","timeout","Environment","Production","Sandbox","value","key","Array","isArray","app","useApp","PaypalWebhookSchema","z","object","id","string","min","max","event_type","resource","record","unknown","PayProviderPaypal","BeanBase","startPayment","clientOptions","providerOrderId","queryPayment","returnUrl","cancelUrl","throw","_assertReady","order","_gateway","_gatewayOptions","paypalRequestId","idempotencyKey","intent","CheckoutPaymentIntent","Capture","applicationContext","purchaseUnits","customId","providerCorrelationReference","invoiceId","providerInvoiceReference","amount","currencyCode","currency","formatMinorAmount","amountMinor","orderRecord","approvalUrl","_approvalUrl","orderId","state","providerPaymentId","nextAction","kind","url","confirmPayment","prefer","_mapOrder","createRefund","refund","captureId","providerCaptureId","_mapRefund","error","_isDefinitiveRefundRejection","queryRefund","providerRefundId","refundId","verifyWebhook","webhook","safeParse","success","_throwGatewayError","_mapWebhook","data","_mapRefundWebhook","event","resourceId","readNestedString","refundByProviderId","$scope","pay","model","refundOperation","get","readField","session","paymentSession","getById","paymentSessionId","snapshot","refundOperationId","businessReference","eventId","eventType","summary","_mapCaptureRefundedWebhook","relatedCaptureId","relatedRefundId","_mapCaptureRefundedRefund","capture","_ignoredCaptureRefund","_isPaypalNotFound","refundResource","refundRecord","ignored","parsePaypalAmount","parsePaypalCurrency","startsWith","_inputFromOrder","payment","includes","unit","asArray","unitRecord","units","length","_assertMerchant","captures","captureStatus","OrderStatus","Voided","links","map","find","item","rel","href","requireCorrelationMetadata","mapRefund","ApiError","statusCode","gateway","bean","core","fetch","secretCredential","merchantReference","resourceType","merchant","_merchantReference","observedMerchantReference","$logger","warn","observedMerchantSource","field","__decorate","PayProvider","base","capabilities","redirectCheckout","embeddedCheckout","automaticCapture","manualCapture","refunds","partialRefunds","webhooks","clients","default","meta","env","PAYPAL_ENVIRONMENT","PAYPAL_CLIENT_ID","PAYPAL_CLIENT_SECRET","PAYPAL_WEBHOOK_ID","PAYPAL_MERCHANT_REFERENCE","__z_BeanInfo","module","Number","isSafeInteger","Math","floor","String","padStart","keys","path","current","camelToSnake","replace","character","toLowerCase","decimal","test","whole","fractional","split","ScopeModulePayPaypal","BeanScopeBase","Scope"],"mappings":"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"}
@@ -4,11 +4,13 @@ export interface IPaypalGatewayOptions {
4
4
  clientSecret: string;
5
5
  webhookId: string;
6
6
  }
7
+ export declare const PaypalRequestTimeoutMilliseconds = 15000;
7
8
  export interface IPaypalGateway {
8
9
  createOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
9
10
  captureOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
10
11
  getOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
11
12
  refundCapturedPayment(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
13
+ getCapturedPayment(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
12
14
  getRefund(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
13
15
  verifyWebhookSignature(options: IPaypalGatewayOptions, input: {
14
16
  headers: Record<string, string | string[] | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"paypalGateway.d.ts","sourceRoot":"","sources":["../../src/lib/paypalGateway.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9E,YAAY,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,QAAQ,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3E,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxF,SAAS,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,sBAAsB,CACpB,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAC/E,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAEzC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM;CAIlB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,KAAK,GAAG,cAAc,CAqEzE"}
1
+ {"version":3,"file":"paypalGateway.d.ts","sourceRoot":"","sources":["../../src/lib/paypalGateway.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9E,YAAY,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,QAAQ,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3E,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxF,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrF,SAAS,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,sBAAsB,CACpB,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAC/E,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAEzC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM;CAIlB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,KAAK,GAAG,cAAc,CA0EzE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-pay-paypal",
3
- "version": "5.0.4",
3
+ "version": "5.0.5",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "Vona Module"
@@ -31,7 +31,7 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@cabloy/paypal-server-sdk": "2.2.0",
34
- "vona-module-a-pay": "5.0.4"
34
+ "vona-module-a-pay": "5.0.5"
35
35
  },
36
36
  "title": "pay-paypal",
37
37
  "vonaModule": {
@@ -40,5 +40,5 @@
40
40
  "a-vona": "5.0.0"
41
41
  }
42
42
  },
43
- "gitHead": "c408492ce774644ac8a2530702db916986f52151"
43
+ "gitHead": "f56eaba77347037643b625c8e6c5af408ff2d495"
44
44
  }
@@ -11,7 +11,7 @@ import type {
11
11
  IPayProviderWebhookInput,
12
12
  } from 'vona-module-a-pay';
13
13
 
14
- import { CheckoutPaymentIntent, OrderStatus } from '@cabloy/paypal-server-sdk';
14
+ import { ApiError, CheckoutPaymentIntent, OrderStatus } from '@cabloy/paypal-server-sdk';
15
15
  import { BeanBase, useApp } from 'vona';
16
16
  import { PayProvider } from 'vona-module-a-pay';
17
17
  import { z } from 'zod';
@@ -74,7 +74,7 @@ export class PayProviderPaypal
74
74
  ): Promise<IPayProviderPaymentSnapshot> {
75
75
  if (input.providerOrderId) return await this.queryPayment(input, clientOptions);
76
76
  if (!input.returnUrl || !input.cancelUrl) {
77
- this.app.throw(422, 'PayPal payment requires return and cancel URLs');
77
+ this.app.throw(500, 'PayPal payment requires return and cancel URLs');
78
78
  }
79
79
  this._assertReady(clientOptions);
80
80
  const order = await this._gateway(clientOptions).createOrder(
@@ -86,8 +86,8 @@ export class PayProviderPaypal
86
86
  applicationContext: { returnUrl: input.returnUrl, cancelUrl: input.cancelUrl },
87
87
  purchaseUnits: [
88
88
  {
89
- customId: String(input.paymentSessionId),
90
- invoiceId: input.businessReference,
89
+ customId: input.providerCorrelationReference,
90
+ invoiceId: input.providerInvoiceReference,
91
91
  amount: {
92
92
  currencyCode: input.currency,
93
93
  value: formatMinorAmount(input.amountMinor, input.currency),
@@ -98,11 +98,7 @@ export class PayProviderPaypal
98
98
  },
99
99
  );
100
100
  const orderRecord = asRecord(order);
101
- const approvalUrl = readString(
102
- asArray(orderRecord.links)
103
- .map(asRecord)
104
- .find(item => item.rel === 'approve')?.href,
105
- );
101
+ const approvalUrl = this._approvalUrl(orderRecord);
106
102
  const orderId = readString(orderRecord.id);
107
103
  if (!orderId || !approvalUrl) this.app.throw(502, 'PayPal did not return an approval order');
108
104
  return {
@@ -124,6 +120,7 @@ export class PayProviderPaypal
124
120
  {
125
121
  id: input.providerOrderId,
126
122
  paypalRequestId: input.idempotencyKey,
123
+ prefer: 'return=representation',
127
124
  },
128
125
  );
129
126
  return this._mapOrder(order, input, clientOptions);
@@ -146,22 +143,27 @@ export class PayProviderPaypal
146
143
  clientOptions: IPayProviderPaypalClientOptions,
147
144
  ): Promise<IPayProviderRefundSnapshot> {
148
145
  this._assertReady(clientOptions);
149
- const refund = await this._gateway(clientOptions).refundCapturedPayment(
150
- this._gatewayOptions(clientOptions),
151
- {
152
- captureId: input.providerCaptureId,
153
- paypalRequestId: input.idempotencyKey,
154
- body: {
155
- amount: {
156
- currencyCode: input.currency,
157
- value: formatMinorAmount(input.amountMinor, input.currency),
146
+ try {
147
+ const refund = await this._gateway(clientOptions).refundCapturedPayment(
148
+ this._gatewayOptions(clientOptions),
149
+ {
150
+ captureId: input.providerCaptureId,
151
+ paypalRequestId: input.idempotencyKey,
152
+ body: {
153
+ amount: {
154
+ currencyCode: input.currency,
155
+ value: formatMinorAmount(input.amountMinor, input.currency),
156
+ },
157
+ customId: input.providerCorrelationReference,
158
+ invoiceId: input.providerInvoiceReference,
158
159
  },
159
- customId: String(input.refundOperationId),
160
- invoiceId: input.businessReference,
161
160
  },
162
- },
163
- );
164
- return this._mapRefund(refund, input, clientOptions);
161
+ );
162
+ return this._mapRefund(refund, input, clientOptions);
163
+ } catch (error) {
164
+ if (this._isDefinitiveRefundRejection(error)) return { state: 'failed' };
165
+ throw error;
166
+ }
165
167
  }
166
168
 
167
169
  async queryRefund(
@@ -198,6 +200,186 @@ export class PayProviderPaypal
198
200
  return await this._mapWebhook(webhook.data, clientOptions);
199
201
  }
200
202
 
203
+ private async _mapRefundWebhook(
204
+ event: z.infer<typeof PaypalWebhookSchema>,
205
+ resource: Record<string, unknown>,
206
+ resourceId: string,
207
+ clientOptions: IPayProviderPaypalClientOptions,
208
+ ): Promise<IPayProviderVerifiedWebhook> {
209
+ const captureId = readNestedString(resource, [
210
+ 'supplementary_data',
211
+ 'related_ids',
212
+ 'capture_id',
213
+ ]);
214
+ if (!captureId) this.app.throw(400, 'PayPal refund webhook has no capture identifier');
215
+
216
+ const refundByProviderId = await this.$scope.pay.model.refundOperation.get({
217
+ providerRefundId: resourceId,
218
+ });
219
+ const customId = readString(readField(resource, 'customId', 'custom_id'));
220
+ const refund =
221
+ refundByProviderId ??
222
+ (customId
223
+ ? await this.$scope.pay.model.refundOperation.get({
224
+ providerCorrelationReference: customId,
225
+ })
226
+ : undefined);
227
+ if (!refund) this.app.throw(400, 'PayPal refund webhook is not correlated');
228
+ const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
229
+ if (!session || session.providerCaptureId !== captureId) {
230
+ this.app.throw(409, 'PayPal refund webhook capture conflicts');
231
+ }
232
+ const snapshot = this._mapRefund(
233
+ resource,
234
+ {
235
+ paymentSessionId: session.id,
236
+ refundOperationId: refund.id,
237
+ businessReference: refund.businessReference,
238
+ providerInvoiceReference: refund.providerInvoiceReference,
239
+ providerCorrelationReference: refund.providerCorrelationReference,
240
+ idempotencyKey: '',
241
+ amountMinor: refund.amountMinor,
242
+ currency: refund.currency,
243
+ providerCaptureId: captureId,
244
+ providerRefundId: resourceId,
245
+ },
246
+ clientOptions,
247
+ );
248
+ return {
249
+ eventId: event.id,
250
+ eventType: event.event_type,
251
+ refundOperationId: refund.id,
252
+ refund: snapshot,
253
+ summary: { amountMinor: refund.amountMinor, currency: refund.currency },
254
+ };
255
+ }
256
+
257
+ private async _mapCaptureRefundedWebhook(
258
+ event: z.infer<typeof PaypalWebhookSchema>,
259
+ resource: Record<string, unknown>,
260
+ resourceId: string,
261
+ clientOptions: IPayProviderPaypalClientOptions,
262
+ ): Promise<IPayProviderVerifiedWebhook> {
263
+ const relatedCaptureId = readNestedString(resource, [
264
+ 'supplementary_data',
265
+ 'related_ids',
266
+ 'capture_id',
267
+ ]);
268
+ const relatedRefundId = readNestedString(resource, [
269
+ 'supplementary_data',
270
+ 'related_ids',
271
+ 'refund_id',
272
+ ]);
273
+ if (relatedRefundId) {
274
+ return await this._mapCaptureRefundedRefund(
275
+ event,
276
+ await this._gateway(clientOptions).getRefund(this._gatewayOptions(clientOptions), {
277
+ refundId: relatedRefundId,
278
+ }),
279
+ relatedRefundId,
280
+ relatedCaptureId,
281
+ clientOptions,
282
+ );
283
+ }
284
+ try {
285
+ const capture = asRecord(
286
+ await this._gateway(clientOptions).getCapturedPayment(this._gatewayOptions(clientOptions), {
287
+ captureId: resourceId,
288
+ }),
289
+ );
290
+ const captureId = readString(capture.id);
291
+ if (!captureId || captureId !== resourceId) {
292
+ this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
293
+ }
294
+ if (relatedCaptureId && relatedCaptureId !== captureId) {
295
+ this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
296
+ }
297
+ return this._ignoredCaptureRefund(event, resource, captureId);
298
+ } catch (error) {
299
+ if (!this._isPaypalNotFound(error)) throw error;
300
+ }
301
+ return await this._mapCaptureRefundedRefund(
302
+ event,
303
+ await this._gateway(clientOptions).getRefund(this._gatewayOptions(clientOptions), {
304
+ refundId: resourceId,
305
+ }),
306
+ resourceId,
307
+ relatedCaptureId,
308
+ clientOptions,
309
+ );
310
+ }
311
+
312
+ private async _mapCaptureRefundedRefund(
313
+ event: z.infer<typeof PaypalWebhookSchema>,
314
+ refundResource: unknown,
315
+ refundId: string,
316
+ relatedCaptureId: string | undefined,
317
+ clientOptions: IPayProviderPaypalClientOptions,
318
+ ): Promise<IPayProviderVerifiedWebhook> {
319
+ const refundRecord = asRecord(refundResource);
320
+ if (readString(refundRecord.id) !== refundId) {
321
+ this.app.throw(409, 'PayPal capture refund webhook refund conflicts');
322
+ }
323
+ const customId = readString(readField(refundRecord, 'customId', 'custom_id'));
324
+ const invoiceId = readString(readField(refundRecord, 'invoiceId', 'invoice_id'));
325
+ if (!customId || !invoiceId) {
326
+ this.app.throw(400, 'PayPal capture refund webhook is not correlated');
327
+ }
328
+ const refund = await this.$scope.pay.model.refundOperation.get({
329
+ providerCorrelationReference: customId,
330
+ });
331
+ if (!refund || refund.providerInvoiceReference !== invoiceId) {
332
+ this.app.throw(400, 'PayPal capture refund webhook is not correlated');
333
+ }
334
+ const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
335
+ if (!session?.providerCaptureId) {
336
+ this.app.throw(409, 'PayPal capture refund webhook payment session conflicts');
337
+ }
338
+ if (relatedCaptureId && session.providerCaptureId !== relatedCaptureId) {
339
+ this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
340
+ }
341
+ const snapshot = this._mapRefund(
342
+ refundRecord,
343
+ {
344
+ paymentSessionId: session.id,
345
+ refundOperationId: refund.id,
346
+ businessReference: refund.businessReference,
347
+ providerInvoiceReference: refund.providerInvoiceReference,
348
+ providerCorrelationReference: refund.providerCorrelationReference,
349
+ idempotencyKey: '',
350
+ amountMinor: refund.amountMinor,
351
+ currency: refund.currency,
352
+ providerCaptureId: session.providerCaptureId,
353
+ providerRefundId: refundId,
354
+ },
355
+ clientOptions,
356
+ );
357
+ return {
358
+ eventId: event.id,
359
+ eventType: event.event_type,
360
+ refundOperationId: refund.id,
361
+ refund: snapshot,
362
+ summary: { amountMinor: refund.amountMinor, currency: refund.currency },
363
+ };
364
+ }
365
+
366
+ private _ignoredCaptureRefund(
367
+ event: z.infer<typeof PaypalWebhookSchema>,
368
+ resource: Record<string, unknown>,
369
+ captureId: string,
370
+ ): IPayProviderVerifiedWebhook {
371
+ return {
372
+ eventId: event.id,
373
+ eventType: event.event_type,
374
+ providerCaptureId: captureId,
375
+ ignored: true,
376
+ summary: {
377
+ amountMinor: parsePaypalAmount(resource.amount)!,
378
+ currency: parsePaypalCurrency(resource.amount)!,
379
+ },
380
+ };
381
+ }
382
+
201
383
  private async _mapWebhook(
202
384
  event: z.infer<typeof PaypalWebhookSchema>,
203
385
  clientOptions: IPayProviderPaypalClientOptions,
@@ -206,47 +388,15 @@ export class PayProviderPaypal
206
388
  const amount = parsePaypalAmount(resource.amount);
207
389
  const currency = parsePaypalCurrency(resource.amount);
208
390
  const resourceId = readString(resource.id);
209
- if (!resourceId || !amount || !currency)
391
+ if (!resourceId || amount === undefined || !currency)
210
392
  this.app.throw(400, 'PayPal webhook has invalid resource');
211
393
 
212
- if (isRefundEvent(event.event_type)) {
213
- const refundOperationId = readString(readField(resource, 'customId', 'custom_id'));
214
- const captureId = readNestedString(resource, [
215
- 'supplementary_data',
216
- 'related_ids',
217
- 'capture_id',
218
- ]);
219
- if (!refundOperationId || !captureId)
220
- this.app.throw(400, 'PayPal refund webhook is not correlated');
221
- const refund = await this.$scope.pay.model.refundOperation.getById(
222
- refundOperationId as never,
223
- );
224
- if (!refund) this.app.throw(404, 'PayPal refund operation not found');
225
- const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
226
- if (!session || session.providerCaptureId !== captureId) {
227
- this.app.throw(409, 'PayPal refund webhook capture conflicts');
228
- }
229
- const snapshot = this._mapRefund(
230
- resource,
231
- {
232
- paymentSessionId: session.id,
233
- refundOperationId: refund.id,
234
- businessReference: refund.businessReference,
235
- idempotencyKey: '',
236
- amountMinor: refund.amountMinor,
237
- currency: refund.currency,
238
- providerCaptureId: captureId,
239
- providerRefundId: resourceId,
240
- },
241
- clientOptions,
242
- );
243
- return {
244
- eventId: event.id,
245
- eventType: event.event_type,
246
- refundOperationId: refund.id,
247
- refund: snapshot,
248
- summary: { amountMinor: amount, currency },
249
- };
394
+ if (event.event_type.startsWith('PAYMENT.REFUND.')) {
395
+ return await this._mapRefundWebhook(event, resource, resourceId, clientOptions);
396
+ }
397
+
398
+ if (event.event_type === 'PAYMENT.CAPTURE.REFUNDED') {
399
+ return await this._mapCaptureRefundedWebhook(event, resource, resourceId, clientOptions);
250
400
  }
251
401
 
252
402
  if (event.event_type.startsWith('PAYMENT.CAPTURE.')) {
@@ -258,7 +408,7 @@ export class PayProviderPaypal
258
408
  id: orderId,
259
409
  },
260
410
  );
261
- const input = this._inputFromOrder(order, orderId);
411
+ const input = await this._inputFromOrder(order, orderId);
262
412
  const payment = this._mapOrder(order, input, clientOptions);
263
413
  if (!['succeeded', 'failed', 'cancelled'].includes(payment.state)) {
264
414
  this.app.throw(400, 'PayPal capture webhook is not terminal');
@@ -277,20 +427,36 @@ export class PayProviderPaypal
277
427
  this.app.throw(400, 'PayPal webhook event type is unsupported');
278
428
  }
279
429
 
280
- private _inputFromOrder(order: unknown, providerOrderId: string): IPayProviderPaymentInput {
430
+ private async _inputFromOrder(
431
+ order: unknown,
432
+ providerOrderId: string,
433
+ ): Promise<IPayProviderPaymentInput> {
281
434
  const orderRecord = asRecord(order);
282
435
  const unit = asArray(readField(orderRecord, 'purchaseUnits', 'purchase_units'))[0];
283
436
  const unitRecord = asRecord(unit);
284
- const customId = readString(readField(unitRecord, 'customId', 'custom_id'));
285
- const businessReference = readString(readField(unitRecord, 'invoiceId', 'invoice_id'));
437
+ const providerCorrelationReference = readString(readField(unitRecord, 'customId', 'custom_id'));
438
+ const providerInvoiceReference = readString(readField(unitRecord, 'invoiceId', 'invoice_id'));
286
439
  const amountMinor = parsePaypalAmount(readField(unitRecord, 'amount'));
287
440
  const currency = parsePaypalCurrency(readField(unitRecord, 'amount'));
288
- if (!customId || !businessReference || amountMinor === undefined || !currency) {
441
+ if (
442
+ !providerCorrelationReference ||
443
+ !providerInvoiceReference ||
444
+ amountMinor === undefined ||
445
+ !currency
446
+ ) {
447
+ this.app.throw(400, 'PayPal order is not correlated');
448
+ }
449
+ const session = await this.$scope.pay.model.paymentSession.get({
450
+ providerCorrelationReference,
451
+ });
452
+ if (!session || session.providerInvoiceReference !== providerInvoiceReference) {
289
453
  this.app.throw(400, 'PayPal order is not correlated');
290
454
  }
291
455
  return {
292
- paymentSessionId: customId as never,
293
- businessReference,
456
+ paymentSessionId: session.id,
457
+ businessReference: session.businessReference,
458
+ providerInvoiceReference: session.providerInvoiceReference,
459
+ providerCorrelationReference: session.providerCorrelationReference,
294
460
  idempotencyKey: '',
295
461
  amountMinor,
296
462
  currency,
@@ -312,14 +478,14 @@ export class PayProviderPaypal
312
478
  if (units.length !== 1) this.app.throw(409, 'PayPal order has an invalid purchase-unit count');
313
479
  const unit = asRecord(units[0]);
314
480
  if (
315
- readString(readField(unit, 'customId', 'custom_id')) !== String(input.paymentSessionId) ||
316
- readString(readField(unit, 'invoiceId', 'invoice_id')) !== input.businessReference ||
481
+ readString(readField(unit, 'customId', 'custom_id')) !== input.providerCorrelationReference ||
482
+ readString(readField(unit, 'invoiceId', 'invoice_id')) !== input.providerInvoiceReference ||
317
483
  parsePaypalAmount(readField(unit, 'amount')) !== input.amountMinor ||
318
484
  parsePaypalCurrency(readField(unit, 'amount')) !== input.currency
319
485
  ) {
320
486
  this.app.throw(409, 'PayPal order facts conflict with the payment session');
321
487
  }
322
- this._assertMerchant(unit, clientOptions);
488
+ this._assertMerchant(unit, clientOptions, 'order');
323
489
  const captures = asArray(readField(asRecord(readField(unit, 'payments')), 'captures'));
324
490
  if (captures.length > 1) this.app.throw(409, 'PayPal order has multiple captures');
325
491
  const capture = asRecord(captures[0]);
@@ -361,30 +527,56 @@ export class PayProviderPaypal
361
527
  if (orderRecord.status === OrderStatus.Voided) {
362
528
  return { state: 'cancelled', providerPaymentId: orderId, providerOrderId: orderId };
363
529
  }
364
- return { state: 'requires_action', providerPaymentId: orderId, providerOrderId: orderId };
530
+ const approvalUrl = this._approvalUrl(orderRecord);
531
+ return {
532
+ state: 'requires_action',
533
+ providerPaymentId: orderId,
534
+ providerOrderId: orderId,
535
+ ...(approvalUrl && { nextAction: { kind: 'redirect' as const, url: approvalUrl } }),
536
+ };
537
+ }
538
+
539
+ private _approvalUrl(order: Record<string, unknown>) {
540
+ return readString(
541
+ asArray(order.links)
542
+ .map(asRecord)
543
+ .find(item => item.rel === 'approve')?.href,
544
+ );
365
545
  }
366
546
 
367
547
  private _mapRefund(
368
548
  refund: unknown,
369
549
  input: IPayProviderRefundInput,
370
550
  clientOptions: IPayProviderPaypalClientOptions,
551
+ requireCorrelationMetadata = true,
371
552
  ): IPayProviderRefundSnapshot {
372
553
  const record = asRecord(refund);
373
554
  const providerRefundId = readString(record.id);
374
555
  if (!providerRefundId) this.app.throw(502, 'PayPal refund returned no identifier');
556
+ const customId = readString(readField(record, 'customId', 'custom_id'));
557
+ const invoiceId = readString(readField(record, 'invoiceId', 'invoice_id'));
375
558
  if (
376
559
  (input.providerRefundId && input.providerRefundId !== providerRefundId) ||
377
- readString(readField(record, 'customId', 'custom_id')) !== String(input.refundOperationId) ||
378
- readString(readField(record, 'invoiceId', 'invoice_id')) !== input.businessReference ||
560
+ (customId && customId !== input.providerCorrelationReference) ||
561
+ (invoiceId && invoiceId !== input.providerInvoiceReference) ||
562
+ (requireCorrelationMetadata && (!customId || !invoiceId)) ||
379
563
  parsePaypalAmount(record.amount) !== input.amountMinor ||
380
564
  parsePaypalCurrency(record.amount) !== input.currency
381
565
  ) {
382
566
  this.app.throw(409, 'PayPal refund facts conflict with the refund operation');
383
567
  }
384
- this._assertMerchant(record, clientOptions);
568
+ this._assertMerchant(record, clientOptions, 'refund');
385
569
  return mapRefund(readString(record.status), providerRefundId);
386
570
  }
387
571
 
572
+ private _isDefinitiveRefundRejection(error: unknown) {
573
+ return error instanceof ApiError && error.statusCode === 422;
574
+ }
575
+
576
+ private _isPaypalNotFound(error: unknown) {
577
+ return error instanceof ApiError && error.statusCode === 404;
578
+ }
579
+
388
580
  private _gateway(clientOptions: IPayProviderPaypalClientOptions) {
389
581
  return clientOptions.gateway ?? createPaypalGateway(this.bean.core.fetch);
390
582
  }
@@ -423,16 +615,31 @@ export class PayProviderPaypal
423
615
  private _assertMerchant(
424
616
  value: Record<string, unknown>,
425
617
  clientOptions: IPayProviderPaypalClientOptions,
618
+ resourceType: 'order' | 'refund',
426
619
  ) {
427
- const merchantId =
428
- readNestedString(value, ['payee', 'merchantId']) ??
429
- readNestedString(value, ['payee', 'merchant_id']) ??
430
- readNestedString(value, ['sellerReceivableBreakdown', 'payee', 'merchantId']) ??
431
- readNestedString(value, ['seller_receivable_breakdown', 'payee', 'merchant_id']);
432
- if (!merchantId || merchantId !== clientOptions.merchantReference) {
620
+ const merchant = this._merchantReference(value, resourceType);
621
+ if (
622
+ !merchant.observedMerchantReference ||
623
+ merchant.observedMerchantReference !== clientOptions.merchantReference
624
+ ) {
625
+ this.$logger.warn({
626
+ event: 'paypal.merchant_reference_conflict',
627
+ observedMerchantSource: merchant.observedMerchantSource,
628
+ });
433
629
  this.app.throw(409, 'PayPal merchant reference conflicts');
434
630
  }
435
631
  }
632
+
633
+ private _merchantReference(value: Record<string, unknown>, resourceType: 'order' | 'refund') {
634
+ const field = resourceType === 'order' ? 'payee' : 'payer';
635
+ const merchantReference =
636
+ readNestedString(value, [field, 'merchantId']) ??
637
+ readNestedString(value, [field, 'merchant_id']);
638
+ return {
639
+ observedMerchantReference: merchantReference,
640
+ observedMerchantSource: merchantReference ? `${field}.merchant_id` : 'missing',
641
+ };
642
+ }
436
643
  }
437
644
 
438
645
  function formatMinorAmount(amountMinor: number, currency: string) {
@@ -500,10 +707,6 @@ function parsePaypalCurrency(value: unknown) {
500
707
  return currency === 'USD' ? currency : undefined;
501
708
  }
502
709
 
503
- function isRefundEvent(eventType: string) {
504
- return eventType === 'PAYMENT.CAPTURE.REFUNDED' || eventType.startsWith('PAYMENT.REFUND.');
505
- }
506
-
507
710
  declare module 'vona-module-a-pay' {
508
711
  export interface IPayProviderRecord {
509
712
  'pay-paypal:paypal': IPayProviderOptionsPaypal;
@@ -12,11 +12,14 @@ export interface IPaypalGatewayOptions {
12
12
  webhookId: string;
13
13
  }
14
14
 
15
+ export const PaypalRequestTimeoutMilliseconds = 15_000;
16
+
15
17
  export interface IPaypalGateway {
16
18
  createOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
17
19
  captureOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
18
20
  getOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
19
21
  refundCapturedPayment(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
22
+ getCapturedPayment(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
20
23
  getRefund(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
21
24
  verifyWebhookSignature(
22
25
  options: IPaypalGatewayOptions,
@@ -50,6 +53,11 @@ export function createPaypalGateway(fetcher: typeof fetch): IPaypalGateway {
50
53
  await new PaymentsController(createClient(options)).refundCapturedPayment(input as never)
51
54
  ).result;
52
55
  },
56
+ async getCapturedPayment(options, input) {
57
+ return (
58
+ await new PaymentsController(createClient(options)).getCapturedPayment(input as never)
59
+ ).result;
60
+ },
53
61
  async getRefund(options, input) {
54
62
  return (await new PaymentsController(createClient(options)).getRefund(input as never)).result;
55
63
  },
@@ -110,7 +118,7 @@ function createClient(options: IPaypalGatewayOptions) {
110
118
  oAuthClientId: options.clientId,
111
119
  oAuthClientSecret: options.clientSecret,
112
120
  },
113
- timeout: 0,
121
+ timeout: PaypalRequestTimeoutMilliseconds,
114
122
  environment: options.environment === 'live' ? Environment.Production : Environment.Sandbox,
115
123
  });
116
124
  }