@unchainedshop/plugins
Version:
Official plugin collection for the Unchained Engine with payment, delivery, and pricing adapters
41 lines (40 loc) • 1.91 kB
JavaScript
import { createLogger } from '@unchainedshop/logger';
import { getTransaction, getTransactionCompletion } from "./api.js";
const logger = createLogger('unchained:postfinance-checkout:handler');
export const postfinanceCheckoutHandler = async (req, reply) => {
const context = req.unchainedContext;
const { services, modules } = context;
const data = req.body;
if (data.listenerEntityTechnicalName === 'TransactionCompletion') {
try {
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: transaction.id,
},
});
if (!order)
throw new Error(`Order with id ${orderPayment.orderId} not found`);
logger.info(`Transaction ${transaction.id} marked order payment ID ${transaction.metaData?.orderPaymentId} as paid`);
reply.status(200);
return reply.send({ success: true, orderNumber: order.orderNumber });
}
catch (e) {
logger.error(e);
reply.status(500);
return reply.send({ success: false, name: e.name, code: e.code, message: e.message });
}
}
else {
logger.error(`Received unknown listenerEntityTechnicalName ${data.listenerEntityTechnicalName}`);
reply.status(404);
return reply.send();
}
};