UNPKG

medusa-payment-upnance

Version:

Upnance Medusa payment plugin

213 lines 17.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpnanceProvider = void 0; const utils_1 = require("@medusajs/framework/utils"); const bignumber_js_1 = __importDefault(require("bignumber.js")); const upnance_1 = require("../__generated__/upnance"); const model_1 = require("../model"); class UpnanceProvider extends utils_1.AbstractPaymentProvider { static validateOptions(options) { if (!options.apiKey) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "API key is required in the provider's options."); } if (!options.accountId) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Account id is required in the provider's options."); } if (!options.environment) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Environment is required in the provider's options."); } } constructor(container, options) { super(container, options); const basePath = new URL("", options.environment === "production" ? model_1.API_PRODUCTION_URL : model_1.API_STAGING_URL).href + "/"; this.upnanceClient = new upnance_1.UpnanceApi(new upnance_1.Configuration({ apiKey: options.apiKey, basePath, })); this.options = options; } async getPaymentStatus(args) { const { id } = args.data; const { data: transaction } = await this.upnanceClient.checkoutControllerFind({ id }); switch (transaction.status) { case upnance_1.PayInStatus.SUCCESS: return { status: utils_1.PaymentSessionStatus.CAPTURED }; case upnance_1.PayInStatus.AUTHORIZED: return { status: utils_1.PaymentSessionStatus.AUTHORIZED }; case upnance_1.PayInStatus.CREATED: return { status: utils_1.PaymentSessionStatus.PENDING }; case upnance_1.PayInStatus.FAILURE: return { status: utils_1.PaymentSessionStatus.ERROR }; case upnance_1.PayInStatus.CANCELLED: return { status: utils_1.PaymentSessionStatus.CANCELED }; default: return { status: utils_1.PaymentSessionStatus.PENDING }; } } async initiatePayment(args) { try { const currency = args.currency_code.toUpperCase(); const { data: payment } = await this.upnanceClient.paymentControllerCreate({ payInCardCreateControllerArgs: { accountId: this.options.accountId, acquirer: upnance_1.Acquirer.CLEARHAUS, gateway: upnance_1.Gateway.QUICKPAY, currency, value: new bignumber_js_1.default(args.amount.toString()) .multipliedBy(100) .toString(), invoiceAddress: this.newAddress(args.context?.customer?.billing_address ?? undefined), }, }); await this.upnanceClient.paymentControllerLink({ id: payment.id, payInCardLinkControllerArgs: { charge: this.options.autoCapture }, }); return { data: { ...payment, }, id: payment.id, }; } catch (error) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while initiating payment"); } } async authorizePayment(args) { try { const data = args.data; const { status } = await this.getPaymentStatus({ data }); return { status, data }; } catch (error) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while authorizing payment"); } } async capturePayment(args) { try { const data = args.data; const { status } = await this.getPaymentStatus({ data }); if (status === utils_1.PaymentSessionStatus.CAPTURED) { return { data: await this.retrievePayment({ data }), }; } const { data: paymentCharge } = await this.upnanceClient.paymentControllerCharge({ id: data.id, }); return { data: { ...paymentCharge, }, }; } catch (error) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while capturing payment"); } } async refundPayment(args) { try { const { value } = args.amount; const data = args.data; const { data: refund } = await this.upnanceClient.paymentControllerRefund({ id: data.id, payInCardRefundControllerArgs: { value: new bignumber_js_1.default(value).multipliedBy(100).toString(), }, }); return { data: { ...refund, }, }; } catch (error) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while refunding payment"); } } async cancelPayment(args) { return { data: args.data }; } async retrievePayment(args) { try { const data = args.data; const { data: transaction } = await this.upnanceClient.checkoutControllerFind({ id: data.id, }); return { data: { ...transaction, }, }; } catch (error) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while retrieving payment"); } } async updatePayment(args) { return { data: args.data }; } async deletePayment(args) { return { data: args.data }; } async getWebhookActionAndData(args) { if (!(0, model_1.isChecksumValid)(args.data, String(args.headers[model_1.WEBHOOK_HEADER_CHECKSUM_NAME]), this.options.apiKeySecret)) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Invalid checksum"); } const data = args.data; try { return { action: this.newPaymentAction(data.status), }; } catch (error) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while processing the webhook"); } } newAddress(address) { if (!address?.address_1 || !address?.city || !address?.province || !address?.postal_code || !address?.country_code) { return undefined; } const country = address.country_code.toUpperCase(); if (!Object.values(upnance_1.Country).includes(country)) { return undefined; } return { addressLine1: address.address_1, addressLine2: address.address_2 ?? undefined, city: address.city, stateOrCounty: address.province, postalCode: address.postal_code, country, }; } newPaymentAction(status) { switch (status) { case upnance_1.PayInStatus.SUCCESS: return utils_1.PaymentActions.SUCCESSFUL; case upnance_1.PayInStatus.AUTHORIZED: return utils_1.PaymentActions.AUTHORIZED; case upnance_1.PayInStatus.CREATED: return utils_1.PaymentActions.PENDING; case upnance_1.PayInStatus.FAILURE: return utils_1.PaymentActions.FAILED; case upnance_1.PayInStatus.CANCELLED: return utils_1.PaymentActions.CANCELED; default: return utils_1.PaymentActions.PENDING; } } } exports.UpnanceProvider = UpnanceProvider; UpnanceProvider.identifier = model_1.UPNANCE_IDENTIFIER; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBuYW5jZS1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdXBuYW5jZS9zZXJ2aWNlcy91cG5hbmNlLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQXdCQSxxREFLbUM7QUFDbkMsZ0VBQXFDO0FBQ3JDLHNEQVNrQztBQUNsQyxvQ0FRa0I7QUFTbEIsTUFBYSxlQUFnQixTQUFRLCtCQUF1QztJQUcxRSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQXVCO1FBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsZ0RBQWdELENBQ2pELENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixtREFBbUQsQ0FDcEQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG9EQUFvRCxDQUNyRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFLRCxZQUFZLFNBQWMsRUFBRSxPQUF1QjtRQUNqRCxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTFCLE1BQU0sUUFBUSxHQUNaLElBQUksR0FBRyxDQUNMLEVBQUUsRUFDRixPQUFPLENBQUMsV0FBVyxLQUFLLFlBQVk7WUFDbEMsQ0FBQyxDQUFDLDBCQUFrQjtZQUNwQixDQUFDLENBQUMsdUJBQWUsQ0FDcEIsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBRWYsSUFB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