diff options
| author | Jules Laplace <jules@okfoc.us> | 2016-10-06 13:20:23 -0400 |
|---|---|---|
| committer | Jules Laplace <jules@okfoc.us> | 2016-10-06 13:20:23 -0400 |
| commit | f8bbee2634329595711d33ae82923f23a3ddb7fc (patch) | |
| tree | 50aedcdc2006eda324b59f8eaeb831fc13fd6eac /examples | |
| parent | ef2cfac2c055cdfa3958374c68a8d0cfe4e4f046 (diff) | |
store notification last update in db
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/lib/okpush/apn.js | 18 | ||||
| -rw-r--r-- | examples/lib/okpush/db.js | 69 | ||||
| -rw-r--r-- | examples/lib/okpush/index.js | 17 | ||||
| -rw-r--r-- | examples/lib/okpush/package.json | 1 |
4 files changed, 82 insertions, 23 deletions
diff --git a/examples/lib/okpush/apn.js b/examples/lib/okpush/apn.js index 5e13e15..b6909f6 100644 --- a/examples/lib/okpush/apn.js +++ b/examples/lib/okpush/apn.js @@ -9,17 +9,21 @@ function init (config) { apnProvider = new apn.Provider(config.apn.connection) } -function push (tokens, note) { - tokens.forEach(function(token){ - connection.send(note, token).then( function (response) { - response.sent.forEach( function (token) { - // notificationSent(user, token) - }) +function push (note) { + db.getAllDevices(function(err, tokens){ + if (err) { + console.error("Error fetching devices:", err) + return + } + connection.send(note, tokens).then( function (response) { + // response.sent.forEach( function (token) { + // notificationSent(user, token) + // }) response.failed.forEach( function (failure) { if (failure.error) { // A transport-level error occurred (e.g. network problem) // notificationError(user, token, failure.error); - } else { + } else if (failure.status == 410) { // `failure.status` is the HTTP status code // `failure.response` is the JSON payload // notificationFailed(token, failure.status, failure.response); diff --git a/examples/lib/okpush/db.js b/examples/lib/okpush/db.js index 67d1ba8..7727825 100644 --- a/examples/lib/okpush/db.js +++ b/examples/lib/okpush/db.js @@ -1,4 +1,5 @@ var mongoose = require('mongoose') +var findOrCreate = require('mongoose-findorcreate') var _ = require('lodash') var db, PushToken @@ -19,19 +20,35 @@ function init (config) { } }) + var notificationSchema = new db.Schema({ + key: { + type: 'String', + required: true, + lowercase: true, + }, + last_fired: { + type: 'Date', + required: true, + } + }) + notificationSchema.plugin(findOrCreate); + PushToken = db.model('PushToken', pushTokenSchema) + Notification = db.model('Notification', notificationSchema) } function errorHandler (error) { console.error('ERROR: ' + error) } -function add (deviceType, token) { + +/* devices / tokens */ + +function addDevice (deviceType, token) { var pushItem = new PushToken({ type: deviceType, token: token }) pushItem.save() } -function getAll (cb) { - var wcb = wrap(cb) - PushToken.find(wcb) +function getAllDevices (cb) { + PushToken.find( wrapDeviceCallback(cb) ) } function removeDevice () { PushToken.remove({token: token}, function (err) { @@ -43,7 +60,32 @@ function removeDevices (tokens) { if (err) console.log(err) }) } -function wrap (cb) { + +/* notifications */ + +function updateNotification (key, cb) { + var now = new Date + Notification.findOrCreate({key: key}, {last_fired: now}, function(err, note, created){ + if (err) { + console.error("Error finding/creating notification", err) + cb(err, false) + return + } + else if (! created) { + note.last_fired = now + note.save() + cb(null, note) + } + cb(null, note) + }) +} +function getAllNotifications (cb) { + Notification.find( wrapNotificationCallback(cb) ) +} + +/* wrap functions for some reason */ + +function wrapDeviceCallback (cb) { return function (err, items) { if (err) return cb(err, null) @@ -54,10 +96,23 @@ function wrap (cb) { return callback(null, items) } } +function wrapNotificationCallback (cb) { + return function (err, items) { + if (err) return cb(err, null) + + var items = _.map(items, function (item) { + return _.pick(item, ['key', 'last_fired']) + }) + + return callback(null, items) + } +} module.exports = { init: init, - add: add, - getAll: getAll, + addDevice: addDevice, + getAllDevices: getAllDevices, removeDevice: removeDevice, removeDevices: removeDevices, + updateNotification: updateNotification, + getAllNotifications: getAllNotifications, }
\ No newline at end of file diff --git a/examples/lib/okpush/index.js b/examples/lib/okpush/index.js index a39cd35..d77eb8a 100644 --- a/examples/lib/okpush/index.js +++ b/examples/lib/okpush/index.js @@ -8,8 +8,7 @@ var OKTemplate = require('../../../app/node_modules/oktemplate') var apn = require('./apn') var db = require('./db') -passport.use(new DigestStrategy({qop: 'auth'}, - function authenticate(username, done) { +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 { @@ -52,12 +51,6 @@ function OKPush (options) { // session: false // })) - var notifications = {} - Object.keys(options.config.notifications).forEach(function(key){ - var opt = options.config.notifications[key] - var note = apn.buildPayload(opt, options.config.bundleId) - }) - // pass in admin middleware! router.get('/admin/', function (req, res) { var data = { @@ -70,7 +63,13 @@ function OKPush (options) { }) router.post('/send', function (req, res) { - // add a key + var key = req.body.key + var opt = options.config.notifications[key] + var note = apn.buildPayload(opt, options.config.bundleId) + // apn.push(note) + db.updateNotification(key, function(){ + res.send(200) + }) }) // should work without middleware diff --git a/examples/lib/okpush/package.json b/examples/lib/okpush/package.json index b5a52c7..7553616 100644 --- a/examples/lib/okpush/package.json +++ b/examples/lib/okpush/package.json @@ -12,6 +12,7 @@ "apn": "^2.1.1", "lodash": "^4.16.3", "mongoose": "^4.6.2", + "mongoose-findorcreate": "^0.1.2", "passport": "^0.3.2", "passport-http": "^0.3.0" } |
