/* jshint node: true */ var _ = require('lodash'), util = require('../util'), upload = require('../upload'), config = require('../../../config.json'), User = require('../schemas/User'), Project = require('../schemas/Project'), Layout = require('../schemas/Layout'), Plan = require('../schemas/Plan'); Subscription = require('../schemas/Subscription'), Recurly = require('node-recurly'), recurly = new Recurly(require('../webhook/recurly-config')); var plan_levels = { free: 0, basic: 1, pro: 2, } var subscription = module.exports = { middleware: { ensureSubscription: function(req, res, next){ Subscription.findOne({ user_id: req.user._id }, function(err, data){ if (err) { return next() } req.subscription = data next() }) }, ensurePlans: function(req, res, next){ Plan.find({}).sort({ 'level': -1 }).exec(function (err, plans) { res.locals.plans = (plans || []) next() }) }, }, // synchronise an account with recurly.. // useful when testing locally (where webhooks cannot be received) // parses the XML from the subscription API into something usable sync: function(req, res){ var subscriber = req.subscription || new Subscription () var user = req.user recurly.subscriptions.listByAccount(req.user._id, function(recurlyRes){ var data = recurlyRes.data if (recurlyRes.description !== 200) { res.json({ error: "no account" }) return } var subscriptions = data.subscriptions.subscription.length ? data.subscriptions.subscription : [data.subscriptions.subscription] var is_active = subscriptions.some(function(subscription_data){ if (subscription_data.state == "active") { set_active(subscription_data) return true } return false }) console.log(data.subscriptions) if (! is_active) { set_cancelled() } }) function set_cancelled(){ user.plan_type = "free" user.plan_level = plan_levels["free"] return subscriber.remove(function(){ user.save(function(){ res.json({ error: "account cancelled" }) }) }) } function set_active(data){ var plan = data.plan.plan_code.split("-") var plan_type = plan[0] var plan_period = plan[1] user.plan_type = plan_type user.plan_level = plan_levels[plan_type] subscriber.uuid = data.uuid subscriber.user_id = user._id subscriber.plan_type = plan_type subscriber.plan_period = plan_period subscriber.plan_level = plan_levels[plan_type] var add_ons = data.subscription_add_ons.subscription_add_on if (add_ons) { if (add_ons.add_on_code) { add_ons = [ add_ons ] } // TODO: handle multiple add-ons.. presumably this will work add_ons.forEach(function(add_on){ var add_on_type = add_on.add_on_code.split("-")[1] if (add_on_type == "basic") { subscriber.basic_layouts = parseInt( add_on.quantity._ ) } if (add_on_type == "pro") { subscriber.pro_layouts = parseInt( add_on.quantity._ ) } }) } else { subscriber.basic_layouts = 0 subscriber.pro_layouts = 0 } subscriber.save(function(){ user.save(function(){ res.json({ subscription: subscriber, plans: res.locals.plans }) }) }) } }, show: function(req, res){ if (req.subscription) { res.json({ subscription: req.subscription, plans: res.locals.plans }) } else { res.json({ error: "no subscription", plans: res.locals.plans, }) } }, update: function(req, res){ if (! req.subscription ) { return res.json({ error: "no subscription" }) } if (! (req.body.plan_type in plan_levels)) { return res.json({ error: "bad input" }) } var subscriber = req.subscription // change.. // data.plan_code // data.subscription_add_ons = [] // add_on.add_on_code // add_on.quantity var basic_layouts = max(0, parseInt(req.body.basic_layouts)) var pro_layouts = max(0, parseInt(req.body.pro_layouts)) var data = {} data.plan_code = req.body.plan_type + "_monthly" data.subscription_add_ons = [] if (plan_levels[req.body.plan_type]) { data.subscription_add_ons.push({ add_on_code: "extra-basic-layout", quantity: basic_layouts }) } if (req.body.plan_type == "pro") { data.subscription_add_ons.push({ add_on_code: "extra-pro-layout", quantity: pro_layouts }) } recurly.subscriptions.update(subscriber.uuid, data, function(){ return res.json(subscriber) }) }, destroy: function(req, res){ if (! req.subscription ) { return res.json({ error: "no subscription" }) } var subscriber = req.subscription recurly.subscriptions.terminate(subscriber.uuid, "partial", function(){ subscriber.remove(function(){ req.user.plan_code = 0 req.user.plan_type = "free" req.user.save(function(){ res.json({ status: "OK" }) }) }) }) }, };