2023-03-07 10:31:44 +00:00
|
|
|
import { SaleorSyncWebhook } from "@saleor/app-sdk/handlers/next";
|
2023-03-02 11:01:17 +00:00
|
|
|
import { UntypedCalculateTaxesDocument } from "../../../../generated/graphql";
|
|
|
|
import { saleorApp } from "../../../../saleor-app";
|
2023-03-07 10:31:44 +00:00
|
|
|
import { createClient } from "../../../lib/graphql";
|
2023-03-02 11:01:17 +00:00
|
|
|
import { createLogger } from "../../../lib/logger";
|
2023-03-07 10:31:44 +00:00
|
|
|
import { calculateTaxesPayloadSchema, ExpectedWebhookPayload } from "../../../lib/saleor/schema";
|
|
|
|
import { GetChannelsConfigurationService } from "../../../modules/channels-configuration/get-channels-configuration.service";
|
2023-03-13 09:57:18 +00:00
|
|
|
import { PrivateTaxProvidersConfigurationService } from "../../../modules/providers-configuration/private-providers-configuration-service";
|
|
|
|
|
2023-03-02 11:01:17 +00:00
|
|
|
import { ActiveTaxProvider } from "../../../modules/taxes/active-tax-provider";
|
|
|
|
|
2023-03-07 10:31:44 +00:00
|
|
|
export const config = {
|
|
|
|
api: {
|
|
|
|
bodyParser: false,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
export const checkoutCalculateTaxesSyncWebhook = new SaleorSyncWebhook<ExpectedWebhookPayload>({
|
2023-03-02 11:01:17 +00:00
|
|
|
name: "CheckoutCalculateTaxes",
|
|
|
|
apl: saleorApp.apl,
|
2023-03-07 10:31:44 +00:00
|
|
|
event: "CHECKOUT_CALCULATE_TAXES",
|
|
|
|
query: UntypedCalculateTaxesDocument,
|
2023-03-02 11:01:17 +00:00
|
|
|
webhookPath: "/api/webhooks/checkout-calculate-taxes",
|
|
|
|
});
|
|
|
|
|
2023-03-07 10:31:44 +00:00
|
|
|
export default checkoutCalculateTaxesSyncWebhook.createHandler(async (req, res, ctx) => {
|
|
|
|
const logger = createLogger({ event: ctx.event });
|
|
|
|
const { authData, payload } = ctx;
|
|
|
|
logger.info({ payload }, "Handler called with payload");
|
2023-03-02 11:01:17 +00:00
|
|
|
|
2023-03-07 10:31:44 +00:00
|
|
|
const validation = calculateTaxesPayloadSchema.safeParse(payload);
|
|
|
|
|
|
|
|
if (!validation.success) {
|
2023-03-10 12:04:25 +00:00
|
|
|
logger.error({ error: validation.error.format() }, "Payload is invalid");
|
2023-03-07 10:31:44 +00:00
|
|
|
logger.info("Returning no data");
|
|
|
|
return res.send({});
|
|
|
|
}
|
|
|
|
|
|
|
|
const { data } = validation;
|
|
|
|
logger.info({ data }, "Payload is valid.");
|
|
|
|
|
|
|
|
try {
|
|
|
|
const client = createClient(authData.saleorApiUrl, async () =>
|
|
|
|
Promise.resolve({ token: authData.token })
|
|
|
|
);
|
|
|
|
|
2023-03-13 09:57:18 +00:00
|
|
|
const providersConfig = await new PrivateTaxProvidersConfigurationService(
|
2023-03-10 12:04:25 +00:00
|
|
|
client,
|
|
|
|
authData.saleorApiUrl
|
|
|
|
).getAll();
|
2023-03-02 11:01:17 +00:00
|
|
|
|
2023-03-07 10:31:44 +00:00
|
|
|
const channelsConfig = await new GetChannelsConfigurationService({
|
|
|
|
saleorApiUrl: authData.saleorApiUrl,
|
|
|
|
apiClient: client,
|
|
|
|
}).getConfiguration();
|
|
|
|
|
|
|
|
logger.info({ providersConfig }, "Providers configuration returned");
|
|
|
|
|
|
|
|
const channelSlug = payload.taxBase.channel.slug;
|
|
|
|
const channelConfig = channelsConfig[channelSlug];
|
|
|
|
|
|
|
|
if (!channelConfig) {
|
|
|
|
logger.error(`Channel config not found for channel ${channelSlug}`);
|
|
|
|
logger.info("Returning no data");
|
|
|
|
return res.send({});
|
|
|
|
}
|
|
|
|
|
|
|
|
const providerInstance = providersConfig.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({});
|
|
|
|
}
|
|
|
|
});
|