Browse Source

feat(payments-plugin): Deprecate orderId when generating Braintree token

Relates to #1517. The `orderId` input argument is no longer needed when executing the
`generateBraintreeClientToken` query. If you pass the orderId, a warning will be logged
but otherwise things will keep working. The passed `orderId` is in any case ignored, and the
orderId is taken from the active Session.
Michael Bromley 3 years ago
parent
commit
8ba76f2eb5

+ 5 - 5
packages/payments-plugin/src/braintree/braintree.plugin.ts

@@ -128,12 +128,12 @@ import { BraintreePluginOptions } from './types';
  *   });
  * }
  *
- * async function generateClientToken(orderId: string) {
+ * async function generateClientToken() {
  *   const { generateBraintreeClientToken } = await graphQlClient.query(gql`
- *     query GenerateBraintreeClientToken($orderId: ID!) {
- *       generateBraintreeClientToken(orderId: $orderId)
+ *     query GenerateBraintreeClientToken {
+ *       generateBraintreeClientToken
  *     }
- *   `, { orderId });
+ *   `);
  *   return generateBraintreeClientToken;
  * }
  *
@@ -215,7 +215,7 @@ import { BraintreePluginOptions } from './types';
     shopApiExtensions: {
         schema: gql`
             extend type Query {
-                generateBraintreeClientToken(orderId: ID!): String!
+                generateBraintreeClientToken(orderId: ID): String!
             }
         `,
         resolvers: [BraintreeResolver],

+ 15 - 2
packages/payments-plugin/src/braintree/braintree.resolver.ts

@@ -1,6 +1,7 @@
 import { Inject } from '@nestjs/common';
 import { Args, Query, Resolver } from '@nestjs/graphql';
 import {
+    ActiveOrderService,
     Ctx,
     ID,
     InternalServerError,
@@ -21,12 +22,24 @@ export class BraintreeResolver {
     constructor(
         private connection: TransactionalConnection,
         private orderService: OrderService,
+        private activeOrderService: ActiveOrderService,
         @Inject(BRAINTREE_PLUGIN_OPTIONS) private options: BraintreePluginOptions,
     ) {}
 
     @Query()
-    async generateBraintreeClientToken(@Ctx() ctx: RequestContext, @Args() { orderId }: { orderId: ID }) {
-        const order = await this.orderService.findOne(ctx, orderId);
+    async generateBraintreeClientToken(@Ctx() ctx: RequestContext, @Args() { orderId }: { orderId?: ID }) {
+        if (orderId) {
+            Logger.warn(
+                `The orderId argument to the generateBraintreeClientToken mutation has been deprecated and may be omitted.`,
+            );
+        }
+        const sessionOrder = await this.activeOrderService.getOrderFromContext(ctx);
+        if (!sessionOrder) {
+            throw new InternalServerError(
+                `Cannot generate Braintree clientToken as there is no active Order.`,
+            );
+        }
+        const order = await this.orderService.findOne(ctx, sessionOrder.id);
         if (order && order.customer) {
             const customerId = order.customer.customFields.braintreeCustomerId ?? undefined;
             const args = await this.getPaymentMethodArgs(ctx);