// // where should this live? /* 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('./recurly-config')); var xml_bodyparser = require('express-xml-bodyparser'); var parser = new xml2js.Parser(); var subscribe = module.exports = { plan_levels: { free: 0, basic: 1, pro: 2, custom: 3, artist: 4, }, 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[0].account_code[0] var subscrip = data.subscription[0] var uuid = subscrip.uuid[0] Subscription.findOne({ "uuid": uuid }, function(err, old_subscriber){ // if (err) return; var plan, plan_type, plan_code var plan_code = subscrip.plan[0].plan_code[0] if (plan_code.indexOf("-") !== -1) { plan = plan_code.split("-") plan_type = plan[0] plan_period = plan[1] } else { plan_type = "custom" plan_period = "monthly" } user.plan_code = plan_code user.plan_type = plan_type user.plan_level = subscribe.plan_levels[plan_type] var subscriber = old_subscriber || new Subscription () subscriber.uuid = uuid subscriber.user_id = user._id subscriber.plan_code = plan_code subscriber.plan_type = plan_type subscriber.plan_period = plan_period subscriber.plan_level = subscribe.plan_levels[plan_type] subscriber.add_ons = [] var add_ons = subscrip.subscription_add_ons[0].subscription_add_on if (add_ons) { add_ons.forEach(function(add_on){ switch (add_on.add_on_code[0]) { case 'extra-basic-layout': subscriber.basic_layouts = parseInt(add_on.quantity[0]._, 10) || 0 break case 'extra-pro-layout': subscriber.pro_layouts = parseInt(add_on.quantity[0]._, 10) || 0 break } }) } 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[0] user.last_charged = new Date(data.transaction[0].date[0]._) 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[0].account_code[0] }, 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){ console.log(req.body) // parser.parseString(req.body, function (err, result) { var result = req.body for (var action in result) { if (subscribe.callbacks[action]) { subscribe.execute(action, result[action]); } } return res.status(200).end() }, list: function(req, res){ recurly.subscriptions.listByAccount(req.params.id, function(data){ if (data.data != 404) { res.json(data) return } else { res.json(data) return } }) }, route: function(app){ app.post('/subscribe/webhook', xml_bodyparser(), subscribe.handle); app.get('/subscribe/list/:id', subscribe.list); }, }