Browse Source

feat(core): Pass RequestContext to PaymentMethodHandler functions

Closes #488

BREAKING CHANGE: The `PaymentMethodHandler` function signatures have changed:
`createPayment()`, `settlePayment()` & `createRefund()` now all get passed the
RequestContext object as the first argument.
Michael Bromley 5 years ago
parent
commit
9c2257d228

+ 2 - 2
docs/content/docs/developer-guide/payment-integrations/index.md

@@ -46,7 +46,7 @@ const myPaymentIntegration = new PaymentMethodHandler({
   },
 
   /** This is called when the `addPaymentToOrder` mutation is executed */
-  createPayment: async (order, args, metadata): Promise<CreatePaymentResult> => {
+  createPayment: async (ctx, order, args, metadata): Promise<CreatePaymentResult> => {
     try {
       const result = await sdk.charges.create({
         apiKey: args.apiKey,
@@ -80,7 +80,7 @@ const myPaymentIntegration = new PaymentMethodHandler({
   },
 
   /** This is called when the `settlePayment` mutation is executed */
-  settlePayment: async (order, payment, args): Promise<SettlePaymentResult> => {
+  settlePayment: async (ctx, order, payment, args): Promise<SettlePaymentResult> => {
     try {
       const result = await sdk.charges.capture({ 
         apiKey: args.apiKey,

+ 10 - 10
packages/core/e2e/fixtures/test-payment-methods.ts

@@ -6,7 +6,7 @@ export const testSuccessfulPaymentMethod = new PaymentMethodHandler({
     code: 'test-payment-method',
     description: [{ languageCode: LanguageCode.en, value: 'Test Payment Method' }],
     args: {},
-    createPayment: (order, args, metadata) => {
+    createPayment: (ctx, order, args, metadata) => {
         return {
             amount: order.total,
             state: 'Settled',
@@ -14,7 +14,7 @@ export const testSuccessfulPaymentMethod = new PaymentMethodHandler({
             metadata: { public: metadata },
         };
     },
-    settlePayment: order => ({
+    settlePayment: () => ({
         success: true,
     }),
 });
@@ -27,7 +27,7 @@ export const twoStagePaymentMethod = new PaymentMethodHandler({
     code: 'authorize-only-payment-method',
     description: [{ languageCode: LanguageCode.en, value: 'Test Payment Method' }],
     args: {},
-    createPayment: (order, args, metadata) => {
+    createPayment: (ctx, order, args, metadata) => {
         return {
             amount: order.total,
             state: 'Authorized',
@@ -55,7 +55,7 @@ export const singleStageRefundablePaymentMethod = new PaymentMethodHandler({
     code: 'single-stage-refundable-payment-method',
     description: [{ languageCode: LanguageCode.en, value: 'Test Payment Method' }],
     args: {},
-    createPayment: (order, args, metadata) => {
+    createPayment: (ctx, order, args, metadata) => {
         return {
             amount: order.total,
             state: 'Settled',
@@ -66,7 +66,7 @@ export const singleStageRefundablePaymentMethod = new PaymentMethodHandler({
     settlePayment: () => {
         return { success: true };
     },
-    createRefund: (input, total, order, payment, args) => {
+    createRefund: (ctx, input, total, order, payment, args) => {
         return {
             amount: total,
             state: 'Settled',
@@ -82,7 +82,7 @@ export const failsToSettlePaymentMethod = new PaymentMethodHandler({
     code: 'fails-to-settle-payment-method',
     description: [{ languageCode: LanguageCode.en, value: 'Test Payment Method' }],
     args: {},
-    createPayment: (order, args, metadata) => {
+    createPayment: (ctx, order, args, metadata) => {
         return {
             amount: order.total,
             state: 'Authorized',
@@ -112,7 +112,7 @@ export const testFailingPaymentMethod = new PaymentMethodHandler({
     code: 'test-failing-payment-method',
     description: [{ languageCode: LanguageCode.en, value: 'Test Failing Payment Method' }],
     args: {},
-    createPayment: (order, args, metadata) => {
+    createPayment: (ctx, order, args, metadata) => {
         return {
             amount: order.total,
             state: 'Declined',
@@ -120,7 +120,7 @@ export const testFailingPaymentMethod = new PaymentMethodHandler({
             metadata: { public: metadata },
         };
     },
-    settlePayment: order => ({
+    settlePayment: () => ({
         success: true,
     }),
 });
@@ -128,7 +128,7 @@ export const testErrorPaymentMethod = new PaymentMethodHandler({
     code: 'test-error-payment-method',
     description: [{ languageCode: LanguageCode.en, value: 'Test Error Payment Method' }],
     args: {},
-    createPayment: (order, args, metadata) => {
+    createPayment: (ctx, order, args, metadata) => {
         return {
             amount: order.total,
             state: 'Error',
@@ -136,7 +136,7 @@ export const testErrorPaymentMethod = new PaymentMethodHandler({
             metadata,
         };
     },
-    settlePayment: order => ({
+    settlePayment: () => ({
         success: true,
     }),
 });

+ 2 - 2
packages/core/src/config/payment-method/example-payment-method-handler.ts

@@ -29,7 +29,7 @@ export const examplePaymentHandler = new PaymentMethodHandler({
         automaticCapture: { type: 'boolean' },
         apiKey: { type: 'string' },
     },
-    createPayment: async (order, args, metadata): Promise<CreatePaymentResult> => {
+    createPayment: async (ctx, order, args, metadata): Promise<CreatePaymentResult> => {
         try {
             const result = await gripeSDK.charges.create({
                 apiKey: args.apiKey,
@@ -52,7 +52,7 @@ export const examplePaymentHandler = new PaymentMethodHandler({
             };
         }
     },
-    settlePayment: async (order, payment, args) => {
+    settlePayment: async (ctx, order, payment, args) => {
         const result = await gripeSDK.charges.capture(payment.transactionId);
         return {
             success: result,

+ 12 - 7
packages/core/src/config/payment-method/payment-method-handler.ts

@@ -1,5 +1,6 @@
 import { ConfigArg, RefundOrderInput } from '@vendure/common/lib/generated-types';
 
+import { RequestContext } from '../../api/common/request-context';
 import {
     ConfigArgs,
     ConfigArgValues,
@@ -121,6 +122,7 @@ export interface SettlePaymentResult {
  * @docsPage Payment Method Types
  */
 export type CreatePaymentFn<T extends ConfigArgs> = (
+    ctx: RequestContext,
     order: Order,
     args: ConfigArgValues<T>,
     metadata: PaymentMetadata,
@@ -134,6 +136,7 @@ export type CreatePaymentFn<T extends ConfigArgs> = (
  * @docsPage Payment Method Types
  */
 export type SettlePaymentFn<T extends ConfigArgs> = (
+    ctx: RequestContext,
     order: Order,
     payment: Payment,
     args: ConfigArgValues<T>,
@@ -147,6 +150,7 @@ export type SettlePaymentFn<T extends ConfigArgs> = (
  * @docsPage Payment Method Types
  */
 export type CreateRefundFn<T extends ConfigArgs> = (
+    ctx: RequestContext,
     input: RefundOrderInput,
     total: number,
     order: Order,
@@ -217,7 +221,7 @@ export interface PaymentMethodConfigOptions<T extends ConfigArgs> extends Config
  *     args: {
  *         apiKey: { type: 'string' },
  *     },
- *     createPayment: async (order, args, metadata): Promise<CreatePaymentResult> => {
+ *     createPayment: async (ctx, order, args, metadata): Promise<CreatePaymentResult> => {
  *         try {
  *             const result = await gripeSDK.charges.create({
  *                 apiKey: args.apiKey,
@@ -240,7 +244,7 @@ export interface PaymentMethodConfigOptions<T extends ConfigArgs> extends Config
  *             };
  *         }
  *     },
- *     settlePayment: async (order, payment, args): Promise<SettlePaymentResult> => {
+ *     settlePayment: async (ctx, order, payment, args): Promise<SettlePaymentResult> => {
  *         return { success: true };
  *     }
  * });
@@ -269,8 +273,8 @@ export class PaymentMethodHandler<T extends ConfigArgs = ConfigArgs> extends Con
      *
      * @internal
      */
-    async createPayment(order: Order, args: ConfigArg[], metadata: PaymentMetadata) {
-        const paymentConfig = await this.createPaymentFn(order, this.argsArrayToHash(args), metadata);
+    async createPayment(ctx: RequestContext, order: Order, args: ConfigArg[], metadata: PaymentMetadata) {
+        const paymentConfig = await this.createPaymentFn(ctx, order, this.argsArrayToHash(args), metadata);
         return {
             method: this.code,
             ...paymentConfig,
@@ -283,8 +287,8 @@ export class PaymentMethodHandler<T extends ConfigArgs = ConfigArgs> extends Con
      *
      * @internal
      */
-    async settlePayment(order: Order, payment: Payment, args: ConfigArg[]) {
-        return this.settlePaymentFn(order, payment, this.argsArrayToHash(args));
+    async settlePayment(ctx: RequestContext, order: Order, payment: Payment, args: ConfigArg[]) {
+        return this.settlePaymentFn(ctx, order, payment, this.argsArrayToHash(args));
     }
 
     /**
@@ -294,6 +298,7 @@ export class PaymentMethodHandler<T extends ConfigArgs = ConfigArgs> extends Con
      * @internal
      */
     async createRefund(
+        ctx: RequestContext,
         input: RefundOrderInput,
         total: number,
         order: Order,
@@ -301,7 +306,7 @@ export class PaymentMethodHandler<T extends ConfigArgs = ConfigArgs> extends Con
         args: ConfigArg[],
     ) {
         return this.createRefundFn
-            ? this.createRefundFn(input, total, order, payment, this.argsArrayToHash(args))
+            ? this.createRefundFn(ctx, input, total, order, payment, this.argsArrayToHash(args))
             : false;
     }
 

+ 3 - 2
packages/core/src/service/services/payment-method.service.ts

@@ -80,7 +80,7 @@ export class PaymentMethodService {
 
     async createPayment(ctx: RequestContext, order: Order, method: string, metadata: any): Promise<Payment> {
         const { paymentMethod, handler } = await this.getMethodAndHandler(ctx, method);
-        const result = await handler.createPayment(order, paymentMethod.configArgs, metadata || {});
+        const result = await handler.createPayment(ctx, order, paymentMethod.configArgs, metadata || {});
         const initialState = 'Created';
         const payment = await this.connection
             .getRepository(ctx, Payment)
@@ -95,7 +95,7 @@ export class PaymentMethodService {
 
     async settlePayment(ctx: RequestContext, payment: Payment, order: Order) {
         const { paymentMethod, handler } = await this.getMethodAndHandler(ctx, payment.method);
-        return handler.settlePayment(order, payment, paymentMethod.configArgs);
+        return handler.settlePayment(ctx, order, payment, paymentMethod.configArgs);
     }
 
     async createRefund(
@@ -121,6 +121,7 @@ export class PaymentMethodService {
             metadata: {},
         });
         const createRefundResult = await handler.createRefund(
+            ctx,
             input,
             refundAmount,
             order,