clannad
Version:
data storage service with RESTful APIs.
320 lines (265 loc) • 10 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _mongoose = require('mongoose');
var _mongoose2 = _interopRequireDefault(_mongoose);
var _resterror = require('../services/resterror');
var _resterror2 = _interopRequireDefault(_resterror);
var _project = require('../models/project');
var _project2 = _interopRequireDefault(_project);
var _tools = require('./tools');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Schema = _mongoose2.default.Schema;
var Types = _mongoose2.default.Types;
// 目前暂时处理为:每次均重新读取,redis成本太大,且不符合需求,放弃。
// 储存当前所有的Model
var caches = {};
// 储存所有Model需要的字段信息
var globalFields = {};
// 储存表的权限信息
var auths = {};
// 储存字段的查看权限
var shows = {};
// 储存所有cors的domain数组
var cors = {};
// 储存所有项目的token数组
var globalTokens = {};
var getField = function getField(data, projectName) {
data = JSON.parse((0, _stringify2.default)(data));
var field = {};
// 处理类型, 默认值
switch (data.type) {
case 'Mixed':
field.type = Schema.Types.Mixed;
if (data.default) field.default = Types.Mixed(data.default);
break;
case 'ObjectId':
field.type = Schema.Types.ObjectId;
if (data.default && data.default.length === 24) field.default = Types.ObjectId(data.default);
break;
case 'ObjectIdArray':
field.type = Schema.Types.ObjectId;
if (data.default && data.default.length === 24) {
if (typeof data.default === 'string') data.default = JSON.parse(data.default);
field.default = data.default.map(function (item) {
return Types.ObjectId(item);
});
}
break;
case 'Object':
case 'Array':
field.type = global[data.type];
if (data.default) {
if (typeof data.default === 'string') data.default = JSON.parse(data.default);
field.default = data.default;
}
break;
default:
field.type = global[data.type];
if (data.default) field.default = data.default;
break;
}
// 处理正则
if (data.validExp) field.validate = new RegExp(data.validExp);
// 处理ref
if (data.ref) field.ref = projectName + '.' + data.ref;
var others = (0, _tools.getQuery)(data, ['required', 'unique', 'index']);
if (data.type === 'ObjectIdArray') return [(0, _extends3.default)({}, field, others)];
return (0, _extends3.default)({}, field, others);
};
var setModel = function setModel(schema, name) {
(0, _tools.dealSchema)(schema);
if (caches[name]) delete _mongoose2.default.models[name];
caches[name] = _mongoose2.default.model(name, schema);
return caches[name];
};
var Model = {
initCaches: function initCaches(projectName) {
var _this = this;
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() {
var project;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return _project2.default.findOne({ name: projectName }).populate({
path: 'tables',
populate: { path: 'fields' }
});
case 2:
project = _context.sent;
project.tables.forEach(function (table) {
var fields = {};
// 重做显示权限
var show = {};
table.fields.forEach(function (field) {
fields[field.name] = getField(field, projectName);
show[field.name] = JSON.parse((0, _stringify2.default)(field.show));
});
var name = project.name + '.' + table.name;
globalFields[name] = fields;
shows[name] = show;
setModel(new Schema(fields, { timestamps: true }), name);
});
case 4:
case 'end':
return _context.stop();
}
}
}, _callee, _this);
}))();
},
getCaches: function getCaches(projectName) {
var _this2 = this;
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2() {
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return Model.initCaches(projectName);
case 2:
return _context2.abrupt('return', caches);
case 3:
case 'end':
return _context2.stop();
}
}
}, _callee2, _this2);
}))();
},
removeCaches: function removeCaches(field, projectName, tableName) {
var _this3 = this;
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3() {
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return Model.initCaches(projectName);
case 2:
_context3.next = 4;
return caches[projectName + '.' + tableName].update((0, _defineProperty3.default)({}, field.name, { $ne: null }), (0, _defineProperty3.default)({}, field.name, null));
case 4:
case 'end':
return _context3.stop();
}
}
}, _callee3, _this3);
}))();
},
initProject: function initProject(projectName) {
var _this4 = this;
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4() {
var project;
return _regenerator2.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return _project2.default.findOne({ name: projectName }).populate('tables');
case 2:
project = _context4.sent;
if (project) {
_context4.next = 5;
break;
}
throw new _resterror2.default(404, 'PROJECT_NOTFOUND_ERROR', 'project ' + projectName + ' is not found');
case 5:
globalTokens[projectName] = project.tokens;
cors[projectName] = project.domains;
project.tables.forEach(function (table) {
var visitorAuth = table.visitorAuth;
var userAuth = table.userAuth;
var adminAuth = table.adminAuth;
auths[projectName + '.' + table.name] = { visitorAuth: visitorAuth, userAuth: userAuth, adminAuth: adminAuth };
});
case 8:
case 'end':
return _context4.stop();
}
}
}, _callee4, _this4);
}))();
},
getAuths: function getAuths(projectName) {
var _this5 = this;
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee5() {
return _regenerator2.default.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
_context5.next = 2;
return Model.initProject(projectName);
case 2:
return _context5.abrupt('return', JSON.parse((0, _stringify2.default)(auths)));
case 3:
case 'end':
return _context5.stop();
}
}
}, _callee5, _this5);
}))();
},
getShows: function getShows(name) {
return shows[name];
},
getCORS: function getCORS(projectName) {
var _this6 = this;
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee6() {
return _regenerator2.default.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
_context6.next = 2;
return Model.initProject(projectName);
case 2:
return _context6.abrupt('return', cors[projectName]);
case 3:
case 'end':
return _context6.stop();
}
}
}, _callee6, _this6);
}))();
},
hasToken: function hasToken(token, projectName) {
var _this7 = this;
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee7() {
return _regenerator2.default.wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
if (token) {
_context7.next = 2;
break;
}
return _context7.abrupt('return');
case 2:
_context7.next = 4;
return Model.initProject(projectName);
case 4:
return _context7.abrupt('return', globalTokens[projectName].indexOf(token) !== -1);
case 5:
case 'end':
return _context7.stop();
}
}
}, _callee7, _this7);
}))();
}
};
exports.default = Model;
module.exports = exports['default'];