UNPKG

clannad

Version:

data storage service with RESTful APIs.

153 lines (119 loc) 4.73 kB
'use strict'; 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'];