diff options
Diffstat (limited to 'lib/okpush/index.js')
| -rw-r--r-- | lib/okpush/index.js | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/lib/okpush/index.js b/lib/okpush/index.js new file mode 100644 index 0000000..36588aa --- /dev/null +++ b/lib/okpush/index.js @@ -0,0 +1,136 @@ +/** + * OKPush - Handles basic broadcast push notifications, as well as keeping track of tokens. + */ + +var path = require('path') +var passport = require('passport') +var DigestStrategy = require('passport-http').DigestStrategy; +var bodyParser = require('body-parser') +var OKTemplate = require('../../node_modules/okcms/app/node_modules/oktemplate') +var apn = require('./apn') +var db = require('./db') + +passport.use(new DigestStrategy({qop: 'auth'}, function authenticate(username, done) { + if (!process.env.OK_USER || !process.env.OK_PASS) { + return done(new Error('No user or pass configured on server')) + } else { + return done(null, process.env.OK_USER, process.env.OK_PASS) + } +})) + +function OKPush (options) { + if (!(this instanceof OKPush)) return new OKPush(options) + options = options || {} + if (!options.express) + throw new Error('Express not provided to OKPush') + if (!options.config) + throw new Error('Configuration not provided to OKPush') + if (!options.config.notifications) + throw new Error('Notifications not provided to OKPush') + if (!options.config.bundleId) + throw new Error('bundleId not provided to OKPush') + if (!options.config.mongodbUrl) + throw new Error('mongodbUrl not provided to OKPush') + + var express = options.express + var router = express.Router() + var config = options.config + var meta = options.meta + var error = options.errorHandler + // var okcms_db = options.db + + var templateProvider = this._templateProvider = new OKTemplate({ + root: path.join(__dirname, './templates'), + debug: meta.debug + }) + + var templates = {} + templates['index'] = templateProvider.getTemplate('index') + + apn.init(config) + db.init(config) + + router.use('/admin/', passport.initialize()) + router.use('/public/', express.static(path.join(__dirname, './public'))); + + // monkeypatch because of app.use(router) .. obnoxious + router.all('/admin/(:path*)?', function (req, res, next) { + console.log(req.url) + req.newUrl = req.url + req.url = req.originalUrl + next() + }) + router.all('/admin/(:path*)?', passport.authenticate('digest', { + session: false + })) + router.all('/admin/(:path*)?', function (req, res, next) { + req.url = req.newUrl + next() + }) + + // pass in admin middleware! + router.get('/admin', function (req, res) { + db.getNotifications(function(err, notes){ + var channels = Object.keys(config.notifications) + db.getDeviceCount(channels, function(count){ + var data = { + meta: meta, + notifications: config.notifications, + } + notes.forEach(function(note){ + if (note.key in data.notifications) { + data.notifications[ note.key ].last_push = note.last_push + } + }) + Object.keys(count).forEach(function(key){ + data.notifications[ key ].count = count[key] + }) + templates['index'].render(data).then(function(rendered) { + res.send(rendered); + }).fail(error(req, res, 500)) + }) + }) + }) + + router.get('/list', function(req, res){ + db.getAllTokens("hub", function(err, hubz){ + res.json(hubz) + }) + }) + + router.post('/send', bodyParser.urlencoded({ extended: false }), function (req, res) { + var channel = req.body.channel + var opt = options.config.notifications[channel] + var note = apn.buildPayload(opt, options.config.bundleId) + apn.push(channel, note) + db.addNotification(channel, function(){ + res.sendStatus(200) + }) + }) + + // should work without middleware + router.post('/add', bodyParser.urlencoded({ extended: false }), function (req, res) { + db.addToken({ + token: req.body.registrationId, + channel: req.body.channel, + platform: req.body.platform, + }) + res.sendStatus(200) + }) + + router.post('/remove', bodyParser.urlencoded({ extended: false }), function (req, res) { + db.removeToken({ + token: req.body.registrationId, + channel: req.body.channel, + }) + res.sendStatus(200) + }) + + this._router = router +} + +OKPush.prototype.middleware = function () { + return this._router +} + +module.exports = OKPush |
