saleor-apps-redis_apl/apps/taxes/src/pages/api/webhooks/checkout-calculate-taxes.ts
Adrian Pilarczyk d55b2f9b2a
fix/333 taxes not calculated (#345)
* refactor: 🔊 improve logging in taxes

* refactor: 🔥 redundant channels call

* refactor: ♻️ get app config from payload

* build: add changeset

* refactor: 🔊 routers info -> debug

* refactor: 🔊 redact logs
2023-03-30 13:12:52 +02:00

73 lines
2.5 KiB
TypeScript

import { SaleorSyncWebhook } from "@saleor/app-sdk/handlers/next";
import { UntypedCalculateTaxesDocument } from "../../../../generated/graphql";
import { saleorApp } from "../../../../saleor-app";
import { createLogger } from "../../../lib/logger";
import { calculateTaxesPayloadSchema, ExpectedWebhookPayload } from "../../../lib/saleor/schema";
import { getAppConfig } from "../../../modules/app-configuration/get-app-config";
import { ActiveTaxProvider } from "../../../modules/taxes/active-tax-provider";
export const config = {
api: {
bodyParser: false,
},
};
export const checkoutCalculateTaxesSyncWebhook = new SaleorSyncWebhook<ExpectedWebhookPayload>({
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({ event: ctx.event });
const { payload } = ctx;
logger.info({ payload }, "Handler called with payload");
const validation = calculateTaxesPayloadSchema.safeParse(payload);
if (!validation.success) {
logger.error({ error: validation.error.format() }, "Payload is invalid");
logger.info("Returning no data");
return res.send({});
}
const { data } = validation;
logger.info("Payload validated succesfully");
const { providers, channels } = getAppConfig(data);
logger.debug("Successfully parsed providers & channels from payload");
try {
const channelSlug = data.taxBase.channel.slug;
const channelConfig = channels[channelSlug];
if (!channelConfig) {
logger.error(`Channel config not found for channel ${channelSlug}`);
logger.info("Returning no data");
return res.send({});
}
const providerInstance = providers.find(
(instance) => instance.id === channelConfig.providerInstanceId
);
if (!providerInstance) {
logger.error(`Channel (${channelSlug}) providerInstanceId does not match any providers`);
logger.info("Returning no data");
return res.send({});
}
const taxProvider = new ActiveTaxProvider(providerInstance);
const calculatedTaxes = await taxProvider.calculate(data.taxBase, channelConfig);
logger.info({ calculatedTaxes }, "Taxes calculated");
return res.send(ctx.buildResponse(calculatedTaxes));
} catch (error) {
logger.error({ error }, "Error while calculating taxes");
logger.info("Returning no data");
return res.send({});
}
});