linagora/openpaas-esn

View on GitHub
modules/linagora.esn.contact/bin/commands/populate.js

Summary

Maintainability
C
7 hrs
Test Coverage
'use strict';

const q = require('q');
const uuidV4 = require('uuid/v4');
const request = require('request');
const ICAL = require('@linagora/ical.js');
const fs = require('fs');
const path = require('path');
const commons = require('../../../../bin/commons');

const DEFAULT_BASE_URL = 'http://localhost:8080';
const DEFAULT_LOGIN = 'admin@open-paas.org';
const DEFAULT_PASSWORD = 'secret';

const command = {
  command: 'populate <type> <size>',
  desc: 'Configure OpenPaaS',
  builder: {
    login: {
      alias: 'l',
      describe: 'User login',
      default: DEFAULT_LOGIN
    },
    password: {
      alias: 'p',
      describe: 'User password',
      default: DEFAULT_PASSWORD
    },
    url: {
      alias: 'u',
      describe: 'ESN base URL',
      default: DEFAULT_BASE_URL
    }
  },
  handler: argv => {
    const { url, login, password, size, type } = argv;

    commons.logInfo(`Calling with user ${login}/${password} on ${url}`);

    exec(url, login, password, size, type)
      .then(() => commons.logInfo('Configured'))
      .catch(commons.logError)
      .finally(commons.exit);
  }
};

function exec(base_url, login, password, size, type) {

  var defer = q.defer();
  var bookId;

  function getRandomContactsFromFile() {
    var defer = q.defer();
    var fileName = size < 1000 ? '100' : '1000';

    var filePath = path.join(__dirname, './data/populate/' + fileName + '.json');

    fs.readFile(filePath, 'utf-8', function(err, data) {
      if (err) {
        return defer.reject(err);
      }

      return defer.resolve(JSON.parse(data).results);
    });

    return defer.promise;
  }

  function getRandomContactsFromWeb() {
    var defer = q.defer();

    request({
      method: 'GET',
      json: true,
      uri: 'http://api.randomuser.me/?nat=fr&results=' + size
    }, function(err, response, body) {
      if (err) {
        return defer.reject(err);
      }

      return defer.resolve(body.results || []);
    });

    return defer.promise;
  }

  var contactGenerators = {
    file: getRandomContactsFromFile,
    web: getRandomContactsFromWeb
  };

  function getRandomContacts() {
    var generator = contactGenerators[type] || contactGenerators.file;

    return generator();
  }

  function shellToVCARD(shell) {
    var vcard = new ICAL.Component('vcard');

    vcard.addPropertyWithValue('version', '4.0');
    vcard.addPropertyWithValue('uid', shell.id);

    if (shell.displayName) {
      vcard.addPropertyWithValue('fn', shell.displayName);
    }

    if (shell.photo) {
      vcard.addPropertyWithValue('photo', shell.photo);
    }

    if (shell.emails) {
      shell.emails.forEach(function(data) {
        var prop = vcard.addPropertyWithValue('email', 'mailto:' + data.value);

        prop.setParameter('type', data.type);
      });
    }

    if (shell.lastName || shell.firstName) {
      vcard.addPropertyWithValue('n', [shell.lastName || '', shell.firstName || '']);
    }

    return vcard;
  }

  function sendContact(user, shell) {
    bookId = bookId || user._id;

    var path = '/dav/api/addressbooks/' + bookId + '/contacts/' + shell.id + '.vcf';
    var json = shellToVCARD(shell).toJSON();
    var defer = q.defer();

    commons.logInfo(`Creating contact on path ${path}...`);

    request({
      uri: base_url + path,
      jar: true,
      method: 'PUT',
      headers: {
        'Content-Type': 'application/vcard+json'
      },
      json: true,
      body: json
    }, function(err, response, body) {
      if (err) {
        return defer.reject(err);
      }

      commons.logInfo(`${shell.id} created`);

      return defer.resolve(body);
    });

    return defer.promise;
  }

  function createContact(user, contact) {

    function capitalize(str) {
      return str.toLowerCase().replace(/\b\w/g, function(m) {
        return m.toUpperCase();
      });
    }

    var u = contact.user;
    var first = capitalize(u.name.first);
    var last = capitalize(u.name.last);
    var shell = {
      id: uuidV4(),
      displayName: first + ' ' + last,
      lastName: last,
      firstName: first,
      emails: [{type: 'work', value: u.email}],
      phone: [{type: 'mobile', value: u.cell}, {type: 'work', value: u.phone}],
      photo: u.picture.medium
    };

    return sendContact(user, shell);
  }

  function createContacts(user) {
    return getRandomContacts().then(function(contacts) {
      return q.all(contacts.map(function(contact) {
        return createContact(user, contact);
      }));
    });
  }

  commons.loginAsUser(base_url, login, password, function(err, user) {
    if (err) {
      commons.logError('Login error');

      return defer.reject(err);
    }

    commons.logInfo('Logged in as', user);

    return createContacts(user).then(function(results) {
      commons.logInfo('Contacts have been created', results.length);
      defer.resolve();
    }, function(err) {
      commons.logError(err);
      defer.reject(err);
    });
  });

  return defer.promise;
}

module.exports = {
  exec,
  command
};