refactor: ♻️ extract order-metadata-manager

This commit is contained in:
Adrian Pilarczyk 2023-07-27 17:10:38 +02:00
parent 8e33f59e0c
commit 1a41ca7684
2 changed files with 42 additions and 35 deletions

View file

@ -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<UpdateMetadataMutation>(UpdateMetadataDocument, variables)
.toPromise();
if (error) {
throw error;
}
return { ok: true };
}
}

View file

@ -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<OrderCreatedPaylo
webhookPath: "/api/webhooks/order-created",
});
/**
* 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 function updateOrderMetadataWithExternalId(
client: Client,
orderId: string,
externalId: string
) {
const variables: UpdateMetadataMutationVariables = {
id: orderId,
input: [
{
key: PROVIDER_ORDER_ID_KEY,
value: externalId,
},
],
};
const { error } = await client
.mutation<UpdateMetadataMutation>(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();