diff options
Diffstat (limited to 'server/lib/webhook')
| -rw-r--r-- | server/lib/webhook/index.js | 44 | ||||
| -rw-r--r-- | server/lib/webhook/recurly-config.js | 6 | ||||
| -rw-r--r-- | server/lib/webhook/webhook.js | 178 |
3 files changed, 228 insertions, 0 deletions
diff --git a/server/lib/webhook/index.js b/server/lib/webhook/index.js new file mode 100644 index 0000000..a5f23ac --- /dev/null +++ b/server/lib/webhook/index.js @@ -0,0 +1,44 @@ +var config = require('../../../config.json'), + http = require('http'), + express = require('express'), + bodyParser = require('body-parser'), + mongoose = require('mongoose'); + +var http = require('http'), + express = require('express'), + bodyParser = require('body-parser'), + multer = require('multer'), + MongoStore = require('connect-mongo')(express), + passport = require('passport'), + path = require('path'), + mongoose = require('mongoose'); + +var webhook = require('./webhook'); + +var app = express() +var server +var DATABASE_URI = process.env.MONGOLAB_URI || ('mongodb://' + config.databaseHost + '/vvalls') + +var site = {} + +site.init = function(){ + mongoose.connect(DATABASE_URI, {}, site.ready); +} + +site.ready = function(){ + app.set('port', config.webhookPort); + // app.use(bodyParser()); + app.use(express.query()); + app.set('env', config.env.production ? "production" : "development") + app.get('env') === 'development' && app.use(express.errorHandler()); + + server = http.createServer(app) + server.listen(app.get('port'), function () { + console.log('Webhook server listening on port ' + app.get('port')); + }); + + app.get('/', function(req,res){ res.send('hello@vvalls.com') }) + webhook.route(app) +} + +site.init() diff --git a/server/lib/webhook/recurly-config.js b/server/lib/webhook/recurly-config.js new file mode 100644 index 0000000..3d7e1c5 --- /dev/null +++ b/server/lib/webhook/recurly-config.js @@ -0,0 +1,6 @@ +module.exports = { + API_KEY: process.env['VVALLS_RECURLY_SECRET'], + SUBDOMAIN: 'vvalls', + ENVIRONMENT: 'sandbox', + DEBUG: true, +}; diff --git a/server/lib/webhook/webhook.js b/server/lib/webhook/webhook.js new file mode 100644 index 0000000..896d836 --- /dev/null +++ b/server/lib/webhook/webhook.js @@ -0,0 +1,178 @@ +// // 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); + }, +} |
