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"; } */