mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
124 lines
4.1 KiB
JavaScript
124 lines
4.1 KiB
JavaScript
var nconf = require('nconf');
|
|
var stripe = require('stripe')(nconf.get('STRIPE_API_KEY'));
|
|
var async = require('async');
|
|
var payments = require('./index');
|
|
var User = require('mongoose').model('User');
|
|
var shared = require('../../../../common');
|
|
var mongoose = require('mongoose');
|
|
var cc = require('coupon-code');
|
|
|
|
/*
|
|
Setup Stripe response when posting payment
|
|
*/
|
|
exports.checkout = function(req, res, next) {
|
|
var token = req.body.id;
|
|
var user = res.locals.user;
|
|
var gift = req.query.gift ? JSON.parse(req.query.gift) : undefined;
|
|
var sub = req.query.sub ? shared.content.subscriptionBlocks[req.query.sub] : false;
|
|
|
|
async.waterfall([
|
|
function(cb){
|
|
if (sub) {
|
|
async.waterfall([
|
|
function(cb2){
|
|
if (!sub.discount) return cb2(null, null);
|
|
if (!req.query.coupon) return cb2('Please provide a coupon code for this plan.');
|
|
mongoose.model('Coupon').findOne({_id:cc.validate(req.query.coupon), event:sub.key}, cb2);
|
|
},
|
|
function(coupon, cb2){
|
|
if (sub.discount && !coupon) return cb2('Invalid coupon code.');
|
|
var customer = {
|
|
email: req.body.email,
|
|
metadata: {uuid: user._id},
|
|
card: token,
|
|
plan: sub.key
|
|
};
|
|
stripe.customers.create(customer, cb2);
|
|
}
|
|
], cb);
|
|
} else {
|
|
stripe.charges.create({
|
|
amount: !gift ? '500' //"500" = $5
|
|
: gift.type=='subscription' ? ''+shared.content.subscriptionBlocks[gift.subscription.key].price*100
|
|
: ''+gift.gems.amount/4*100,
|
|
currency: 'usd',
|
|
card: token
|
|
}, cb);
|
|
}
|
|
},
|
|
function(response, cb) {
|
|
if (sub) return payments.createSubscription({user:user, customerId:response.id, paymentMethod:'Stripe', sub:sub}, cb);
|
|
async.waterfall([
|
|
function(cb2){ User.findById(gift ? gift.uuid : undefined, cb2); },
|
|
function(member, cb2){
|
|
var data = {user:user, customerId:response.id, paymentMethod:'Stripe', gift:gift};
|
|
var method = 'buyGems';
|
|
if (gift) {
|
|
gift.member = member;
|
|
if (gift.type=='subscription') method = 'createSubscription';
|
|
data.paymentMethod = 'Gift';
|
|
}
|
|
payments[method](data, cb2);
|
|
}
|
|
], cb);
|
|
}
|
|
], function(err){
|
|
if (err) return res.send(500, err.toString()); // don't json this, let toString() handle errors
|
|
res.sendStatus(200);
|
|
user = token = null;
|
|
});
|
|
};
|
|
|
|
exports.subscribeCancel = function(req, res, next) {
|
|
var user = res.locals.user;
|
|
if (!user.purchased.plan.customerId)
|
|
return res.json(401, {err: 'User does not have a plan subscription'});
|
|
|
|
async.auto({
|
|
get_cus: function(cb){
|
|
stripe.customers.retrieve(user.purchased.plan.customerId, cb);
|
|
},
|
|
del_cus: ['get_cus', function(cb, results){
|
|
stripe.customers.del(user.purchased.plan.customerId, cb);
|
|
}],
|
|
cancel_sub: ['get_cus', function(cb, results) {
|
|
var data = {
|
|
user: user,
|
|
nextBill: results.get_cus.subscription.current_period_end*1000, // timestamp is in seconds
|
|
paymentMethod: 'Stripe'
|
|
};
|
|
payments.cancelSubscription(data, cb);
|
|
}]
|
|
}, function(err, results){
|
|
if (err) return res.send(500, err.toString()); // don't json this, let toString() handle errors
|
|
res.redirect('/');
|
|
user = null;
|
|
});
|
|
};
|
|
|
|
exports.subscribeEdit = function(req, res, next) {
|
|
var token = req.body.id;
|
|
var user = res.locals.user;
|
|
var user_id = user.purchased.plan.customerId;
|
|
var sub_id;
|
|
|
|
async.waterfall([
|
|
function(cb){
|
|
stripe.customers.listSubscriptions(user_id, cb);
|
|
},
|
|
function(response, cb) {
|
|
sub_id = response.data[0].id;
|
|
console.warn(sub_id);
|
|
console.warn([user_id, sub_id, { card: token }]);
|
|
stripe.customers.updateSubscription(user_id, sub_id, { card: token }, cb);
|
|
},
|
|
function(response, cb) {
|
|
user.save(cb);
|
|
}
|
|
], function(err, saved){
|
|
if (err) return res.send(500, err.toString()); // don't json this, let toString() handle errors
|
|
res.sendStatus(200);
|
|
token = user = user_id = sub_id;
|
|
});
|
|
};
|