UNPKG

@unchainedshop/plugins

Version:

Official plugin collection for the Unchained Engine with payment, delivery, and pricing adapters

49 lines (48 loc) 2.22 kB
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' }, }); } }