clannad
Version:
data storage service with RESTful APIs.
153 lines (119 loc) • 4.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _fs = require('fs');
var _mongodbIo = require('mongodb-io');
var _mongodbIo2 = _interopRequireDefault(_mongodbIo);
var _resterror = require('../services/resterror');
var _resterror2 = _interopRequireDefault(_resterror);
var _project = require('../models/project');
var _project2 = _interopRequireDefault(_project);
var _table = require('../models/table');
var _table2 = _interopRequireDefault(_table);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var File = {
config: null,
export: function _export(ctx) {
var _this = this;
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() {
var config, projectName, needSource, project, tables, tableIds, db, filePath;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
config = File.config || {};
projectName = ctx.params.projectName;
needSource = ctx.query.needSource;
_context.next = 5;
return _project2.default.findOne({ name: projectName });
case 5:
project = _context.sent;
if (project) {
_context.next = 8;
break;
}
throw new _resterror2.default(404, 'PROJECT_NOTFOUND_ERR', 'project ' + projectName + ' is not found');
case 8:
_context.next = 10;
return _table2.default.find({ project: project._id });
case 10:
tables = _context.sent;
tableIds = tables.map(function (table) {
return 'ObjectId("' + table._id + '")';
});
tableIds = '[' + tableIds.join(',') + ']';
// 导出的条件:
// project导出该名称记录
// table导出该projectId记录
// field导出tableId记录
// source导出${projectName.tableName}的记录
db = {
name: config.db || 'clannad',
collections: [{
name: 'admin.projects',
query: '{name: "' + projectName + '"}'
}, {
name: 'admin.tables',
query: '{_id: {$in: ' + tableIds + '}}'
}, {
name: 'admin.fields',
query: '{table: {$in: ' + tableIds + '}}'
}]
};
if (needSource) {
tables.forEach(function (table) {
db.collections.push(projectName + '.' + table.name + 's');
});
}
_context.next = 17;
return _mongodbIo2.default.export({ dbs: [db], config: config });
case 17:
filePath = _context.sent;
ctx.body = (0, _fs.readFileSync)(filePath);
ctx.set('content-type', 'application/tar+gzip');
case 20:
case 'end':
return _context.stop();
}
}
}, _callee, _this);
}))();
},
import: function _import(ctx) {
var _this2 = this;
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2() {
var path, config;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
path = ctx.req.files[0].path;
// 路径,从文件中获取
config = File.config || {};
config.filePath = path;
_context2.prev = 3;
_context2.next = 6;
return _mongodbIo2.default.import({ dbs: [{ name: config.db || 'clannad', drop: true }], config: config });
case 6:
_context2.next = 11;
break;
case 8:
_context2.prev = 8;
_context2.t0 = _context2['catch'](3);
throw new _resterror2.default(500, 'FILE_IMPORT_ERR', _context2.t0.message);
case 11:
case 'end':
return _context2.stop();
}
}
}, _callee2, _this2, [[3, 8]]);
}))();
}
};
exports.default = File;
module.exports = exports['default'];