var mongoose = require('mongoose') var findOrCreate = require('mongoose-findorcreate') var _ = require('lodash') var db, PushToken mongoose.Promise = require('bluebird') 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_push: { 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) { PushToken.remove({token: {$in: tokens}}, function (err) { if (err) console.log(err) }) } function getDeviceCount (cb) { PushToken.count({}, cb); } /* notifications */ function updateNotification (key, cb) { var now = new Date Notification.findOrCreate({key: key}, {last_push: now}, function(err, note, created) { if (err) { console.error("Error finding/creating notification", err) cb(err, false) return } else if (! created) { note.last_push = now note.save() } cb(null, note) }) } function getNotifications (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 cb(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_push']) }) return cb(null, items) } } module.exports = { init: init, addDevice: addDevice, getAllDevices: getAllDevices, removeDevice: removeDevice, removeDevices: removeDevices, getDeviceCount: getDeviceCount, updateNotification: updateNotification, getNotifications: getNotifications, }