linagora/openpaas-esn

View on GitHub
modules/linagora.esn.davproxy/backend/webserver/addressbooks/avatarHelper.js

Summary

Maintainability
A
3 hrs
Test Coverage
'use strict';

var ICAL = require('@linagora/ical.js');
var q = require('q');

module.exports = function(dependencies) {

  var logger = dependencies('logger');
  var configHelpers = dependencies('helpers').config;

  function buildTextAvatarUrl(baseUrl, addressBookId, addressbookName, contactId) {
    return [
      baseUrl,
      'contact/api/contacts',
      addressBookId,
      addressbookName,
      contactId,
      'avatar'
    ].join('/');
  }

  function getTextAvatarUrl(user, addressBookId, addressbookName, contactId) {
    var deferred = q.defer();

    configHelpers.getBaseUrl(user, function(err, baseUrl) {
      if (err) {
        return deferred.reject(err);
      }

      deferred.resolve(buildTextAvatarUrl(baseUrl, addressBookId, addressbookName, contactId));
    });

    return deferred.promise;
  }

  /**
   * Inject text avatar if there's no avatar in the vcard contact data. Note
   * that this will always resolve promise, if it gets getTextAvatarUrl rejected,
   * the original vcardData will be resolved.
   *
   * @param  {Object} user
   * @param  {String} addressBookId Address book ID
   * @param  {String} addressBookName Address book name
   * @param  {Object} vcardData     vcard data in json
   * @return {Promise}              resolve vcard with avatar injected or the
   *                                  original vcard if the contact has avatar already.
   */
  function injectTextAvatar(user, addressBookId, addressbookName, vcardData) {
    try {
      var vcard = new ICAL.Component(vcardData);

      if (!vcard.getFirstPropertyValue('photo')) {
        var contactId = vcard.getFirstPropertyValue('uid');

        return getTextAvatarUrl(user, addressBookId, addressbookName, contactId)
          .then(function(avatarUrl) {
            vcard.addPropertyWithValue('photo', avatarUrl);
            return vcard.toJSON();
          }, function(err) {
            logger.warn('Failed to inject text avatar:', err);
            return vcardData;
          });
      }
    } catch (err) {
      logger.warn('Failed to inject text avatar:', err);
    }

    return q.resolve(vcardData);

  }

  /**
   * Remove text avatar url from vcard data of contact. This is a workaround
   * to prevent frontend from accidentally insert text avatar to the database.
   *
   * @param  {Object} vcardData
   * @return {Object}
   */
  function removeTextAvatar(vcardData) {
    try {
      var vcard = new ICAL.Component(vcardData);
      var avatarUrl = vcard.getFirstPropertyValue('photo');

      if (avatarUrl && avatarUrl.match(/\/contact\/api\/contacts\/.*?\/avatar/)) {
        vcard.removeProperty('photo');
        return vcard.toJSON();
      }
    } catch (err) {
      logger.warn('Failed to remove text avatar:', err);
    }

    return vcardData;
  }

  return {
    injectTextAvatar: injectTextAvatar,
    removeTextAvatar: removeTextAvatar
  };
};