// // where should this live? // app.get('/subscribe/webhook', views.subscription.webhook); /* app.use(express.basicAuth(function(user, pass, callback) { var result = (user === 'testUser' && pass === 'testPass'); callback(null, result); })); */ /* jshint node: true */ var User = require('../schemas/User'), Subscription = require('../schemas/Subscription'), config = require('../../../config'), middleware = require('../middleware'), util = require('../util'), _ = require('lodash'), moment = require('moment'), xml2js = require('xml2js'), Recurly = require('node-recurly'), recurly = new Recurly(require('./config')); var parser = new xml2js.Parser(); var subscribe = module.exports = { plan_level: { free: 0, basic: 1, pro: 2, }, callbacks: { /* // accounts new_account_notification: function(data, user){ // fires on successful signup }, canceled_account_notification: function(data, user){ }, billing_info_updated_notification: function(data, user){ }, reactivated_account_notification: function(data, user){ }, // invoices new_invoice_notification: function(data, user){ }, closed_invoice_notification: function(data, user){ }, past_due_invoice_notification: function(data, user){ }, */ // subscriptions new_subscription_notification: function(data, user){ var account = data.account Subscription.findOne({ "uuid": data.subscription.uuid }, function(err, subscription){ if (err || subscription) return; var plan = data.subscription.plan.plan_code.split("-") var plan_type = plan[0] var plan_period = plan[1] user.plan_type = plan_type user.plan_period = plan_period user.plan_level = subscribe.plan_level[plan_type] var subscriber = new Subscription () subscriber.user_id = user._id subscriber.uuid = data.subscription.uuid subscriber.add_ons = subscription.add_ons.map(function(add_on){ return { name: add_on.plan, quantity: add_on.quantity, } }) subscriber.save(function(err, data){ if (err) return; user.save(function(err){ // saved! }) }) }) }, /* updated_subscription_notification: function(data, user){ }, canceled_subscription_notification: function(data, user){ }, expired_subscription_notification: function(data, user){ }, renewed_subscription_notification: function(data, user){ }, */ // payments successful_payment_notification: function(data, user){ var account = data.account user.last_charged = new Date(data.transaction.date) user.save(function(){ }) }, /* failed_payment_notification: function(data, user){ }, successful_refund_notification: function(data, user){ }, void_payment_notification: function(data, user){ }, */ }, execute: function(action, data){ User.findOne({ _id: data.account.account_code }, function(err, user){ if (err) { return } subscribe.callbacks[action](data, user) }) }, // then calls to get appropriate info from the recurly api handle: function(req, res){ res.status(200).end() parser.parseString(data, function (err, result) { console.log(inspect(result, { colors: true, depth: Infinity })); for (var action in result) { if (subscribe.callbacks[action]) { subscribe.execute(action, result[action]); } } }); }, route: function(app){ app.post('/subscribe/webhook', subscribe.handle); }, }