saleor-apps-redis_apl/apps/taxes/src/pages/api/webhooks/checkout-calculate-taxes.ts
Adrian Pilarczyk 45ed9fb444
fix checkout calculate taxes (#919)
* fix: 🐛 value of customerCode in calculateTaxes

* build: 👷 add changeset

* fix: 🐛 tests
2023-08-25 11:19:53 +02:00

69 lines
2.2 KiB
TypeScript

import { SaleorSyncWebhook } from "@saleor/app-sdk/handlers/next";
import {
CalculateTaxesEventFragment,
UntypedCalculateTaxesDocument,
} from "../../../../generated/graphql";
import { saleorApp } from "../../../../saleor-app";
import { createLogger } from "../../../lib/logger";
import { WebhookResponse } from "../../../modules/app/webhook-response";
import { getActiveConnectionService } from "../../../modules/taxes/get-active-connection-service";
export const config = {
api: {
bodyParser: false,
},
};
export type CalculateTaxesPayload = Extract<
CalculateTaxesEventFragment,
{ __typename: "CalculateTaxes" }
>;
function verifyCalculateTaxesPayload(payload: CalculateTaxesPayload) {
if (!payload.taxBase.lines) {
throw new Error("No lines found in taxBase");
}
if (!payload.taxBase.address) {
throw new Error("No address found in taxBase");
}
return payload;
}
export const checkoutCalculateTaxesSyncWebhook = new SaleorSyncWebhook<CalculateTaxesPayload>({
name: "CheckoutCalculateTaxes",
apl: saleorApp.apl,
event: "CHECKOUT_CALCULATE_TAXES",
query: UntypedCalculateTaxesDocument,
webhookPath: "/api/webhooks/checkout-calculate-taxes",
});
export default checkoutCalculateTaxesSyncWebhook.createHandler(async (req, res, ctx) => {
const logger = createLogger({ name: "checkoutCalculateTaxesSyncWebhook" });
const { payload } = ctx;
const webhookResponse = new WebhookResponse(res);
logger.info("Handler for CHECKOUT_CALCULATE_TAXES webhook called");
try {
verifyCalculateTaxesPayload(payload);
logger.debug("Payload validated succesfully");
const appMetadata = payload.recipient?.privateMetadata ?? [];
const channelSlug = payload.taxBase.channel.slug;
const activeConnectionService = getActiveConnectionService(
channelSlug,
appMetadata,
ctx.authData,
);
logger.info("Found active connection service. Calculating taxes...");
const calculatedTaxes = await activeConnectionService.calculateTaxes(payload);
logger.info({ calculatedTaxes }, "Taxes calculated");
return webhookResponse.success(ctx.buildResponse(calculatedTaxes));
} catch (error) {
return webhookResponse.error(error);
}
});