linagora/openpaas-esn

View on GitHub
modules/linagora.esn.digest.daily/lib/tracker.js

Summary

Maintainability
B
4 hrs
Test Coverage
'use strict';

var q = require('q');
var helpers = require('./helpers');

module.exports = function(dependencies) {

  var logger = dependencies('logger');
  var activitystreamsModule = dependencies('activitystreams');
  var tracker = activitystreamsModule.tracker;
  var pushTracker = tracker.getTracker('push');

  function _resolve(data) {
    return q.resolve(data);
  }

  function getLastTimelineEntry(messages, activitystream) {
    if (!messages || messages.length === 0) {
      return _resolve();
    }

    if (!activitystream) {
      return _resolve();
    }

    var mostRecent = helpers.getMostRecentMessage(messages);
    if (!mostRecent) {
      return _resolve();
    }

    return q.denodeify(activitystreamsModule.getTimelineEntryFromStreamMessage)(activitystream, mostRecent);
  }

  function updateTracker(user, data) {

    if (!user) {
      return q.reject(new Error('User is required'));
    }

    if (!data) {
      return q.reject(new Error('Data is required'));
    }

    logger.info('Updating push tracker for user %s %s', user._id.toString(), user.emails[0]);

    var updateLastTimelineEntry = q.denodeify(pushTracker.updateLastTimelineEntry);

    function resolved() {
      return _resolve(data);
    }

    var updates = data.map(function(element) {
      var stream = element.collaboration.activity_stream;

      logger.debug('Updating tracker on stream %s for user %s', stream.uuid, user._id.toString());
      return getLastTimelineEntry(element.messages, stream).then(
        function(lastEntry) {
          if (!lastEntry) {
            logger.debug('Can not find the last timelineentry on stream %s for user %s', stream.uuid, user._id.toString());
            return resolved();
          }

          return updateLastTimelineEntry(user._id, stream.uuid, lastEntry).then(resolved, resolved);
        },
        function(err) {
          logger.debug('Error while getting last timeline entry on stream %s for user %s', stream.uuid, user._id.toString(), err);
          return resolved();
        }
      );
    });

    return q.all(updates);
  }

  return {
    updateTracker: updateTracker
  };
};