const db = require('../config/db.config.js'), errorMaker = require('../helpers/error.maker'); const stripe = require('stripe')('sk_test_n8NCvCFjD1xFhGiEq6SI8CXj'); const { Donor, Organization, Charge, PaymentPlan } = db; // Subscribe user to plan or one time charge exports.grantCharge = (req, res, next) => { const { stripeToken, grant_id, amount, monthly } = req.body; const user = req.user; Donor.findAll({ where: { id: user.id } }) .then(donors => { var { stripe_id, subscription_id } = donors[0]; req.subscription_id = subscription_id; if (!stripe_id) { stripe_id = stripe.customers .create({ source: stripeToken, email: user.email }) .then(customer => customer.id) .catch(error => next(errorMaker(500, "Couldn't create customer with source")) ); } return [stripe_id, subscription_id]; }) .then(([stripe_id, subscription_id]) => { console.log(stripe_id, subscription_id); if (!monthly) { stripe.charges .create({ amount, currency: 'usd', customer: stripe_id, description: 'One time payment for grant', statement_descriptor: 'One time payment for grant' }) .then(chargeResponse => res.status(200).json(chargeResponse)) .catch(error => next(error)); } else { stripe.plans .create({ id: grant_id, nickname: `Grant for user: ${user.id}`, product: 'prod_ER3jOog6QMX1GP', currency: 'usd', interval: 'month', amount }) .then(plan => { if (!req.subscription_id) { stripe.subscriptions .create({ customer: stripe_id, items: [{ plan: plan.id }] }) .then(sub => stripe.subscriptionItems .create({ subscription: sub.id, plan: plan.id }) .catch(error => next(error)) ) .catch(error => next(error)); } else { stripe.subscriptionItems .create({ subscription: req.subscription_id, plan: plan.id }) .catch(error => next(error)); } PaymentPlan.create({ plan_id: plan.id, amount, grant_id: grant_id }).catch(error => next(error)); }); } }) .catch(error => next(error)); // try { // const donors = await Donor.findAll({ where: { id: user.id } }); // // check if already a stripe customer and have subscription // let customer_id = await (donors[0].stripe_id // ? donors[0].stripe_id // : .id); // let subscription_id = await (donors[0].subscription_id // ? donors[0].subscription_id // : await stripe.subscriptions.create({ // customer: customer_id, // items: [{ plan: 'Grant' }] // }).id); // console.log(await customer_id); // await Donor.update( // { stripe_id: customer_id, subscription_id }, // { where: { id: user.id } } // ); // // charge if not monthly, plan if it is // if (!monthly) { // let charge = await stripe.charges.create({ // amount, // currency: 'usd', // customer: customer_id, // description: 'One time payment for grant', // statement_descriptor: 'One time payment for grant' // }); // await Charge.create({ // id: charge.id, // amount, // description: 'One time payment for grant' // }); // } else { // const plan = await stripe.plans.create({ // id: grant_id, // nickname: `Grant for user: ${user.id}`, // product: 'prod_ER3jOog6QMX1GP', // currency: 'usd', // interval: 'month', // amount // }); // await PaymentPlan.create({ // plan_id: plan.id, // amount, // grant_id: grant_id // }); // await stripe.subscriptionItems.create({ // subscription: subscription_id, // plan: plan.id // }); // } // res.status(200).json({ // message: 'Successfully charged or subscribed' // }); // } catch (error) { // next(error); // } };