var mongoose = require('mongoose') var findOrCreate = require('mongoose-findorcreate') var _ = require('lodash') var db, PushToken function init (config) { db = mongoose.connect(config.mongodbUrl) mongoose.connection.on('error', errorHandler) var pushTokenSchema = new db.Schema({ type: { type: 'String', required: true, enum: ['ios', 'android'], lowercase: true, }, token: { type: 'String', required: true, } }) 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) } /* devices / tokens */ function addDevice (deviceType, token) { var pushItem = new PushToken({ type: deviceType, token: token }) pushItem.save() } function getAllDevices (cb) { PushToken.find( wrapDeviceCallback(cb) ) } function removeDevice () { PushToken.remove({token: token}, function (err) { if (err) console.log(err) }) } function removeDevices (tokens) { PushAssociation.remove({token: {$in: tokens}}, function (err) { if (err) console.log(err) }) } /* 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) var items = _.map(items, function (item) { return _.pick(item, ['type', 'token']) }) 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, addDevice: addDevice, getAllDevices: getAllDevices, removeDevice: removeDevice, removeDevices: removeDevices, updateNotification: updateNotification, getAllNotifications: getAllNotifications, }