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
125
126
127
|
var mongoose = require('mongoose')
var findOrCreate = require('mongoose-findorcreate')
var _ = require('lodash')
var db, PushToken, Notification, Channel
mongoose.Promise = require('bluebird')
function init (config) {
db = mongoose.connect(config.mongodbUrl)
mongoose.connection.on('error', errorHandler)
var pushTokenSchema = new db.Schema({
platform: {
type: 'String',
required: true,
lowercase: true,
enum: ['ios', 'android'],
},
token: {
type: 'String',
required: true,
},
channel: {
type: 'String',
required: true,
},
})
var channelSchema = new db.Schema({
channel: {
type: 'String',
required: true,
lowercase: true,
},
last_push: {
type: 'Date',
required: true,
}
})
channelSchema.plugin(findOrCreate);
var notificationSchema = new db.Schema({
channel: {
type: 'String',
required: true,
lowercase: true,
},
date: {
type: 'Date',
required: true,
}
})
PushToken = db.model('PushToken', pushTokenSchema)
Notification = db.model('Notification', notificationSchema)
Channel = db.model('Channel', channelSchema)
}
function errorHandler (error) {
console.error('ERROR: ' + error)
}
/* devices / tokens */
function addToken (data) {
return new PushToken(data).save()
}
function getAllTokens (channel, cb) {
PushToken.find({ channel: channel }, 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 removeToken (data) {
PushToken.find(data).remove().exec()
}
function getDeviceCount (channel, cb) {
PushToken.count({ channel: channel }, cb)
}
/* notifications */
function addNotification (channel, cb) {
var now = new Date
Channel.findOrCreate({channel: channel}, {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)
})
new Notification ({
channel: channel,
date: now,
}).save()
}
function getNotifications (cb) {
Notification.find(function (err, items) {
if (err) return cb(err, null)
var items = _.map(items, function (item) {
return _.pick(item, ['channel', 'last_push'])
})
return cb(null, items)
})
}
/* wrap functions for some reason */
module.exports = {
init: init,
addToken: addToken,
removeToken: removeToken,
getAllTokens: getAllTokens,
getDeviceCount: getDeviceCount,
addNotification: addNotification,
getNotifications: getNotifications,
}
|