1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
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()
}
console.log(note, created)
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,
}
|