summaryrefslogtreecommitdiff
path: root/examples/lib/okpush/db.js
blob: 75beb65882fdb98ec3d336aa649c3293364347c5 (plain)
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
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_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) {
  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_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)
    }
    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,
  updateNotification: updateNotification,
  getNotifications: getNotifications,
}