UNPKG

clannad

Version:

data storage service with RESTful APIs.

320 lines (265 loc) 10 kB
'use strict'; 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'];