Source: notifications/notifications.js

/**
 * Copyright© 2016, Oracle and/or its affiliates. All rights reserved.
 */

//Must install phonegap-push, or any notification plugin to get deviceToken for that particular OS.


var NOTIFICATION_PROVIDERS = {
  GCM: 'GCM',
  FCM: 'FCM',
  APNS: 'APNS'
};

var PLATFORM_ID = {
  ANDROID: 'Android',
  IOS: 'ios'
};

/**
 * Class that provides notification capabilities. Callers should use
 * MobileBackend's [Notifications()]{@link MobileBackend#Notifications} property.
 * @constructor
 * @global
 */
function Notifications(backend, utils, platform, logger) {

  var _backend = backend;
  var notifications = this;

  /**
   * Returns a string with device information used by [Notifications]{@link Notifications}
   * @returns {String} The device specific information for platform.
   * @example : "IOS,ANDROID"
   */
  this.getDevicePlatform = function() {
    var platform = 'null';
    if(typeof device !== 'undefined'){
      platform = device.platform;
    } else if(navigator.userAgent.match(/Android/i)){
      platform = PLATFORM_ID.ANDROID;
    } else if(navigator.userAgent.match(/iPad/i) ||
              navigator.userAgent.match(/iPod/i) ||
              navigator.userAgent.match(/iPhone/i)){
      platform = PLATFORM_ID.IOS;
    }
    return platform.toUpperCase();
  };

  /**
   * Registers the current Cordova app running on the device for receiving push notifications.
   * @param deviceToken {String} Platform-specific device token.
   * @example deviceToken: "AxdkfjfDfkfkfkfjfFdjfjjf=", deviceToken is sent from device.
   * @param appId {String} Platform-specific application reverse domain identifier.
   * @example appId: "com.yourcompany.project"
   * @param appVersion {String} Platform-specific application version..
   * @example appVersion: "1.0.2"
   * @param notificationProvider {String}
   * @param [successCallback] {Notifications~successCallback} Optional callback invoked on success (deprecated).
   * @param [errorCallback] {Notifications~errorCallback} Optional callback invoked on failure (deprecated).
   * @return {Promise.<NetworkResponse|NetworkResponse>}
   *
   * @example <caption>Example usage of mcs.MobileBackend.getNotifications().registerForNotifications()</caption>
   mcs.MobileBackend.getNotifications()
   .registerForNotifications("YOUR_DEVICE_TOKEN", "com.oracle.mobile.cloud.OMCPushNotifications", "1.0.0")
   .then(registerSuccess, registerError);
   function registerSuccess(response){
      console.log(response.statusCode);// returns statusCode for this function.
    }
   function registerError(response){

    }
   */
  this.registerForNotifications = function(deviceToken, appId, appVersion, notificationProvider, successCallback, errorCallback) {
    var platformName = this.getDevicePlatform();
    if(!(notificationProvider in NOTIFICATION_PROVIDERS)){
      throw Error('No Notification Provider Type called ' + notificationProvider + '\n' +
        'please use one of those types\n' +
        NOTIFICATION_PROVIDERS.APNS + '\n' +
        NOTIFICATION_PROVIDERS.FCM + '\n' +
        NOTIFICATION_PROVIDERS.GCM);
    }
    if(notificationProvider === NOTIFICATION_PROVIDERS.APNS && platformName !== PLATFORM_ID.IOS){
      throw Error('Notification Provider Type APNS can be used only on IOS platform');
    }
    if(platformName === PLATFORM_ID.IOS && notificationProvider !== NOTIFICATION_PROVIDERS.APNS){
      throw Error('On IOS platform can be used only APNS Notification Provider Type');
    }

    var headers = _backend.getHttpHeaders(utils.MODULE_NAMES.NOTIFICATIONS);
    headers[utils.HEADERS.CONTENT_TYPE] = utils.ACCEPT_TYPES.APPLICATION_JSON;

    var payload = getPayload(deviceToken, appId, notificationProvider, appVersion);

    return platform.invokeService({
      method: utils.HTTP_METHODS.POST,
      url: _backend.getPlatformUrl('devices/register'),
      headers: headers,
      data: JSON.stringify(payload)
    }).then(invokeServiceSuccess,invokeServiceError);

    function invokeServiceSuccess(response) {
      logger.info(  'Device registered for push notifications. ' + response.statusCode);

      if (successCallback) {
        successCallback(response.statusCode);
      }
      return response;
    }

    function invokeServiceError(response) {
      logger.error('Device registration for push notifications failed! ' + response.statusCode + ':' + JSON.stringify(response));

      if(errorCallback) {
        errorCallback(response.statusCode, response.data);
      } else {
        return Promise.reject(response);
      }
    }
  };

  /**
   * Deregisters the current Cordova app running on the device for receiving push notifications.
   * @param deviceToken {String} Platform-specific successCallback token.
   * @example deviceToken: "AxdkfjfDfkfkfkfjfFdjfjjf=", deviceToken is sent from device.
   * @param appId {String} Platform-specific application reverse domain identifier.
   * @example appId: "com.yourcompany.project"
   * @param [successCallback] {Notifications~successCallback} Optional callback invoked on success (deprecated use promises instead).
   * @param [errorCallback] {Notifications~errorCallback} Optional callback invoked on failure (deprecated use promises instead).
   * @return {Promise.<NetworkResponse|NetworkResponse>}
   *
   * @example <caption>Example usage of mcs.MobileBackend.getNotifications().deregisterForNotifications()</caption>
   mcs.MobileBackend.getNotifications()
   .deregisterForNotifications("YOUR_DEVICE_TOKEN", "com.oracle.mobile.cloud.OMCPushNotifications", "1.0.0")
   .then(deregisterSuccess, deregisterError);
   function deregisterSuccess(response){
        console.log(response.statusCode);// returns statusCode for this function.
      }
   function deregisterError(response){

    }
   */
  this.deregisterForNotifications = function(deviceToken, appId, successCallback, errorCallback) {
    var headers = _backend.getHttpHeaders(utils.MODULE_NAMES.NOTIFICATIONS);
    headers[utils.HEADERS.CONTENT_TYPE] = utils.ACCEPT_TYPES.APPLICATION_JSON;

    var payload = getPayload(deviceToken, appId);

    return platform.invokeService({
      method: utils.HTTP_METHODS.POST,
      url: _backend.getPlatformUrl('devices/deregister'),
      headers: headers,
      data: JSON.stringify(payload)
    }).then(invokeServiceSuccess,invokeServiceError);

    function invokeServiceSuccess(response) {
      logger.info('Device deregistered for push notifications succeeded. ' + response.statusCode);

      if (successCallback) {
        successCallback(response.statusCode);
      }
      return response;
    }

    function invokeServiceError(response) {
      logger.error('Device deregistration for push notifications failed! ' + response.statusCode);

      if(errorCallback) {
        errorCallback(response.statusCode, response.data);
      } else {
        return Promise.reject(response);
      }
    }
  };

  function getPayload(deviceToken, appId, notificationProvider, appVersion){
    var _platform = notifications.getDevicePlatform();
    var payload = {
      'notificationToken': deviceToken,
      'mobileClient': {
        'id': appId,
        'platform': _platform
      }
    };
    if(notificationProvider) {
      payload.notificationProvider = notificationProvider;
    }
    if(appVersion) {
      payload.mobileClient.version = appVersion;
    }
    return payload;
  }
}