lightrail-stripe
Version:
A Javascript and Typescript library for creating Lightrail-Stripe integrated applications.
132 lines (131 loc) • 6.81 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const lightrail = require("lightrail-client");
function simulateSplitTenderCharge(params, lightrailShare) {
return __awaiter(this, void 0, void 0, function* () {
if (!params) {
throw new Error("params not set");
}
else if (!params.userSuppliedId) {
throw new Error("params.userSuppliedId not set");
}
let splitTenderSimulation = {
lightrailTransaction: null,
stripeCharge: null
};
if (lightrailShare > 0) {
const contact = yield lightrail.contacts.getContactByUserSuppliedId(params.shopperId);
const card = yield lightrail.cards.getAccountCardByContactAndCurrency(contact, params.currency);
if (!card) {
throw new Error(`No ${params.currency} card found for shopperId '${params.shopperId}'.`);
}
let lightrailTransactionParameters = {
value: 0 - lightrailShare,
currency: params.currency,
userSuppliedId: params.userSuppliedId,
nsf: params.nsf,
};
lightrailTransactionParameters.metadata = appendSplitTenderMetadataForLightrail(params, null);
const lightrailSimulatedTransaction = yield lightrail.cards.transactions.simulateTransaction(card, lightrailTransactionParameters);
splitTenderSimulation.lightrailTransaction = lightrailSimulatedTransaction;
}
return splitTenderSimulation;
});
}
exports.simulateSplitTenderCharge = simulateSplitTenderCharge;
function createSplitTenderCharge(params, lightrailShare, stripeParam) {
return __awaiter(this, void 0, void 0, function* () {
if (!params) {
throw new Error("params not set");
}
else if (!params.userSuppliedId) {
throw new Error("params.userSuppliedId not set");
}
const stripeObject = getStripeObject(stripeParam);
let splitTenderCharge = {
lightrailTransaction: null,
stripeCharge: null
};
const stripeShare = params.amount - lightrailShare;
if (lightrailShare > 0) {
const contact = yield lightrail.contacts.getContactByUserSuppliedId(params.shopperId);
const card = yield lightrail.cards.getAccountCardByContactAndCurrency(contact, params.currency);
if (!card) {
throw new Error(`No ${params.currency} card found for shopperId '${params.shopperId}'.`);
}
let lightrailTransactionParameters = {
value: 0 - lightrailShare,
currency: params.currency,
pending: (stripeShare > 0),
userSuppliedId: params.userSuppliedId,
};
lightrailTransactionParameters.metadata = appendSplitTenderMetadataForLightrail(params, null);
const lightrailPendingTransaction = yield lightrail.cards.transactions.createTransaction(card, lightrailTransactionParameters);
splitTenderCharge.lightrailTransaction = lightrailPendingTransaction;
if (stripeShare) {
try {
let stripeParameters = splitTenderParamsToStripeParams(params, stripeShare, lightrailPendingTransaction);
splitTenderCharge.stripeCharge = yield stripeObject.charges.create(stripeParameters, { idempotency_key: params.userSuppliedId });
splitTenderCharge.lightrailTransaction = yield lightrail.cards.transactions.capturePending(card, lightrailPendingTransaction, {
userSuppliedId: params.userSuppliedId + "-capture",
metadata: appendSplitTenderMetadataForLightrail(params, splitTenderCharge.stripeCharge),
});
}
catch (error) {
splitTenderCharge.lightrailTransaction = yield lightrail.cards.transactions.voidPending(card, lightrailPendingTransaction, {
userSuppliedId: params.userSuppliedId + "-void",
metadata: appendSplitTenderMetadataForLightrail(params, splitTenderCharge.stripeCharge),
});
}
}
}
else {
let stripeParameters = splitTenderParamsToStripeParams(params, stripeShare, null);
splitTenderCharge.stripeCharge = yield stripeObject.charges.create(stripeParameters, { idempotency_key: params.userSuppliedId });
}
return splitTenderCharge;
});
}
exports.createSplitTenderCharge = createSplitTenderCharge;
// Helpers
function splitTenderParamsToStripeParams(splitTenderParams, stripeAmount, lightrailTransaction) {
let paramsForStripe = Object.assign({}, splitTenderParams, { metadata: splitTenderParams.metadata || {}, shopperId: undefined, userSuppliedId: undefined });
paramsForStripe.metadata._split_tender_total = paramsForStripe.amount;
paramsForStripe.metadata._split_tender_partner = "LIGHTRAIL";
paramsForStripe.metadata._split_tender_partner_transaction_id = "";
if (lightrailTransaction && lightrailTransaction.transactionId) {
paramsForStripe.metadata._split_tender_partner_transaction_id = lightrailTransaction.transactionId;
}
paramsForStripe.amount = stripeAmount;
return paramsForStripe;
}
function appendSplitTenderMetadataForLightrail(splitTenderParams, stripeTransaction) {
if (!splitTenderParams.metadata) {
splitTenderParams.metadata = {};
}
splitTenderParams.metadata._split_tender_total = splitTenderParams.amount;
splitTenderParams.metadata._split_tender_partner = "STRIPE";
if (stripeTransaction) {
splitTenderParams.metadata._split_tender_partner_transaction_id = stripeTransaction.id;
}
return splitTenderParams.metadata;
}
function getStripeObject(stripeParam) {
if (!stripeParam) {
throw new Error("stripeParam not set");
}
else if (typeof stripeParam === "object") {
return stripeParam;
}
else if (typeof stripeParam === "string") {
return require("stripe")(stripeParam);
}
}