diff --git a/apps/taxes/src/modules/app/order-metadata-manager.ts b/apps/taxes/src/modules/app/order-metadata-manager.ts new file mode 100644 index 0000000..7c579bc --- /dev/null +++ b/apps/taxes/src/modules/app/order-metadata-manager.ts @@ -0,0 +1,38 @@ +import { + UpdateMetadataDocument, + UpdateMetadataMutation, + UpdateMetadataMutationVariables, +} from "../../../generated/graphql"; +import { Client } from "urql"; +import { PROVIDER_ORDER_ID_KEY } from "../avatax/order-fulfilled/avatax-order-fulfilled-payload-transformer"; + +export class OrderMetadataManager { + private privateOrderIdKey = PROVIDER_ORDER_ID_KEY; + + constructor(private client: Client) {} + + /** + * We need to store the provider order id in the Saleor order metadata so that we can + * update the provider order when the Saleor order is fulfilled. + */ + async updateOrderMetadataWithExternalId(orderId: string, externalId: string) { + const variables: UpdateMetadataMutationVariables = { + id: orderId, + input: [ + { + key: this.privateOrderIdKey, + value: externalId, + }, + ], + }; + const { error } = await this.client + .mutation(UpdateMetadataDocument, variables) + .toPromise(); + + if (error) { + throw error; + } + + return { ok: true }; + } +} diff --git a/apps/taxes/src/pages/api/webhooks/order-created.ts b/apps/taxes/src/pages/api/webhooks/order-created.ts index 76e12c2..c4ef09e 100644 --- a/apps/taxes/src/pages/api/webhooks/order-created.ts +++ b/apps/taxes/src/pages/api/webhooks/order-created.ts @@ -3,17 +3,13 @@ import { OrderCreatedEventSubscriptionFragment, OrderStatus, UntypedOrderCreatedSubscriptionDocument, - UpdateMetadataDocument, - UpdateMetadataMutation, - UpdateMetadataMutationVariables, } from "../../../../generated/graphql"; import { saleorApp } from "../../../../saleor-app"; import { createLogger } from "../../../lib/logger"; import { getActiveConnectionService } from "../../../modules/taxes/get-active-connection-service"; -import { Client } from "urql"; import { WebhookResponse } from "../../../modules/app/webhook-response"; -import { PROVIDER_ORDER_ID_KEY } from "../../../modules/avatax/order-fulfilled/avatax-order-fulfilled-payload-transformer"; import { createGraphQLClient } from "@saleor/apps-shared"; +import { OrderMetadataManager } from "../../../modules/app/order-metadata-manager"; export const config = { api: { @@ -34,35 +30,6 @@ export const orderCreatedAsyncWebhook = new SaleorAsyncWebhook(UpdateMetadataDocument, variables) - .toPromise(); - - if (error) { - throw error; - } - - return { ok: true }; -} - export default orderCreatedAsyncWebhook.createHandler(async (req, res, ctx) => { const logger = createLogger({ event: ctx.event }); const { payload, authData } = ctx; @@ -95,7 +62,9 @@ export default orderCreatedAsyncWebhook.createHandler(async (req, res, ctx) => { token, }); - await updateOrderMetadataWithExternalId(client, payload.order.id, createdOrder.id); + const orderMetadataManager = new OrderMetadataManager(client); + + await orderMetadataManager.updateOrderMetadataWithExternalId(payload.order.id, createdOrder.id); logger.info("Updated order metadata with externalId"); return webhookResponse.success();