454 lines
16 KiB
JavaScript
454 lines
16 KiB
JavaScript
const Stripe = require("stripe");
|
|
const { stripeAPIKey, stripeWebhooksKey } = require("../firebase/secrets.js");
|
|
const {
|
|
handlePaymentFailure,
|
|
handleSubscriptionDeletion,
|
|
} = require("./stripe.js");
|
|
const stripe = Stripe(stripeAPIKey);
|
|
|
|
// Secret for Stripe webhooks
|
|
const endpointSecret = stripeWebhooksKey;
|
|
|
|
class StripeController {
|
|
async createNewSubscription(
|
|
planType,
|
|
additionalAccounts,
|
|
isAnnual,
|
|
customerData,
|
|
token
|
|
) {
|
|
const tokenId = token.id;
|
|
let priceId;
|
|
let addId;
|
|
let items;
|
|
|
|
if (process.env.NODE_ENV === "development") {
|
|
if (planType === "associate" && isAnnual === false) {
|
|
// NEED TO MAKE DEV MODE PRODUCT IN STRIPE DASH
|
|
} else if (planType === "associate" && isAnnual === true) {
|
|
// NEED TO MAKE DEV MODE PRODUCT IN STRIPE DASH
|
|
} else if (planType === "partner" && isAnnual === false) {
|
|
priceId = "price_1PJPX6Bi8p7FeGFrBu7BQVkn";
|
|
} else if (planType === "partner" && isAnnual === true) {
|
|
priceId = "price_1PKqV9Bi8p7FeGFrNzATmnyf";
|
|
} else if (planType === "seniorPartner" && isAnnual === false) {
|
|
// NEED TO MAKE DEV MODE PRODUCT IN STRIPE DASH
|
|
} else if (planType === "seniorPartner" && isAnnual === true) {
|
|
// NEED TO MAKE DEV MODE PRODUCT IN STRIPE DASH
|
|
}
|
|
} else {
|
|
if (planType === "associate" && isAnnual === false) {
|
|
priceId = "price_1P7PdTBi8p7FeGFrmzmQ8zlX";
|
|
} else if (planType === "associate" && isAnnual === true) {
|
|
priceId = "price_1PJQ9FBi8p7FeGFrAINvdMHz";
|
|
} else if (planType === "partner" && isAnnual === false) {
|
|
priceId = "price_1P7PnpBi8p7FeGFrZOPRgDtL";
|
|
} else if (planType === "partner" && isAnnual === true) {
|
|
priceId = "price_1PKqWwBi8p7FeGFrqHBrAdPU";
|
|
} else if (planType === "seniorPartner" && isAnnual === false) {
|
|
priceId = "price_1P7PuoBi8p7FeGFrT3JlZMGp";
|
|
} else if (planType === "seniorPartner" && isAnnual === true) {
|
|
priceId = "price_1P7PvbBi8p7FeGFrce1HVyT4";
|
|
}
|
|
}
|
|
|
|
items = [{ price: priceId }];
|
|
// might need tyo change this to reflect development/[rpduction mode, as above]
|
|
if (planType === "partner" && isAnnual === false) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1OdIcqBi8p7FeGFrcKhFGudX";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1OdIvYBi8p7FeGFrLhvk1mwo";
|
|
items.push({ price: addId });
|
|
}
|
|
} else if (planType === "partner" && isAnnual === true) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1OdIunBi8p7FeGFrOJjULnA0";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1OdJ0pBi8p7FeGFrFrrXjfwA";
|
|
items.push({ price: addId });
|
|
}
|
|
}
|
|
|
|
items = [{ price: priceId }];
|
|
|
|
if (planType === "seniorPartner" && isAnnual === false) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1OdJ1XBi8p7FeGFrZVHDlSGH";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1OdJ3vBi8p7FeGFr47ZbQQN6";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 3) {
|
|
addId = "price_1OdJ50Bi8p7FeGFrFB8wTpZu";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 4) {
|
|
addId = "price_1OdJ6uBi8p7FeGFrdUhzYaGC";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 5) {
|
|
addId = "price_1OdJ88Bi8p7FeGFrSwpR5r4Z";
|
|
items.push({ price: addId });
|
|
}
|
|
}
|
|
|
|
if (planType === "seniorPartner" && isAnnual === true) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1OdJ3EBi8p7FeGFr6371XcAi";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1OdJ4PBi8p7FeGFrgW7aKHwZ";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 3) {
|
|
addId = "price_1OdJ6IBi8p7FeGFrItKkXCeM";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 4) {
|
|
addId = "price_1OdJ7YBi8p7FeGFrCC6AulEY";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 5) {
|
|
addId = "price_1OdJ8lBi8p7FeGFr6d8z3afK";
|
|
items.push({ price: addId });
|
|
}
|
|
}
|
|
|
|
try {
|
|
// create new customer object
|
|
const customer = await stripe.customers.create({
|
|
...customerData,
|
|
source: tokenId,
|
|
});
|
|
|
|
// Create the subscription
|
|
const subscription = await stripe.subscriptions.create({
|
|
customer: customer.id,
|
|
items: items,
|
|
expand: ["latest_invoice.payment_intent"],
|
|
});
|
|
|
|
const obj = { subscription, customer: { customerId: customer.id } };
|
|
return obj;
|
|
} catch (error) {
|
|
console.log("StripeController error in createNewSubscription", error);
|
|
}
|
|
}
|
|
|
|
async createNewPaymentIntent(customerData, token, userAgent) {
|
|
const tokenId = token.id;
|
|
try {
|
|
const customer = await stripe.customers.create({
|
|
...customerData,
|
|
source: tokenId,
|
|
});
|
|
|
|
const paymentIntent = await stripe.paymentIntents.create({
|
|
confirm: true,
|
|
customer: customer.id,
|
|
automatic_payment_methods: { enabled: true },
|
|
payment_method: token.card.id,
|
|
mandate_data: {
|
|
customer_acceptance: {
|
|
type: "online",
|
|
online: {
|
|
ip_address: token.client_ip,
|
|
user_agent: userAgent,
|
|
},
|
|
},
|
|
},
|
|
return_url: "https://www.novodraft.ai/dashboard",
|
|
currency: "usd",
|
|
amount: 59 * 100,
|
|
});
|
|
|
|
const obj = { paymentIntent, customer: { customerId: customer.id } };
|
|
return obj;
|
|
} catch (error) {
|
|
console.log("StripeController error in createNewPaymentIntent", error);
|
|
return error;
|
|
}
|
|
}
|
|
|
|
async cancelSubscription(appUserId) {
|
|
const usersRef = collection(db, "users");
|
|
const q = query(usersRef, where("appUserId", "==", appUserId));
|
|
const querySnapshot = await getDocs(q);
|
|
|
|
if (querySnapshot.empty) {
|
|
console.log("No user found with the email:", appUserId);
|
|
return;
|
|
}
|
|
const userDoc = querySnapshot.docs[0];
|
|
|
|
//get the user's subscription ID and customer ID
|
|
const subscriptionId = userDoc.data().subscriptionId;
|
|
|
|
const deletedSubscription = await stripe.subscriptions.update(
|
|
subscriptionId,
|
|
{
|
|
cancel_at_period_end: true,
|
|
}
|
|
);
|
|
return deletedSubscription;
|
|
}
|
|
|
|
async stripeWebhook(type, subscription) {
|
|
switch (type) {
|
|
case "customer.subscription.deleted":
|
|
const subscription = request.body.data.object;
|
|
|
|
//get stripe customer
|
|
const stripeCustomer = await stripe.customers.retrieve(
|
|
subscription.customer
|
|
);
|
|
|
|
await handleSubscriptionDeletion(stripeCustomer, subscription, stripe);
|
|
break;
|
|
case "invoice.payment_failed":
|
|
const paymentIntent = request.body.data.object;
|
|
await handlePaymentFailure(paymentIntent);
|
|
break;
|
|
default:
|
|
console.log(`Unhandled event type`);
|
|
}
|
|
|
|
//response.status(200).send();
|
|
}
|
|
}
|
|
|
|
module.exports = new StripeController();
|
|
|
|
/*
|
|
|
|
STRIPE TEST MODE PRICE CODES
|
|
|
|
items = [{ price: priceId }];
|
|
if (planType === "associate" && isAnnual === false) {
|
|
priceId = "price_1OdGLMBi8p7FeGFrr3JN9LB6";
|
|
} else if (planType === "associate" && isAnnual === true) {
|
|
priceId = "price_1OdGN3Bi8p7FeGFr9PM7oD93";
|
|
} else if (planType === "partner" && isAnnual === false) {
|
|
priceId = "price_1OdGO8Bi8p7FeGFrg7EdavjO";
|
|
} else if (planType === "partner" && isAnnual === true) {
|
|
priceId = "price_1OdGPHBi8p7FeGFrNd0hOVro";
|
|
} else if (planType === "seniorPartner" && isAnnual === false) {
|
|
priceId = "price_1OdGRLBi8p7FeGFrVAf7QCdw";
|
|
} else if (planType === "seniorPartner" && isAnnual === true) {
|
|
priceId = "price_1OdGRrBi8p7FeGFr2Zvr7USe";
|
|
}
|
|
|
|
items = [{ price: priceId }];
|
|
|
|
if (planType === "partner" && isAnnual === false) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1OdIcqBi8p7FeGFrcKhFGudX";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1OdIvYBi8p7FeGFrLhvk1mwo";
|
|
items.push({ price: addId });
|
|
}
|
|
} else if (planType === "partner" && isAnnual === true) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1OdIunBi8p7FeGFrOJjULnA0";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1OdJ0pBi8p7FeGFrFrrXjfwA";
|
|
items.push({ price: addId });
|
|
}
|
|
}
|
|
|
|
if (planType === "seniorPartner" && isAnnual === false) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1OdJ1XBi8p7FeGFrZVHDlSGH";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1OdJ3vBi8p7FeGFr47ZbQQN6";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 3) {
|
|
addId = "price_1OdJ50Bi8p7FeGFrFB8wTpZu";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 4) {
|
|
addId = "price_1OdJ6uBi8p7FeGFrdUhzYaGC";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 5) {
|
|
addId = "price_1OdJ88Bi8p7FeGFrSwpR5r4Z";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 6) {
|
|
addId = "price_1OdJ9CBi8p7FeGFrTQNy2YVd";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 7) {
|
|
addId = "price_1OdJAIBi8p7FeGFrZyWHIlYf";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 8) {
|
|
addId = "price_1OdJCzBi8p7FeGFriBy3OCso";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 9) {
|
|
addId = "price_1OddLzBi8p7FeGFrzeVmj4fG";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 10) {
|
|
addId = "price_1OddNUBi8p7FeGFraRX3ypOK";
|
|
items.push({ price: addId });
|
|
}
|
|
}
|
|
|
|
if (planType === "seniorPartner" && isAnnual === true) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1OdJ3EBi8p7FeGFr6371XcAi";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1OdJ4PBi8p7FeGFrgW7aKHwZ";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 3) {
|
|
addId = "price_1OdJ6IBi8p7FeGFrItKkXCeM";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 4) {
|
|
addId = "price_1OdJ7YBi8p7FeGFrCC6AulEY";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 5) {
|
|
addId = "price_1OdJ8lBi8p7FeGFr6d8z3afK";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 6) {
|
|
addId = "price_1OdJ9kBi8p7FeGFrxXTG7s20";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 7) {
|
|
addId = "price_1OdJBJBi8p7FeGFrc0F6ByO5";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 8) {
|
|
addId = "price_1OdJDbBi8p7FeGFrbpE4URLd";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 9) {
|
|
addId = "price_1OddMxBi8p7FeGFraD12KrD4";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 10) {
|
|
addId = "price_1OddOEBi8p7FeGFrKcFey7PM";
|
|
items.push({ price: addId });
|
|
}
|
|
}
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
STRIPE PROD PRICE CODES
|
|
|
|
|
|
if (planType === "associate" && isAnnual === false) {
|
|
priceId = "price_1OgasxBi8p7FeGFrjrF7VNAk";
|
|
} else if (planType === "associate" && isAnnual === true) {
|
|
priceId = "price_1OgatkBi8p7FeGFrfwzALYhR";
|
|
} else if (planType === "partner" && isAnnual === false) {
|
|
priceId = "price_1Ogb1uBi8p7FeGFrk9DFQOo0";
|
|
} else if (planType === "partner" && isAnnual === true) {
|
|
priceId = "price_1Ogb20Bi8p7FeGFrJDCwuefJ";
|
|
} else if (planType === "seniorPartner" && isAnnual === false) {
|
|
priceId = "price_1Ogb2VBi8p7FeGFrFjIyL8eW";
|
|
} else if (planType === "seniorPartner" && isAnnual === true) {
|
|
priceId = "price_1Ogb2gBi8p7FeGFrlTQ6xnoj";
|
|
}
|
|
|
|
if (planType === "partner" && isAnnual === false) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1Ogb5SBi8p7FeGFrXh5oQ1xL";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1Ogb5dBi8p7FeGFr0Qb7NMIs";
|
|
items.push({ price: addId });
|
|
}
|
|
} else if (planType === "partner" && isAnnual === true) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1Ogb5XBi8p7FeGFrYp3OqBgN";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1Ogb5iBi8p7FeGFrZJga58z2";
|
|
items.push({ price: addId });
|
|
}
|
|
}
|
|
|
|
if (planType === "seniorPartner" && isAnnual === false) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1OgbBRBi8p7FeGFrhNNCiKSB";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1OgbBbBi8p7FeGFrDkiHBqjJ";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 3) {
|
|
addId = "price_1OgbBrBi8p7FeGFr3iaomKIM";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 4) {
|
|
addId = "price_1OgbC2Bi8p7FeGFrS5mVMoco";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 5) {
|
|
addId = "price_1OgbCCBi8p7FeGFrsCDdUtv0";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 6) {
|
|
addId = "price_1OgbCOBi8p7FeGFrYXgF9caV";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 7) {
|
|
addId = "price_1OgbCaBi8p7FeGFrHs3urIBo";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 8) {
|
|
addId = "price_1OgbCkBi8p7FeGFrP150586E";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 9) {
|
|
addId = "price_1OgbCvBi8p7FeGFrhn7Fc6yz";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 10) {
|
|
addId = "price_1OgbDEBi8p7FeGFrfVkhYgsC";
|
|
items.push({ price: addId });
|
|
}
|
|
}
|
|
|
|
if (planType === "seniorPartner" && isAnnual === true) {
|
|
if (additionalAccounts === 1) {
|
|
addId = "price_1OgbBWBi8p7FeGFrBHRfsvSl";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 2) {
|
|
addId = "price_1OgbBjBi8p7FeGFr2H3WrJHL";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 3) {
|
|
addId = "price_1OgbBxBi8p7FeGFrZ4P4HXYj";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 4) {
|
|
addId = "price_1OgbC8Bi8p7FeGFrdSZJ6vHu";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 5) {
|
|
addId = "price_1OgbCHBi8p7FeGFrDWU3480v";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 6) {
|
|
addId = "pprice_1OgbCVBi8p7FeGFrj4XYUjvT";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 7) {
|
|
addId = "price_1OgbCfBi8p7FeGFrDUHZb3fq";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 8) {
|
|
addId = "price_1OgbCqBi8p7FeGFrcBpwHOei";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 9) {
|
|
addId = "price_1OgbD0Bi8p7FeGFrSzd969h7";
|
|
items.push({ price: addId });
|
|
} else if (additionalAccounts === 10) {
|
|
addId = "price_1OgbD9Bi8p7FeGFrrxZ4Y6Cl";
|
|
items.push({ price: addId });
|
|
}
|
|
}
|
|
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
if (planType === "associate" && isAnnual === false) {
|
|
priceId = "price_1OgasxBi8p7FeGFrjrF7VNAk";
|
|
} else if (planType === "associate" && isAnnual === true) {
|
|
priceId = "price_1OgatkBi8p7FeGFrfwzALYhR";
|
|
} else if (planType === "partner" && isAnnual === false) {
|
|
priceId = "price_1Ogb1uBi8p7FeGFrk9DFQOo0";
|
|
} else if (planType === "partner" && isAnnual === true) {
|
|
priceId = "price_1Ogb20Bi8p7FeGFrJDCwuefJ";
|
|
} else if (planType === "seniorPartner" && isAnnual === false) {
|
|
priceId = "price_1Ogb2VBi8p7FeGFrFjIyL8eW";
|
|
} else if (planType === "seniorPartner" && isAnnual === true) {
|
|
priceId = "price_1Ogb2gBi8p7FeGFrlTQ6xnoj";
|
|
}
|
|
|
|
*/
|