summaryrefslogtreecommitdiff
path: root/server/lib/api/subscription.js
diff options
context:
space:
mode:
authorJules Laplace <jules@okfoc.us>2015-01-28 19:18:27 -0500
committerJules Laplace <jules@okfoc.us>2015-01-28 20:21:49 -0500
commit5adac681bdb43b8b709795fa501689fb9ae8a4e1 (patch)
tree635ad1f56013840f60dba46e4ba8fd0261353f3b /server/lib/api/subscription.js
parente3ff5315f7ea7421431658077253c4d71f0f5731 (diff)
many methods
Diffstat (limited to 'server/lib/api/subscription.js')
-rw-r--r--server/lib/api/subscription.js124
1 files changed, 112 insertions, 12 deletions
diff --git a/server/lib/api/subscription.js b/server/lib/api/subscription.js
index 83644cf..40aa715 100644
--- a/server/lib/api/subscription.js
+++ b/server/lib/api/subscription.js
@@ -9,7 +9,22 @@ var _ = require('lodash'),
Layout = require('../schemas/Layout'),
Subscription = require('../schemas/Subscription');
+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()
+ })
+ },
+ }
/*
index: function(req, res){
@@ -18,30 +33,115 @@ var subscription = module.exports = {
})
},
*/
- middleware: {
- fetchAccount: function(req, res, next){
- recurly.subscriptions.listByAccount(req.user._id, function(data){
- })
- },
- },
// synchronise an account with recurly..
- // useful when testing locally (if webhooks do not fire)
+ // useful when testing locally (where webhooks cannot be received)
sync: function(req, res){
- // fetch req.user._id
+ var subscriber = req.subscription || new Subscription ()
+ var user = req.user
+ recurly.subscriptions.listByAccount(req.user._id, function(data){
+ if (data.description !== 200) {
+ res.json({ error: "no account" })
+ return
+ }
+ if (! data.subscriptions.subscription) {
+ res.json({ error: "account error" })
+ return
+ }
+
+ var plan = data.subscriptions.subscription.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.subscriptions.subscription.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.subscriptions.subscription.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.render(subscriber)
+ })
+ })
+ })
},
show: function(req, res){
- // fetch from recurly
+ res.json(req.subscription || { error: "no subscription" })
},
update: function(req, res){
- // update plan_type on recurly
- // update add_ons on recurly
+ 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){
- // destroy on recurly
+ if (! req.subscription ) {
+ return res.json({ error: "no subscription" })
+ }
+ var subscriber = req.subscription
+
+ recurly.subscriptions.cancel(subscriber.uuid, function(){
+ subscriber.remove(function(){
+ req.user.plan_code = 0
+ req.user.plan_type = "free"
+ })
+ })
},
}; \ No newline at end of file