FunnelEnvy/optimizely-cli

View on GitHub
lib/variation.js

Summary

Maintainability
C
1 day
Test Coverage
var util = require('util');
var path = require('path');
var _ = require("lodash");
var ejs = require("ejs");

var fileUtil = require("./file-util");
var logger = require("./logger");
var readConfig = require("./read-config");
var OptimizelyClient = require("optimizely-node-client");
var OptCLIBase = require("./optcli-base");
var Assets = require('./assets');
var Files = require('./files');

function Variation(attributes, baseDir) {
  Variation.super_.call(this, attributes, baseDir);
}

Variation.JSON_FILE_NAME = "variation.json";
Variation.JS_FILE_NAME = "variation.js";

util.inherits(Variation, OptCLIBase);

Variation.create = function(attrs, baseDir) {
  //create directory
  fileUtil.writeDir(baseDir);
  fileUtil.writeText(path.join(baseDir, Variation.JS_FILE_NAME));
  fileUtil.writeJSON(path.join(baseDir, Variation.JSON_FILE_NAME), attrs);
  return new Variation(attrs, baseDir);
}

Variation.prototype.getJSPath = function() {
  return this.getFilePath(Variation.JS_FILE_NAME);
}

Variation.prototype.getJS = function() {
  return fileUtil.loadFile(this.getJSPath()) || "";
}

Variation.prototype.createRemote = function(client, remote) {
  //assume assets are in experiment.baseDir
  var assets = new Assets({}, path.normalize(this.baseDir + "/.."));
  if (assets.JSONFileExists()) {
    logger.log("info", "assets file found, loading");
    assets.loadFromFile();
  }
  
  //get any available file data
  //pass in assets in case any of the files use additional EJS
  var files = new Files({}, path.normalize(this.baseDir + "/.."), assets);
  if (files.filenames.length) {
    logger.log("info", 'Loading the following external files: "' + files.filenames.join('" "') + '"');
  }

  //create new variation
  var varArgs = _.clone(this.attributes);
  varArgs['js_component'] = String(ejs.render(this.getJS(), {
    locals: {
      assets: assets.attributes,
      files: files.data
    }
  }));
  varArgs['experiment_id'] = experiment.attributes.id;

  var self = this;
  return client.createVariation(varArgs).then(function(variationAttrs) {
    //update the id
    self.attributes.id = variationAttrs.id;
    self.saveAttributes();
    logger.log("info", "created remote variation: " + variationAttrs.id);
  }, function(error) {
    logger.log("error", error);
    logger.log("error", "unable to create remote variation: " + e.message);
    console.error(e.stack);
  });
}

Variation.prototype.updateRemote = function(client) {
  //assume assets are in experiment.baseDir
  var assets = new Assets({}, path.normalize(this.baseDir + "/.."));
  if (assets.JSONFileExists()) {
    logger.log("info", "assets file found, loading");
    assets.loadFromFile();
  }
  
  //get any available file data
  //pass in assets in case any of the files use additional EJS
  var files = new Files({}, path.normalize(this.baseDir + "/.."), assets);
  if (files.filenames.length) {
    logger.log("info", 'Loading the following external files: "' + files.filenames.join('" "') + '"');
  }
  
  var varArgs = _.clone(this.attributes);
  varArgs['js_component'] = String(ejs.render(this.getJS(), {
    locals: {
      assets: assets.attributes,
      files: files.data
    }
  }));

  var self = this;
  return client.updateVariation(varArgs).then(function(variationAttrs) {
    logger.log("info", "updated remote variation: " + variationAttrs.id);
  }, function(error) {
    logger.log("error", error);
  }).catch(function(e) {
    logger.log("error", "unable to update remote variation: " + e.message);
    console.error(e.stack);
  });
}

Variation.prototype.saveAttributes = function() {
  fileUtil.writeJSON(path.join(this.baseDir, Variation.JSON_FILE_NAME), this.attributes);
}

module.exports = Variation;