clannad
Version:
data storage service with RESTful APIs.
254 lines (213 loc) • 8.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _typeof2 = require('babel-runtime/helpers/typeof');
var _typeof3 = _interopRequireDefault(_typeof2);
var _mongoose = require('mongoose');
var _resterror = require('./resterror');
var _resterror2 = _interopRequireDefault(_resterror);
var _mongooseUniqueValidator = require('mongoose-unique-validator');
var _mongooseUniqueValidator2 = _interopRequireDefault(_mongooseUniqueValidator);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var parseJson = function parseJson(str) {
return str ? JSON.parse(str) : str;
};
var parseObjectId = function parseObjectId(obj) {
switch (typeof obj === 'undefined' ? 'undefined' : (0, _typeof3.default)(obj)) {
case 'string':
try {
return _mongoose.Types.ObjectId(obj);
} catch (err) {};
break;
case 'object':
if (Array.isArray(obj)) {
for (var index = 0; index < obj.length; index++) {
obj[index] = parseObjectId(obj[index]);
}
return obj;
} else {
for (var key in obj) {
obj[key] = parseObjectId(obj[key]);
}
return obj;
}
default:
return obj;
}
};
var Tool = {
dealSchema: function dealSchema(schema) {
schema.plugin(_mongooseUniqueValidator2.default);
schema.statics.findById = function (id, select) {
return this.findOne({ _id: id }, select);
};
schema.statics.updateById = function (id, fields) {
return this.update({ _id: id }, fields);
};
schema.statics.removeById = function (id) {
return this.remove({ _id: id });
};
schema.statics.editField = function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(select, name, value) {
var _this = this;
var ispush = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];
var resolve, reject, prom, check;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!this._fields) this._fields = { deal: [], pullArr: [] };
prom = new _promise2.default(function (res, rej) {
resolve = res;
reject = rej;
});
this._fields.deal.push({ resolve: resolve, reject: reject });
this._fields.pullArr.push(value);
check = function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() {
var deal, pullArr, updateObj;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
deal = _this._fields.deal.splice(0, _this._fields.deal.length);
pullArr = _this._fields.pullArr.splice(0, _this._fields.pullArr.length);
updateObj = ispush ? { $pushAll: (0, _defineProperty3.default)({}, name, pullArr) } : { $pull: (0, _defineProperty3.default)({}, name, { $in: pullArr }) };
_context.prev = 3;
_context.next = 6;
return _this.update(select, updateObj, {
multi: true
});
case 6:
deal.forEach(function (deal) {
return deal.resolve();
});
_context.next = 12;
break;
case 9:
_context.prev = 9;
_context.t0 = _context['catch'](3);
deal.forEach(function (deal) {
return deal.reject(_context.t0);
});
case 12:
if (!_this._fields.deal.length) {
_context.next = 17;
break;
}
_context.next = 15;
return check();
case 15:
_context.next = 18;
break;
case 17:
_this._fields.locked = false;
case 18:
case 'end':
return _context.stop();
}
}
}, _callee, _this, [[3, 9]]);
}));
return function check() {
return ref.apply(this, arguments);
};
}();
if (this._fields.locked) {
_context2.next = 9;
break;
}
this._fields.locked = true;
_context2.next = 9;
return check();
case 9:
return _context2.abrupt('return', prom);
case 10:
case 'end':
return _context2.stop();
}
}
}, _callee2, this);
}));
return function (_x, _x2, _x3, _x4) {
return ref.apply(this, arguments);
};
}();
},
getQuery: function getQuery(params, fields) {
var query = {};
fields.forEach(function (item) {
if (params[item] !== undefined) query[item] = params[item];
});
return query;
},
getList: function getList(_ref) {
var model = _ref.model;
var query = _ref.query;
var _ref$select = _ref.select;
var select = _ref$select === undefined ? '' : _ref$select;
var limit = query.limit;
var offset = query.offset;
var asc = query.asc;
var populateStr = query.populate;
var sort = query.sort;
var paramsStr = query.params;
var params = (0, _objectWithoutProperties3.default)(query, ['limit', 'offset', 'asc', 'populate', 'sort', 'params']);
var populate = parseJson(populateStr);
// 处理从系统内部与外界传来的参数
params = (0, _extends3.default)({}, parseJson(paramsStr) || {}, params);
return model.find(params, select).populate(populate || '').limit(parseInt(limit) || 30).skip(parseInt(offset) || 0).sort('' + (asc ? '' : '-') + (sort || 'createdAt'));
},
getAggregate: function getAggregate(_ref2) {
var model = _ref2.model;
var query = _ref2.query;
var groupStr = _ref2.group;
var sortStr = _ref2.sort;
var _ref2$select = _ref2.select;
var select = _ref2$select === undefined ? '' : _ref2$select;
var paramsStr = query.params;
var params = (0, _objectWithoutProperties3.default)(query, ['params']);
var $match = (0, _extends3.default)({}, parseJson(paramsStr) || {}, params);
parseObjectId($match);
var $group = JSON.parse(groupStr);
select.trim().split(' ').forEach(function (item) {
if ($group._id && $group._id.indexOf(item.replace('-', '')) !== -1) {
throw new _resterror2.default(403, 'AUTH_ERR', 'no permission for aggregate group');
}
});
var exp = [{ $match: $match }, { $group: $group }, { $sort: sortStr ? JSON.parse(sortStr) : { _id: 1 } }];
return model.aggregate(exp);
},
parseArr: function parseArr(str) {
return str.split('\'').filter(function (item) {
return item.length > 3;
});
},
parseNull: function parseNull(params) {
for (var key in params) {
var param = params[key];
if (param === '') params[key] = null;
try {
params[key] = JSON.parse(param);
} catch (err) {
params[key] = param;
}
}
return params;
}
};
exports.default = Tool;
module.exports = exports['default'];