Browse Source

feat(core): Pass payment method to handler and eligibility checker (#1564)

Alexander Shitikov 3 years ago
parent
commit
4e63180247

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

@@ -51,7 +51,7 @@ export const dummyPaymentHandler = new PaymentMethodHandler({
             defaultValue: false,
         },
     },
-    createPayment: async (ctx, order, amount, args, metadata) => {
+    createPayment: async (ctx, order, amount, args, metadata, method) => {
         if (metadata.shouldDecline) {
             return {
                 amount,
@@ -78,7 +78,7 @@ export const dummyPaymentHandler = new PaymentMethodHandler({
             };
         }
     },
-    settlePayment: async (ctx, order, payment, args) => {
+    settlePayment: async (ctx, order, payment, args, method) => {
         if (payment.metadata.shouldErrorOnSettle) {
             return {
                 success: false,

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

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

+ 4 - 3
packages/core/src/config/payment/payment-method-eligibility-checker.ts

@@ -7,7 +7,7 @@ import {
     ConfigurableOperationDef,
     ConfigurableOperationDefOptions,
 } from '../../common/configurable-operation';
-import { Order } from '../../entity/order/order.entity';
+import { PaymentMethod, Order } from '../../entity';
 
 /**
  * @description
@@ -60,8 +60,8 @@ export class PaymentMethodEligibilityChecker<
      *
      * @internal
      */
-    async check(ctx: RequestContext, order: Order, args: ConfigArg[]): Promise<boolean | string> {
-        return this.checkFn(ctx, order, this.argsArrayToHash(args));
+    async check(ctx: RequestContext, order: Order, args: ConfigArg[], method: PaymentMethod): Promise<boolean | string> {
+        return this.checkFn(ctx, order, this.argsArrayToHash(args), method);
     }
 }
 
@@ -79,4 +79,5 @@ export type CheckPaymentMethodEligibilityCheckerFn<T extends ConfigArgs> = (
     ctx: RequestContext,
     order: Order,
     args: ConfigArgValues<T>,
+    method: PaymentMethod
 ) => boolean | string | Promise<boolean | string>;

+ 16 - 5
packages/core/src/config/payment/payment-method-handler.ts

@@ -9,8 +9,7 @@ import {
 } from '../../common/configurable-operation';
 import { OnTransitionStartFn, StateMachineConfig } from '../../common/finite-state-machine/types';
 import { PaymentMetadata } from '../../common/types/common-types';
-import { Order } from '../../entity/order/order.entity';
-import { Payment } from '../../entity/payment/payment.entity';
+import { Order, Payment, PaymentMethod } from '../../entity';
 import {
     PaymentState,
     PaymentTransitionData,
@@ -158,6 +157,7 @@ export type CreatePaymentFn<T extends ConfigArgs> = (
     amount: number,
     args: ConfigArgValues<T>,
     metadata: PaymentMetadata,
+    method: PaymentMethod,
 ) => CreatePaymentResult | CreatePaymentErrorResult | Promise<CreatePaymentResult | CreatePaymentErrorResult>;
 
 /**
@@ -172,6 +172,7 @@ export type SettlePaymentFn<T extends ConfigArgs> = (
     order: Order,
     payment: Payment,
     args: ConfigArgValues<T>,
+    method: PaymentMethod,
 ) => SettlePaymentResult | SettlePaymentErrorResult | Promise<SettlePaymentResult | SettlePaymentErrorResult>;
 
 /**
@@ -188,6 +189,7 @@ export type CreateRefundFn<T extends ConfigArgs> = (
     order: Order,
     payment: Payment,
     args: ConfigArgValues<T>,
+    method: PaymentMethod,
 ) => CreateRefundResult | Promise<CreateRefundResult>;
 
 /**
@@ -311,6 +313,7 @@ export class PaymentMethodHandler<T extends ConfigArgs = ConfigArgs> extends Con
         amount: number,
         args: ConfigArg[],
         metadata: PaymentMetadata,
+        method: PaymentMethod,
     ) {
         const paymentConfig = await this.createPaymentFn(
             ctx,
@@ -318,6 +321,7 @@ export class PaymentMethodHandler<T extends ConfigArgs = ConfigArgs> extends Con
             amount,
             this.argsArrayToHash(args),
             metadata,
+            method,
         );
         return {
             method: this.code,
@@ -332,8 +336,14 @@ export class PaymentMethodHandler<T extends ConfigArgs = ConfigArgs> extends Con
      *
      * @internal
      */
-    async settlePayment(ctx: RequestContext, order: Order, payment: Payment, args: ConfigArg[]) {
-        return this.settlePaymentFn(ctx, order, payment, this.argsArrayToHash(args));
+    async settlePayment(
+        ctx: RequestContext, 
+        order: Order, 
+        payment: Payment, 
+        args: ConfigArg[],
+        method: PaymentMethod,
+    ) {
+        return this.settlePaymentFn(ctx, order, payment, this.argsArrayToHash(args), method);
     }
 
     /**
@@ -349,9 +359,10 @@ export class PaymentMethodHandler<T extends ConfigArgs = ConfigArgs> extends Con
         order: Order,
         payment: Payment,
         args: ConfigArg[],
+        method: PaymentMethod,
     ) {
         return this.createRefundFn
-            ? this.createRefundFn(ctx, input, amount, order, payment, this.argsArrayToHash(args))
+            ? this.createRefundFn(ctx, input, amount, order, payment, this.argsArrayToHash(args), method)
             : false;
     }
 

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

@@ -177,7 +177,7 @@ export class PaymentMethodService {
                     'PaymentMethodEligibilityChecker',
                     method.checker.code,
                 );
-                const eligible = await checker.check(ctx, order, method.checker.args);
+                const eligible = await checker.check(ctx, order, method.checker.args, method);
                 if (eligible === false || typeof eligible === 'string') {
                     isEligible = false;
                     eligibilityMessage = typeof eligible === 'string' ? eligible : undefined;

+ 4 - 1
packages/core/src/service/services/payment.service.ts

@@ -117,7 +117,7 @@ export class PaymentService {
             method,
         );
         if (paymentMethod.checker && checker) {
-            const eligible = await checker.check(ctx, order, paymentMethod.checker.args);
+            const eligible = await checker.check(ctx, order, paymentMethod.checker.args, paymentMethod);
             if (eligible === false || typeof eligible === 'string') {
                 return new IneligiblePaymentMethodError(typeof eligible === 'string' ? eligible : undefined);
             }
@@ -128,6 +128,7 @@ export class PaymentService {
             amount,
             paymentMethod.handler.args,
             metadata || {},
+            paymentMethod,
         );
         const initialState = 'Created';
         const payment = await this.connection
@@ -162,6 +163,7 @@ export class PaymentService {
             payment.order,
             payment,
             paymentMethod.handler.args,
+            paymentMethod,
         );
         const fromState = payment.state;
         let toState: PaymentState;
@@ -288,6 +290,7 @@ export class PaymentService {
                 order,
                 paymentToRefund,
                 paymentMethod.handler.args,
+                paymentMethod,
             );
             if (createRefundResult) {
                 refund.transactionId = createRefundResult.transactionId || '';