summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/lib/okpush/apn.js18
-rw-r--r--examples/lib/okpush/db.js69
-rw-r--r--examples/lib/okpush/index.js17
-rw-r--r--examples/lib/okpush/package.json1
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"
}