From afce400c65f362f7dd6307a5670dc3873d74ab79 Mon Sep 17 00:00:00 2001 From: Julie Lala Date: Sun, 11 Jan 2015 21:42:45 -0500 Subject: stub in subscriptions admin pages --- views/staff/subscriptions/index.ejs | 36 ++++++++++++++++++++++++++++++++++++ views/staff/subscriptions/show.ejs | 12 ++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 views/staff/subscriptions/index.ejs create mode 100644 views/staff/subscriptions/show.ejs (limited to 'views/staff/subscriptions') diff --git a/views/staff/subscriptions/index.ejs b/views/staff/subscriptions/index.ejs new file mode 100644 index 0000000..d1c0588 --- /dev/null +++ b/views/staff/subscriptions/index.ejs @@ -0,0 +1,36 @@ +[[ include ../_header ]] + +

Users

+ +[[ include ../_nav ]] + +
+ +[[ include ../_pagination ]] + + +[[ subscriptions.forEach(function(subscription){ ]] + + + + + + + +[[ }) ]] +
+
+
+ [[- subscription.user.username ]] + + [[- subscription.user.displayName ]] + + [[- subscription.user.last_seen ]] +
+ + +[[ include ../_pagination ]] + +[[ include ../_footer ]] diff --git a/views/staff/subscriptions/show.ejs b/views/staff/subscriptions/show.ejs new file mode 100644 index 0000000..e2839a6 --- /dev/null +++ b/views/staff/subscriptions/show.ejs @@ -0,0 +1,12 @@ +[[ include ../_header ]] +

User: [[- subscription.user.username ]]

+ +[[ include ../_nav ]] + +
+ +
+info to show..
+- link to recurly profile
+- link to vvalls profile
+- subscription tier + add-ons
-- 
cgit v1.2.3-70-g09d2


From 5adac681bdb43b8b709795fa501689fb9ae8a4e1 Mon Sep 17 00:00:00 2001
From: Jules Laplace 
Date: Wed, 28 Jan 2015 19:18:27 -0500
Subject: many methods

---
 package.json                        |   1 +
 server/lib/api/subscription.js      | 124 ++++++++++++++++++++++++++++++++----
 server/lib/middleware.js            |   2 +-
 server/lib/schemas/Subscription.js  |   6 +-
 server/lib/views/staff.js           |   2 +-
 server/lib/webhook/webhook.js       |   2 +-
 views/about/brochure.ejs            |  15 +++--
 views/partials/header.ejs           |   1 +
 views/staff/_users.ejs              |   1 +
 views/staff/plans/_form.ejs         |   5 ++
 views/staff/subscriptions/index.ejs |   2 +-
 views/staff/users/show.ejs          |   1 +
 12 files changed, 135 insertions(+), 27 deletions(-)

(limited to 'views/staff/subscriptions')

diff --git a/package.json b/package.json
index 8afb96e..e89fcd9 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
     "express-subdomains": "0.0.5",
     "html-entities": "~1.0.10",
     "intro.js": "^0.9.0",
+    "js2xml": "^1.0.0",
     "knox": "~0.8.10",
     "lodash": "~2.4.1",
     "marked": "~0.3.2",
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
diff --git a/server/lib/middleware.js b/server/lib/middleware.js
index 797d677..7dfe821 100644
--- a/server/lib/middleware.js
+++ b/server/lib/middleware.js
@@ -59,7 +59,7 @@ var middleware = {
 		res.locals.opt = {}
 		next()
 	},
-	
+  
 	ensureProject: function (req, res, next) {
 		if (req.params.slug) {
 			Project.findOne({ slug: req.params.slug }, function(err, project){
diff --git a/server/lib/schemas/Subscription.js b/server/lib/schemas/Subscription.js
index b766555..24c5096 100644
--- a/server/lib/schemas/Subscription.js
+++ b/server/lib/schemas/Subscription.js
@@ -13,10 +13,8 @@ var SubscriptionSchema = new mongoose.Schema({
 	plan_period: { type: String, default: "monthly" },
 
 	subscription_uuid: { type: String },
-	subscription_add_ons: [{
-		name: { type: String },
-		quantity: { type: Number },
-	}],
+	basic_layouts: { type: Number, default: 0 },
+	pro_layouts: { type: Number, default: 0 },
 	
 	history: [{
 	  action: { type: String },
diff --git a/server/lib/views/staff.js b/server/lib/views/staff.js
index 74dd7cd..67193fe 100644
--- a/server/lib/views/staff.js
+++ b/server/lib/views/staff.js
@@ -154,7 +154,7 @@ var staff = module.exports = {
     },
 
     ensurePlans: function(req, res, next){
-      Plan.find(function (err, plans) {
+      Plan.find({}).sort({ 'level': -1 }).exec(function (err, plans) {
         res.locals.plans = (plans || []).map(staff.helpers.plan)
         res.locals.plans.sort(function(a,b){ return a.monthly_price })
         next()
diff --git a/server/lib/webhook/webhook.js b/server/lib/webhook/webhook.js
index 4f23d0b..a871a3a 100644
--- a/server/lib/webhook/webhook.js
+++ b/server/lib/webhook/webhook.js
@@ -149,6 +149,6 @@ var subscribe = module.exports = {
 	
 	route: function(app){
 		app.post('/subscribe/webhook', subscribe.handle);
-		app.get('/subscribe/list/:id', subscribe.list);
+		app.get('/subscribe/list/:id', subscribe.middleware.ensureSubscription, subscribe.list);
 	},
 }
diff --git a/views/about/brochure.ejs b/views/about/brochure.ejs
index 49b03db..1dad763 100644
--- a/views/about/brochure.ejs
+++ b/views/about/brochure.ejs
@@ -34,12 +34,11 @@
         
  • VValls logo appears when embedding an exhibition on a web page
  • [[ if (! logged_in) { ]] - - [[ } else if (! user.plan_level || user.plan_level < plan.level) { ]] - + + [[ } else if (! user.plan_level) { ]] + [[ } else if (user.plan_level == plan.level) { ]] Current Level - [[ } else { ]] [[ } ]] @@ -56,11 +55,13 @@
  • No VValls logo on embed
  • [[ if (! logged_in) { ]] - - [[ } else if (! user.plan_level || user.plan_level < plan.level) { ]] - + + [[ } else if (! user.plan_level) { ]] + [[ } else if (user.plan_level == plan.level) { ]] Current Level + [[ } else if (user.plan_level < plan.level) { ]] + [[ } ]] diff --git a/views/partials/header.ejs b/views/partials/header.ejs index ce5bab9..2acf2bc 100644 --- a/views/partials/header.ejs +++ b/views/partials/header.ejs @@ -64,6 +64,7 @@ [[ if (profile && String(user._id) == String(profile._id)) { ]] Settings + Subscription [[ } else if (! profile) { ]] Profile [[ } ]] diff --git a/views/staff/_users.ejs b/views/staff/_users.ejs index d46058f..053e289 100644 --- a/views/staff/_users.ejs +++ b/views/staff/_users.ejs @@ -12,6 +12,7 @@ [view profile] + [recurly] [[- user.last_seen ]] diff --git a/views/staff/plans/_form.ejs b/views/staff/plans/_form.ejs index ae5ca5a..b55c5cd 100644 --- a/views/staff/plans/_form.ejs +++ b/views/staff/plans/_form.ejs @@ -16,6 +16,11 @@
  • +
  • + +
    +
  • +
  • diff --git a/views/staff/subscriptions/index.ejs b/views/staff/subscriptions/index.ejs index d1c0588..3efffb5 100644 --- a/views/staff/subscriptions/index.ejs +++ b/views/staff/subscriptions/index.ejs @@ -1,6 +1,6 @@ [[ include ../_header ]] -

    Users

    +

    Subscriptions

    [[ include ../_nav ]] diff --git a/views/staff/users/show.ejs b/views/staff/users/show.ejs index 4ce1d9a..d6a21d5 100644 --- a/views/staff/users/show.ejs +++ b/views/staff/users/show.ejs @@ -19,6 +19,7 @@ [view profile] [view media] + [view on recurly] -- cgit v1.2.3-70-g09d2 From dd4f0178c7bcb5d14e1308e3877c5ab02eddf000 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Wed, 12 Aug 2015 12:37:49 -0400 Subject: modify webhook to support custom plans --- .../javascripts/ui/site/EditSubscriptionModal.js | 1 + server/lib/api/subscription.js | 1 + server/lib/schemas/Subscription.js | 1 + server/lib/schemas/User.js | 1 + server/lib/views/staff/middleware.js | 2 +- server/lib/webhook/webhook.js | 24 ++++++++++++++++------ views/staff/subscriptions/index.ejs | 3 +++ 7 files changed, 26 insertions(+), 7 deletions(-) (limited to 'views/staff/subscriptions') diff --git a/public/assets/javascripts/ui/site/EditSubscriptionModal.js b/public/assets/javascripts/ui/site/EditSubscriptionModal.js index 3a20234..1033114 100644 --- a/public/assets/javascripts/ui/site/EditSubscriptionModal.js +++ b/public/assets/javascripts/ui/site/EditSubscriptionModal.js @@ -96,6 +96,7 @@ var EditSubscriptionModal = ModalView.extend({ free: 0, basic: 1, pro: 2, + custom: 3, }, loaded: false, diff --git a/server/lib/api/subscription.js b/server/lib/api/subscription.js index 9c2d6ef..c2fff4c 100644 --- a/server/lib/api/subscription.js +++ b/server/lib/api/subscription.js @@ -16,6 +16,7 @@ var plan_levels = { free: 0, basic: 1, pro: 2, + custom: 3, } var subscription = module.exports = { diff --git a/server/lib/schemas/Subscription.js b/server/lib/schemas/Subscription.js index 355bbe2..bf43e8b 100644 --- a/server/lib/schemas/Subscription.js +++ b/server/lib/schemas/Subscription.js @@ -9,6 +9,7 @@ var mongoose = require('mongoose'), var SubscriptionSchema = new mongoose.Schema({ user_id: { type: mongoose.Schema.ObjectId, index: true }, + plan_code: { type: String, default: "" }, plan_type: { type: String, default: "free" }, plan_period: { type: String, default: "monthly" }, diff --git a/server/lib/schemas/User.js b/server/lib/schemas/User.js index 4b6ff39..e6e7f03 100644 --- a/server/lib/schemas/User.js +++ b/server/lib/schemas/User.js @@ -55,6 +55,7 @@ var UserSchema = new mongoose.Schema({ default: "", }, + plan_code: { type: String, default: "" }, plan_level: { type: Number, default: 0 }, plan_type: { type: String, default: "free" }, last_charged: { type: Date, default: null }, diff --git a/server/lib/views/staff/middleware.js b/server/lib/views/staff/middleware.js index 5c74d0b..1ea98e9 100644 --- a/server/lib/views/staff/middleware.js +++ b/server/lib/views/staff/middleware.js @@ -40,7 +40,7 @@ var middleware = module.exports = { } if (initial) { if (initial == "?") { - criteria.username = new RegExp('^[$a-zA-Z]', "i") + criteria.username = new RegExp('^[^a-zA-Z]', "i") } else { criteria.username = new RegExp('^' + initial, "i") diff --git a/server/lib/webhook/webhook.js b/server/lib/webhook/webhook.js index 58a13ca..bd51dac 100644 --- a/server/lib/webhook/webhook.js +++ b/server/lib/webhook/webhook.js @@ -26,10 +26,11 @@ var xml_bodyparser = require('express-xml-bodyparser'); var parser = new xml2js.Parser(); var subscribe = module.exports = { - plan_level: { + plan_levels: { free: 0, basic: 1, pro: 2, + custom: 3, }, callbacks: { @@ -62,19 +63,30 @@ var subscribe = module.exports = { Subscription.findOne({ "uuid": uuid }, function(err, old_subscriber){ // if (err) return; - var plan = subscrip.plan[0].plan_code[0].split("-") - var plan_type = plan[0] - var plan_period = plan[1] + 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_level[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_level[plan_type] + 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) { diff --git a/views/staff/subscriptions/index.ejs b/views/staff/subscriptions/index.ejs index 3efffb5..adf148c 100644 --- a/views/staff/subscriptions/index.ejs +++ b/views/staff/subscriptions/index.ejs @@ -26,6 +26,9 @@ [[- subscription.user.last_seen ]] + + [[- subscription.plan_code ]] + [[ }) ]] -- cgit v1.2.3-70-g09d2