@unchainedshop/plugins
Version:
Official plugin collection for the Unchained Engine with payment, delivery, and pricing adapters
49 lines (48 loc) • 2.22 kB
JavaScript
import { createLogger } from '@unchainedshop/logger';
import { getTransaction, getTransactionCompletion } from "./api.js";
const logger = createLogger('unchained:postfinance-checkout');
export async function postfinanceCheckoutWebhookHandler(request, context) {
try {
const { services, modules } = context;
const data = (await request.json());
if (data.listenerEntityTechnicalName === 'TransactionCompletion') {
const transactionCompletion = await getTransactionCompletion(data.entityId);
const transaction = await getTransaction(transactionCompletion ? transactionCompletion.linkedTransaction : data.entityId);
const { orderPaymentId } = transaction.metaData;
const orderPayment = await modules.orders.payments.findOrderPayment({
orderPaymentId,
});
if (!orderPayment) {
throw new Error('Order Payment not found');
}
const order = await services.orders.checkoutOrder(orderPayment.orderId, {
paymentContext: {
transactionId: transactionCompletion.linkedTransaction,
},
});
if (!order) {
throw new Error(`Order with id ${orderPayment.orderId} not found`);
}
logger.info(`Transaction ${transactionCompletion.linkedTransaction} marked order payment ID ${transaction.metaData?.orderPaymentId} as paid`);
return new Response(JSON.stringify({ orderNumber: order.orderNumber }), {
status: 200,
headers: { 'Content-Type': 'application/json' },
});
}
else {
logger.error(`Received unknown listenerEntityTechnicalName ${data.listenerEntityTechnicalName}`);
return new Response(null, { status: 404 });
}
}
catch (error) {
logger.error('Postfinance Checkout webhook error:', error);
return new Response(JSON.stringify({
name: error.name,
code: error.code,
message: error.message,
}), {
status: 500,
headers: { 'Content-Type': 'application/json' },
});
}
}