pad.js

Generated by CoffeeScript 1.9.1

(function() {
  module.exports = (function() {
    var GPREFIX, PPREFIX, UPREFIX, common, cuid, ld, pad, storage;
    ld = require('lodash');
    cuid = require('cuid');
    common = require('./common.js');
    storage = require('../storage.js');
    PPREFIX = storage.DBPREFIX.PAD;
    UPREFIX = storage.DBPREFIX.USER;
    GPREFIX = storage.DBPREFIX.GROUP;
    pad = {};
    pad.fn = {};
    pad.fn.assignProps = function(params) {
      var isValidVisib, p, u, v, vVal;
      p = params;
      u = {
        name: p.name,
        group: p.group
      };
      if (p.visibility === 'restricted' && ld.isArray(p.users)) {
        u.users = ld.filter(p.users, ld.isString);
      } else {
        u.users = [];
      }
      vVal = ['restricted', 'private', 'public'];
      v = p.visibility;
      isValidVisib = ld.isString(v) && ld.includes(vVal, v);
      u.visibility = isValidVisib ? v : null;
      u.password = ld.isString(p.password) ? p.password : null;
      u.readonly = ld.isBoolean(p.readonly) ? p.readonly : null;
      return u;
    };
    pad.fn.checkSet = function(p, callback) {
      var keys;
      keys = ld.map(p.users, function(v) {
        return UPREFIX + v;
      });
      keys.push(GPREFIX + p.group);
      return common.checkMultiExist(keys, function(err, res) {
        var e;
        if (err) {
          return callback(err);
        }
        e = 'pad group or at least one of the users are not found';
        if (!res) {
          return callback(new Error(e));
        }
        return pad.fn.set(p, callback);
      });
    };
    pad.fn.indexGroups = function(del, pad, callback) {
      var _set;
      _set = function(g) {
        return storage.db.set(GPREFIX + g._id, g, function(err) {
          if (err) {
            return callback(err);
          }
          return callback(null);
        });
      };
      return storage.db.get(GPREFIX + pad.group, function(err, g) {
        if (err) {
          return callback(err);
        }
        if (del) {
          ld.pull(g.pads, pad._id);
          return _set(g);
        } else {
          if (!ld.includes(g.pads, pad._id)) {
            g.pads.push(pad._id);
            return _set(g);
          } else {
            return callback(null);
          }
        }
      });
    };
    pad.fn.set = function(p, callback) {
      return storage.db.set(PPREFIX + p._id, p, function(err) {
        if (err) {
          return callback(err);
        }
        return pad.fn.indexGroups(false, p, function(err) {
          if (err) {
            return callback(err);
          }
          return callback(null, p);
        });
      });
    };
    pad.get = ld.partial(common.getDel, false, PPREFIX);
    pad.set = function(params, callback) {
      var p;
      common.addSetInit(params, callback, ['name', 'group']);
      p = pad.fn.assignProps(params);
      if (params._id) {
        p._id = params._id;
        return common.checkExistence(PPREFIX + p._id, function(err, res) {
          if (err) {
            return callback(err);
          }
          if (!res) {
            return callback(new Error('pad does not exist'));
          }
          return pad.fn.checkSet(p, callback);
        });
      } else {
        p._id = cuid();
        return pad.fn.checkSet(p, callback);
      }
    };
    pad.del = function(key, callback) {
      if (!ld.isFunction(callback)) {
        throw new TypeError('callback must be a function');
      }
      return common.getDel(true, PPREFIX, key, function(err, p) {
        if (err) {
          return callback(err);
        }
        return pad.fn.indexGroups(true, p, callback);
      });
    };
    return pad;
  })();

}).call(this);