From 876e77e11a0e20c1ef4f014d90b927cc35e4ab84 Mon Sep 17 00:00:00 2001 From: Arjun Patel Date: Tue, 29 Jan 2019 23:47:06 -0800 Subject: [PATCH] attempt to do controller function --- app/controllers/stripe.controller.js | 180 +++++++++++++++++++-------- app/models/donor.model.js | 4 + app/models/paymentplan.model.js | 4 - server.js | 2 +- 4 files changed, 133 insertions(+), 57 deletions(-) diff --git a/app/controllers/stripe.controller.js b/app/controllers/stripe.controller.js index 33c84e1..32ac249 100644 --- a/app/controllers/stripe.controller.js +++ b/app/controllers/stripe.controller.js @@ -3,71 +3,147 @@ const db = require('../config/db.config.js'), const stripe = require('stripe')('sk_test_n8NCvCFjD1xFhGiEq6SI8CXj'); -const { Donor, Organization } = db; +const { Donor, Organization, Charge, PaymentPlan } = db; // Subscribe user to plan or one time charge exports.grantCharge = (req, res, next) => { - const { stripeToken, amount, monthly } = req.body; + const { stripeToken, grant_id, amount, monthly } = req.body; const user = req.user; - findStripeId(user.id) - .then(stripeId => { - if (!stripeId) { - return stripe.customers + 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 => { - Donor.update( - { stripe_id: customer.id }, - { where: { id: user.id } } - ); - return customer.id; + .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)); }); } - return stripeId; - }) - .then(stripeId => { - // return stripe.charges.create({ - // amount, - // currency: 'usd', - // customer: stripeId - // });s - stripe.plans - .create({ - product: 'prod_CbvTFuXWh7BPJH', - currency: 'usd', - interval: 'month', - amount: 10000 - }) - .then(); - }) - .then(chargeResponse => { - res.status(200).json(chargeResponse); }) .catch(error => next(error)); - // if (!monthly) { - // const charge = stripe.charges.create({ - // amount, - // currency: 'usd', - // description: 'One time payment for grant', - // source: stripeToken, - // statement_descriptor: 'One time payment for grant' + // 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); // } }; - -const findStripeId = userId => { - return new Promise((resolve, reject) => { - Donor.findAll({ where: { id: userId } }) - .then(donors => { - // add stripe id for - // if (donors[0]) { - // return next(errorMaker(409, `Email Exists: ${req.body.email}`)); - // } - resolve(donors[0].stripe_id); - }) - .catch(error => reject(error)); - }); -}; diff --git a/app/models/donor.model.js b/app/models/donor.model.js index 703bdb3..b87ae58 100644 --- a/app/models/donor.model.js +++ b/app/models/donor.model.js @@ -9,6 +9,10 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.UUID, defaultValue: null }, + subscription_id: { + type: DataTypes.UUID, + defaultValue: null + }, first_name: { type: DataTypes.STRING, allowNull: false diff --git a/app/models/paymentplan.model.js b/app/models/paymentplan.model.js index ec6b142..8cffe10 100644 --- a/app/models/paymentplan.model.js +++ b/app/models/paymentplan.model.js @@ -10,10 +10,6 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.UUID, allowNull: false }, - subscription_id: { - type: DataTypes.UUID, - allowNull: false - }, amount: { type: DataTypes.INTEGER, allowNull: false diff --git a/server.js b/server.js index 35d9835..73ec13d 100644 --- a/server.js +++ b/server.js @@ -37,7 +37,7 @@ db.sequelize }); //force: true will drop the table if it already exists -const drop_tables = true; +const drop_tables = false; db.sequelize.sync({ force: drop_tables }).then(() => { console.log(`Drop and Resync with { force: ${drop_tables} }`); });