API Docs for:
Show:

File: src/push-manager.coffee

###*
managing push notification.
Currently supports only for loopback servers build by [loopback-with-domain](https://github.com/cureapp/loopback-with-domain)

@class PushManager
###
class PushManager


    ###*
    @constructor
    @param {LoopbackPromised} lbPromised
    @param {String} accessToken
    @param {Boolean} debug
    ###
    constructor: (lbPromised, accessToken, debug, @appId) ->

        @pushClient = lbPromised.createClient('push', accessToken: accessToken, debug: debug)
        @installationClient = lbPromised.createClient('installation', accessToken: accessToken, debug: debug)
        @appId ?= 'loopback-with-admin'


    ###*
    start subscribing push notification

    @method subscribe
    @param {String} userId
    @param {String} deviceToken
    @param {String} deviceType (ios|android)
    @return {Promise}
    ###
    subscribe: (userId, deviceToken, deviceType) ->

        # if the deviceToken already used, delete the existing one
        @installationClient.find(where: deviceToken: deviceToken, deviceType: deviceType).then (installations) =>

            promises = (@installationClient.destroyById(ins.id) for ins in installations)

            return Promise.all promises

        .then =>
            # override userId if exists
            @installationClient.findOne(where: userId: userId).then (installation) =>

               installation ?= userId: userId

               installation.deviceType  = deviceType
               installation.deviceToken = deviceToken
               installation.appId       = @appId

               @installationClient.upsert(installation)


    ###*
    unsubcribe push notification

    @method unsubcribe
    @param {String} userId
    @return {Promise}
    ###
    unsubscribe: (userId) ->

        @installationClient.find(where: userId: userId).then (installations) =>

            promises = (@installationClient.destroyById(ins.id) for ins in installations)

            return Promise.all promises


    ###*
    send push notification

        notification =
            alert: 'hello, world!'
            sound: 'default.aiff'
            badge: 1

    @param {String} userId
    @param {Object} notification
    @return {Promise}

    ###
    notify: (userId, notification = {}) ->

        @pushClient.request("?deviceQuery[userId]=#{userId}", notification, 'POST')


module.exports = PushManager