IGNITE-843 Refactored server side.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/721a1165 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/721a1165 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/721a1165 Branch: refs/heads/ignite-843-rc3 Commit: 721a116542c5bae0d891b0e674ee9f6e9ee3c1a7 Parents: 9073514 Author: Andrey <[email protected]> Authored: Mon Feb 8 10:44:34 2016 +0700 Committer: Andrey <[email protected]> Committed: Mon Feb 8 10:44:34 2016 +0700 ---------------------------------------------------------------------- .../src/main/js/agents/agent-manager.js | 351 ------------ .../src/main/js/agents/agent-server.js | 64 --- modules/control-center-web/src/main/js/app.js | 164 ------ .../src/main/js/config/default.json | 26 - modules/control-center-web/src/main/js/db.js | 534 ------------------ .../src/main/js/helpers/configuration-loader.js | 75 --- .../src/main/js/keys/test.crt | 13 - .../src/main/js/keys/test.key | 18 - .../src/main/js/routes/admin.js | 119 ---- .../src/main/js/routes/agent.js | 298 ---------- .../src/main/js/routes/caches.js | 182 ------ .../src/main/js/routes/clusters.js | 167 ------ .../src/main/js/routes/domains.js | 277 ---------- .../src/main/js/routes/igfs.js | 143 ----- .../src/main/js/routes/notebooks.js | 151 ----- .../src/main/js/routes/profile.js | 85 --- .../src/main/js/routes/public.js | 231 -------- modules/control-center-web/src/main/js/serve.js | 164 +++--- .../src/main/js/serve/agent.js | 380 +++++++++++++ .../control-center-web/src/main/js/serve/app.js | 33 ++ .../src/main/js/serve/config/default.json | 26 + .../src/main/js/serve/configure.js | 67 +++ .../src/main/js/serve/keys/test.crt | 13 + .../src/main/js/serve/keys/test.key | 18 + .../src/main/js/serve/mongo.js | 551 +++++++++++++++++++ .../src/main/js/serve/routes/admin.js | 126 +++++ .../src/main/js/serve/routes/agent.js | 331 +++++++++++ .../src/main/js/serve/routes/caches.js | 196 +++++++ .../src/main/js/serve/routes/clusters.js | 181 ++++++ .../src/main/js/serve/routes/domains.js | 285 ++++++++++ .../src/main/js/serve/routes/igfs.js | 154 ++++++ .../src/main/js/serve/routes/notebooks.js | 159 ++++++ .../src/main/js/serve/routes/profile.js | 93 ++++ .../src/main/js/serve/routes/public.js | 250 +++++++++ .../src/main/js/serve/routes/routes.js | 106 ++++ .../src/main/js/serve/settings.js | 78 +++ 36 files changed, 3122 insertions(+), 2987 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/agents/agent-manager.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/agents/agent-manager.js b/modules/control-center-web/src/main/js/agents/agent-manager.js deleted file mode 100644 index 354a163..0000000 --- a/modules/control-center-web/src/main/js/agents/agent-manager.js +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var WebSocketServer = require('ws').Server; - -var apacheIgnite = require('apache-ignite'); - -var db = require('../db'); - -var AgentServer = require('./agent-server').AgentServer; - -/** - * @constructor - */ -function AgentManager(srv) { - this._clients = {}; - - this._server = srv; - - this._wss = new WebSocketServer({ server: this._server }); - - var self = this; - - this._wss.on('connection', function(ws) { - new Client(ws, self); - }); -} - -/** - * @param userId - * @param {Client} client - */ -AgentManager.prototype._removeClient = function(userId, client) { - var connections = this._clients[userId]; - - if (connections) { - removeFromArray(connections, client); - - if (connections.length == 0) - delete this._clients[userId]; - } -}; - -/** - * @param userId - * @param {Client} client - */ -AgentManager.prototype._addClient = function(userId, client) { - var existingConnections = this._clients[userId]; - - if (!existingConnections) { - existingConnections = []; - - this._clients[userId] = existingConnections; - } - - existingConnections.push(client); -}; - -/** - * @param userId - * @returns {Client} - */ -AgentManager.prototype.findClient = function(userId) { - var clientsList = this._clients[userId]; - - if (!clientsList || clientsList.length == 0) - return null; - - return clientsList[0]; -}; - -/** - * @constructor - * @param {AgentManager} manager - * @param {WebSocket} ws - */ -function Client(ws, manager) { - var self = this; - - this._manager = manager; - this._ws = ws; - - ws.on('close', function() { - if (self._user) { - self._manager._removeClient(self._user._id, self); - } - }); - - ws.on('message', function (msgStr) { - var msg = JSON.parse(msgStr); - - self['_rmt' + msg.type](msg); - }); - - this._reqCounter = 0; - - this._cbMap = {}; -} - -Client.prototype._runCommand = function(method, args) { - var self = this; - - return new Promise(function(resolve, reject) { - self._invokeRmtMethod(method, args, function(error, res) { - if (error != null) - return reject(error); - - resolve(res); - }); - }); -}; - -/** - * @param {String} uri - * @param {Object} params - * @param {Boolean} demo - * @param {String} [method] - * @param {Object} [headers] - * @param {String} [body] - * @param {callback} [callback] Callback. Take 3 arguments: {Number} successStatus, {String} error, {String} response. - */ -Client.prototype.executeRest = function(uri, params, demo, method, headers, body, callback) { - if (typeof(params) != 'object') - throw '"params" argument must be an object'; - - if (typeof(callback) != 'function') - throw 'callback must be a function'; - - if (body && typeof(body) != 'string') - throw 'body must be a string'; - - if (headers && typeof(headers) != 'object') - throw 'headers must be an object'; - - if (!method) - method = 'GET'; - else - method = method.toUpperCase(); - - if (method != 'GET' && method != 'POST') - throw 'Unknown HTTP method: ' + method; - - const cb = function(error, restResult) { - if (error) - return callback(error); - - const restError = restResult.error; - - if (restError) - return callback(restError); - - const restCode = restResult.restCode; - - if (restCode !== 200) { - if (restCode === 401) - return callback.call({code: restCode, message: "Failed to authenticate on node."}); - - return callback.call({code: restCode, message: restError || "Failed connect to node and execute REST command."}); - } - - try { - var nodeResponse = JSON.parse(restResult.response); - - if (nodeResponse.successStatus === 0) - return callback(null, nodeResponse.response); - - switch (nodeResponse.successStatus) { - case 1: - return callback({code: 500, message: nodeResponse.error}); - case 2: - return callback({code: 401, message: nodeResponse.error}); - case 3: - return callback({code: 403, message: nodeResponse.error}); - } - - callback(nodeResponse.error); - } - catch (e) { - callback(e); - } - }; - - this._invokeRmtMethod('executeRest', [uri, params, demo, method, headers, body], cb); -}; - -/** - * @param {string} error - */ -Client.prototype.authResult = function(error) { - return this._runCommand('authResult', [].slice.call(arguments)); -}; - -/** - * @param {String} driverPath - * @param {String} driverClass - * @param {String} url - * @param {Object} info - * @returns {Promise} Promise on list of tables (see org.apache.ignite.schema.parser.DbTable java class) - */ -Client.prototype.metadataSchemas = function(driverPath, driverClass, url, info) { - return this._runCommand('schemas', [].slice.call(arguments)); -}; - -/** - * @param {String} driverPath - * @param {String} driverClass - * @param {String} url - * @param {Object} info - * @param {Array} schemas - * @param {Boolean} tablesOnly - * @returns {Promise} Promise on list of tables (see org.apache.ignite.schema.parser.DbTable java class) - */ -Client.prototype.metadataTables = function(driverPath, driverClass, url, info, schemas, tablesOnly) { - return this._runCommand('metadata', [].slice.call(arguments)); -}; - -/** - * @returns {Promise} Promise on list of jars from driver folder. - */ -Client.prototype.availableDrivers = function() { - return this._runCommand('availableDrivers', [].slice.call(arguments)); -}; - -/** - * Run http request - * - * @this {AgentServer} - * @param {String} method Command name. - * @param {Array} args Command params. - * @param {Function} callback on finish - */ -Client.prototype._invokeRmtMethod = function(method, args, callback) { - if (this._ws.readyState != 1) { - if (callback) - callback('org.apache.ignite.agent.AgentException: Connection is closed'); - - return; - } - - var msg = { - method: method, - args: args - }; - - if (callback) { - var reqId = this._reqCounter++; - - this._cbMap[reqId] = callback; - - msg.reqId = reqId; - } - - this._ws.send(JSON.stringify(msg)) -}; - -Client.prototype._rmtAuthMessage = function(msg) { - var self = this; - - var fs = require('fs'); - - fs.stat('public/agent/ignite-web-agent-1.5.0.final.zip', function(err, stats) { - var relDate = 0; - - if (!err) - relDate = stats.birthtime.getTime(); - - if ((msg.relDate || 0) < relDate) - self.authResult('You are using an older version of the agent. Please reload agent archive'); - - db.Account.findOne({ token: msg.token }, function (err, account) { - if (err) { - self.authResult('Failed to authorize user'); - // TODO IGNITE-1379 send error to web master. - } - else if (!account) - self.authResult('Invalid token, user not found'); - else { - self.authResult(null); - - self._user = account; - - self._manager._addClient(account._id, self); - - self._cluster = new apacheIgnite.Ignite(new AgentServer(self)); - - self._demo = new apacheIgnite.Ignite(new AgentServer(self, true)); - } - }); - }); -}; - -Client.prototype._rmtCallRes = function(msg) { - var callback = this._cbMap[msg.reqId]; - - if (!callback) return; - - delete this._cbMap[msg.reqId]; - - callback(msg.error, msg.response); -}; - -/** - * @returns {Ignite} - */ -Client.prototype.ignite = function(demo) { - return demo ? this._demo : this._cluster; -}; - -function removeFromArray(arr, val) { - var idx; - - while ((idx = arr.indexOf(val)) !== -1) { - arr.splice(idx, 1); - } -} - -exports.AgentManager = AgentManager; - -/** - * @type {AgentManager} - */ -var manager = null; - -exports.createManager = function(srv) { - if (manager) - throw 'Agent manager already cleared!'; - - manager = new AgentManager(srv); -}; - -/** - * @returns {AgentManager} - */ -exports.getAgentManager = function() { - return manager; -}; http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/agents/agent-server.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/agents/agent-server.js b/modules/control-center-web/src/main/js/agents/agent-server.js deleted file mode 100644 index 51303ba..0000000 --- a/modules/control-center-web/src/main/js/agents/agent-server.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var _ = require('lodash'); - -/** - * Creates an instance of server for Ignite - * - * @constructor - * @this {AgentServer} - * @param {Client} client Connected client - * @param {Boolean} demo Use demo node for request - */ -function AgentServer(client, demo) { - this._client = client; - this._demo = !!demo; -} - -/** - * Run http request - * - * @this {AgentServer} - * @param {Command} cmd Command - * @param {callback} callback on finish - */ -AgentServer.prototype.runCommand = function(cmd, callback) { - var params = {cmd: cmd.name()}; - - _.forEach(cmd._params, function (p) { - params[p.key] = p.value; - }); - - var body = undefined; - - var headers = undefined; - - var method = 'GET'; - - if (cmd._isPost()) { - body = cmd.postData(); - - method = 'POST'; - - headers = {'JSONObject': 'application/json'}; - } - - this._client.executeRest("ignite", params, this._demo, method, headers, body, callback); -}; - -exports.AgentServer = AgentServer; http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/app.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/app.js b/modules/control-center-web/src/main/js/app.js deleted file mode 100644 index c6dd247..0000000 --- a/modules/control-center-web/src/main/js/app.js +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var fs = require('fs'); -var express = require('express'); -var path = require('path'); -var logger = require('morgan'); -var cookieParser = require('cookie-parser'); -var bodyParser = require('body-parser'); -var session = require('express-session'); -var mongoStore = require('connect-mongo')(session); -var forceSSL = require('express-force-ssl'); -var config = require('./helpers/configuration-loader.js'); - -var publicRoutes = require('./routes/public'); -var notebooksRoutes = require('./routes/notebooks'); -var clustersRouter = require('./routes/clusters'); -var cachesRouter = require('./routes/caches'); -var domainsRouter = require('./routes/domains'); -var igfsRouter = require('./routes/igfs'); -var adminRouter = require('./routes/admin'); -var profileRouter = require('./routes/profile'); -var agentRouter = require('./routes/agent'); - -var passport = require('passport'); - -var db = require('./db'); - -var app = express(); - -app.use(cookieParser('keyboard cat')); - -app.use(bodyParser.json({limit: '50mb'})); -app.use(bodyParser.urlencoded({limit: '50mb', extended: true})); - -app.use(logger('dev', { - skip: function (req, res) { - return res.statusCode < 400; - } -})); - -var month = 3600000 * 24 * 30; - -app.use(session({ - secret: 'keyboard cat', - resave: false, - saveUninitialized: true, - cookie: { - expires: new Date(Date.now() + month), - maxAge: month - }, - store: new mongoStore({ - mongooseConnection: db.mongoose.connection - }) -})); - -app.use(passport.initialize()); -app.use(passport.session()); - -passport.serializeUser(db.Account.serializeUser()); -passport.deserializeUser(db.Account.deserializeUser()); - -passport.use(db.Account.createStrategy()); - -if (config.get('server:ssl')) { - var httpsPort = config.normalizePort(config.get('server:https-port') || 443); - - app.set('forceSSLOptions', { - enable301Redirects: true, - trustXFPHeader: true, - httpsPort: httpsPort - }); - - app.use(forceSSL); -} - -var mustAuthenticated = function (req, res, next) { - req.isAuthenticated() ? next() : res.redirect('/'); -}; - -var adminOnly = function(req, res, next) { - req.isAuthenticated() && req.user.admin ? next() : res.sendStatus(403); -}; - -app.all('/configuration/*', mustAuthenticated); - -app.all('*', function(req, res, next) { - req.currentUserId = function() { - if (!req.user) - return null; - - if (req.session.viewedUser && req.user.admin) - return req.session.viewedUser._id; - - return req.user._id; - }; - - next(); -}); - -app.use('/', publicRoutes); -app.use('/admin', mustAuthenticated, adminOnly, adminRouter); -app.use('/profile', mustAuthenticated, profileRouter); - -app.use('/configuration/clusters', clustersRouter); -app.use('/configuration/caches', cachesRouter); -app.use('/configuration/domains', domainsRouter); -app.use('/configuration/igfs', igfsRouter); - -app.use('/agent', mustAuthenticated, agentRouter); -app.use('/notebooks', mustAuthenticated, notebooksRoutes); - -config.findIgniteModules() - .filter(function(path) { return path.match(/\/routes\/.+\.js$/); }) - .forEach(function(route) { require(route)(app); }); - -// Catch 404 and forward to error handler. -app.use(function (req, res, next) { - var err = new Error('Not Found: ' + req.originalUrl); - - err.status = 404; - - next(err); -}); - -// Error handlers. - -// Development error handler: will print stacktrace. -if (app.get('env') === 'development') { - app.use(function (err, req, res) { - res.status(err.status || 500); - - res.render('error', { - message: err.message, - error: err - }); - }); -} - -// Production error handler: no stacktraces leaked to user. -app.use(function (err, req, res) { - res.status(err.status || 500); - - res.render('error', { - message: err.message, - error: {} - }); -}); - -module.exports = app; http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/config/default.json ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/config/default.json b/modules/control-center-web/src/main/js/config/default.json deleted file mode 100644 index 4be4ef5..0000000 --- a/modules/control-center-web/src/main/js/config/default.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "server": { - "port": 3000, - "https-port": 8443, - "ssl": false, - "key": "keys/test.key", - "cert": "keys/test.crt", - "keyPassphrase": "password" - }, - "mongoDB": { - "url": "mongodb://localhost/web-control-center" - }, - "agent-server": { - "port": 3001, - "ssl": true, - "key": "keys/test.key", - "cert": "keys/test.crt", - "keyPassphrase": "password" - }, - "smtp": { - "service": "", - "username": "", - "email": "", - "password": "" - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/db.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/db.js b/modules/control-center-web/src/main/js/db.js deleted file mode 100644 index ea859e1..0000000 --- a/modules/control-center-web/src/main/js/db.js +++ /dev/null @@ -1,534 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var config = require('./helpers/configuration-loader.js'); -var path = require('path'); - -// Mongoose for mongodb. -var mongoose = require('mongoose'), - Schema = mongoose.Schema, - ObjectId = mongoose.Schema.Types.ObjectId, - passportLocalMongoose = require('passport-local-mongoose'); - -var deepPopulate = require('mongoose-deep-populate')( mongoose); - -// Connect to mongoDB database. -mongoose.connect(config.get('mongoDB:url'), {server: {poolSize: 4}}); - -// Define Account schema. -var AccountSchema = new Schema({ - username: String, - email: String, - company: String, - country: String, - lastLogin: Date, - admin: Boolean, - token: String, - resetPasswordToken: String -}); - -// Install passport plugin. -AccountSchema.plugin(passportLocalMongoose, {usernameField: 'email', limitAttempts: true, lastLoginField: 'lastLogin', - usernameLowerCase: true}); - -// Configure transformation to JSON. -AccountSchema.set('toJSON', { - transform: function(doc, ret) { - return { - _id: ret._id, - email: ret.email, - username: ret.username, - company: ret.company, - country: ret.country, - admin: ret.admin, - token: ret.token, - lastLogin: ret.lastLogin - }; - } -}); - -// Define Account model. -exports.Account = mongoose.model('Account', AccountSchema); - -// Define Space model. -exports.Space = mongoose.model('Space', new Schema({ - name: String, - owner: {type: ObjectId, ref: 'Account'}, - usedBy: [{ - permission: {type: String, enum: ['VIEW', 'FULL']}, - account: {type: ObjectId, ref: 'Account'} - }] -})); - -// Define Domain model schema. -var DomainModelSchema = new Schema({ - space: {type: ObjectId, ref: 'Space'}, - caches: [{type: ObjectId, ref: 'Cache'}], - queryMetadata: {type: String, enum: ['Annotations', 'Configuration']}, - kind: {type: String, enum: ['query', 'store', 'both']}, - databaseSchema: String, - databaseTable: String, - keyType: String, - valueType: String, - keyFields: [{databaseFieldName: String, databaseFieldType: String, javaFieldName: String, javaFieldType: String}], - valueFields: [{databaseFieldName: String, databaseFieldType: String, javaFieldName: String, javaFieldType: String}], - fields: [{name: String, className: String}], - aliases: [{field: String, alias: String}], - indexes: [{name: String, indexType: {type: String, enum: ['SORTED', 'FULLTEXT', 'GEOSPATIAL']}, fields: [{name: String, direction: Boolean}]}], - demo: Boolean -}); - -// Define model of Domain models. -exports.DomainModel = mongoose.model('DomainModel', DomainModelSchema); - -// Define Cache schema. -var CacheSchema = new Schema({ - space: {type: ObjectId, ref: 'Space'}, - name: String, - clusters: [{type: ObjectId, ref: 'Cluster'}], - domains: [{type: ObjectId, ref: 'DomainModel'}], - cacheMode: {type: String, enum: ['PARTITIONED', 'REPLICATED', 'LOCAL']}, - atomicityMode: {type: String, enum: ['ATOMIC', 'TRANSACTIONAL']}, - - backups: Number, - memoryMode: {type: String, enum: ['ONHEAP_TIERED', 'OFFHEAP_TIERED', 'OFFHEAP_VALUES']}, - offHeapMaxMemory: Number, - startSize: Number, - swapEnabled: Boolean, - - evictionPolicy: { - kind: {type: String, enum: ['LRU', 'FIFO', 'Sorted']}, - LRU: { - batchSize: Number, - maxMemorySize: Number, - maxSize: Number - }, - FIFO: { - batchSize: Number, - maxMemorySize: Number, - maxSize: Number - }, - SORTED: { - batchSize: Number, - maxMemorySize: Number, - maxSize: Number - } - }, - - rebalanceMode: {type: String, enum: ['SYNC', 'ASYNC', 'NONE']}, - rebalanceBatchSize: Number, - rebalanceBatchesPrefetchCount: Number, - rebalanceOrder: Number, - rebalanceDelay: Number, - rebalanceTimeout: Number, - rebalanceThrottle: Number, - - cacheStoreFactory: { - kind: { - type: String, - enum: ['CacheJdbcPojoStoreFactory', 'CacheJdbcBlobStoreFactory', 'CacheHibernateBlobStoreFactory'] - }, - CacheJdbcPojoStoreFactory: { - dataSourceBean: String, - dialect: { - type: String, - enum: ['Generic', 'Oracle', 'DB2', 'SQLServer', 'MySQL', 'PostgreSQL', 'H2'] - } - }, - CacheJdbcBlobStoreFactory: { - connectVia: {type: String, enum: ['URL', 'DataSource']}, - connectionUrl: String, - user: String, - dataSourceBean: String, - dialect: { - type: String, - enum: ['Generic', 'Oracle', 'DB2', 'SQLServer', 'MySQL', 'PostgreSQL', 'H2'] - }, - initSchema: Boolean, - createTableQuery: String, - loadQuery: String, - insertQuery: String, - updateQuery: String, - deleteQuery: String - }, - CacheHibernateBlobStoreFactory: { - hibernateProperties: [String] - } - }, - storeKeepBinary: Boolean, - loadPreviousValue: Boolean, - readThrough: Boolean, - writeThrough: Boolean, - - writeBehindEnabled: Boolean, - writeBehindBatchSize: Number, - writeBehindFlushSize: Number, - writeBehindFlushFrequency: Number, - writeBehindFlushThreadCount: Number, - - invalidate: Boolean, - defaultLockTimeout: Number, - atomicWriteOrderMode: {type: String, enum: ['CLOCK', 'PRIMARY']}, - writeSynchronizationMode: {type: String, enum: ['FULL_SYNC', 'FULL_ASYNC', 'PRIMARY_SYNC']}, - - sqlEscapeAll: Boolean, - sqlSchema: String, - sqlOnheapRowCacheSize: Number, - longQueryWarningTimeout: Number, - sqlFunctionClasses: [String], - snapshotableIndex: Boolean, - statisticsEnabled: Boolean, - managementEnabled: Boolean, - readFromBackup: Boolean, - copyOnRead: Boolean, - maxConcurrentAsyncOperations: Number, - nearCacheEnabled: Boolean, - nearConfiguration: { - nearStartSize: Number, - nearEvictionPolicy: { - kind: {type: String, enum: ['LRU', 'FIFO', 'Sorted']}, - LRU: { - batchSize: Number, - maxMemorySize: Number, - maxSize: Number - }, - FIFO: { - batchSize: Number, - maxMemorySize: Number, - maxSize: Number - }, - SORTED: { - batchSize: Number, - maxMemorySize: Number, - maxSize: Number - } - } - }, - demo: Boolean -}); - -// Install deep populate plugin. -CacheSchema.plugin(deepPopulate, { - whitelist: ['domains'] -}); - -// Define Cache model. -exports.Cache = mongoose.model('Cache', CacheSchema); - -var IgfsSchema = new Schema({ - space: {type: ObjectId, ref: 'Space'}, - name: String, - clusters: [{type: ObjectId, ref: 'Cluster'}], - affinnityGroupSize: Number, - blockSize: Number, - streamBufferSize: Number, - dataCacheName: String, - metaCacheName: String, - defaultMode: {type: String, enum: ['PRIMARY', 'PROXY', 'DUAL_SYNC', 'DUAL_ASYNC']}, - dualModeMaxPendingPutsSize: Number, - dualModePutExecutorService: String, - dualModePutExecutorServiceShutdown: Boolean, - fragmentizerConcurrentFiles: Number, - fragmentizerEnabled: Boolean, - fragmentizerThrottlingBlockLength: Number, - fragmentizerThrottlingDelay: Number, - ipcEndpointConfiguration: { - type: {type: String, enum: ['SHMEM', 'TCP']}, - host: String, - port: Number, - memorySize: Number, - tokenDirectoryPath: String - }, - ipcEndpointEnabled: Boolean, - maxSpaceSize: Number, - maximumTaskRangeLength: Number, - managementPort: Number, - pathModes: [{path: String, mode: {type: String, enum: ['PRIMARY', 'PROXY', 'DUAL_SYNC', 'DUAL_ASYNC']}}], - perNodeBatchSize: Number, - perNodeParallelBatchCount: Number, - prefetchBlocks: Number, - sequentialReadsBeforePrefetch: Number, - trashPurgeTimeout: Number, - secondaryFileSystemEnabled: Boolean, - secondaryFileSystem: { - uri: String, - cfgPath: String, - userName: String - } -}); - -// Define IGFS model. -exports.Igfs = mongoose.model('Igfs', IgfsSchema); - -// Define Cluster schema. -var ClusterSchema = new Schema({ - space: {type: ObjectId, ref: 'Space'}, - name: String, - localHost: String, - discovery: { - localAddress: String, - localPort: Number, - localPortRange: Number, - addressResolver: String, - socketTimeout: Number, - ackTimeout: Number, - maxAckTimeout: Number, - networkTimeout: Number, - joinTimeout: Number, - threadPriority: Number, - heartbeatFrequency: Number, - maxMissedHeartbeats: Number, - maxMissedClientHeartbeats: Number, - topHistorySize: Number, - listener: String, - dataExchange: String, - metricsProvider: String, - reconnectCount: Number, - statisticsPrintFrequency: Number, - ipFinderCleanFrequency: Number, - authenticator: String, - forceServerMode: Boolean, - clientReconnectDisabled: Boolean, - kind: {type: String, enum: ['Vm', 'Multicast', 'S3', 'Cloud', 'GoogleStorage', 'Jdbc', 'SharedFs']}, - Vm: { - addresses: [String] - }, - Multicast: { - multicastGroup: String, - multicastPort: Number, - responseWaitTime: Number, - addressRequestAttempts: Number, - localAddress: String, - addresses: [String] - }, - S3: { - bucketName: String - }, - Cloud: { - credential: String, - credentialPath: String, - identity: String, - provider: String, - regions: [String], - zones: [String] - }, - GoogleStorage: { - projectName: String, - bucketName: String, - serviceAccountP12FilePath: String, - serviceAccountId: String, - addrReqAttempts: String - }, - Jdbc: { - initSchema: Boolean - }, - SharedFs: { - path: String - } - }, - atomicConfiguration: { - backups: Number, - cacheMode: {type: String, enum: ['LOCAL', 'REPLICATED', 'PARTITIONED']}, - atomicSequenceReserveSize: Number - }, - binaryConfiguration: { - idMapper: String, - serializer: String, - typeConfigurations: [{typeName: String, idMapper: String, serializer: String, enum: Boolean}], - compactFooter: Boolean - }, - caches: [{type: ObjectId, ref: 'Cache'}], - clockSyncSamples: Number, - clockSyncFrequency: Number, - deploymentMode: {type: String, enum: ['PRIVATE', 'ISOLATED', 'SHARED', 'CONTINUOUS']}, - discoveryStartupDelay: Number, - igfsThreadPoolSize: Number, - igfss: [{type: ObjectId, ref: 'Igfs'}], - includeEventTypes: [String], - managementThreadPoolSize: Number, - marshaller: { - kind: {type: String, enum: ['OptimizedMarshaller', 'JdkMarshaller']}, - OptimizedMarshaller: { - poolSize: Number, - requireSerializable: Boolean - } - }, - marshalLocalJobs: Boolean, - marshallerCacheKeepAliveTime: Number, - marshallerCacheThreadPoolSize: Number, - metricsExpireTime: Number, - metricsHistorySize: Number, - metricsLogFrequency: Number, - metricsUpdateFrequency: Number, - networkTimeout: Number, - networkSendRetryDelay: Number, - networkSendRetryCount: Number, - communication: { - listener: String, - localAddress: String, - localPort: Number, - localPortRange: Number, - sharedMemoryPort: Number, - directBuffer: Boolean, - directSendBuffer: Boolean, - idleConnectionTimeout: Number, - connectTimeout: Number, - maxConnectTimeout: Number, - reconnectCount: Number, - socketSendBuffer: Number, - socketReceiveBuffer: Number, - messageQueueLimit: Number, - slowClientQueueLimit: Number, - tcpNoDelay: Boolean, - ackSendThreshold: Number, - unacknowledgedMessagesBufferSize: Number, - socketWriteTimeout: Number, - selectorsCount: Number, - addressResolver: String - }, - connector: { - enabled: Boolean, - jettyPath: String, - host: String, - port: Number, - portRange: Number, - idleTimeout: Number, - idleQueryCursorTimeout: Number, - idleQueryCursorCheckFrequency: Number, - receiveBufferSize: Number, - sendBufferSize: Number, - directBuffer: Boolean, - noDelay: Boolean, - selectorCount: Number, - threadPoolSize: Number, - messageInterceptor: String, - secretKey: String, - sslEnabled: Boolean, - sslClientAuth: Boolean, - sslFactory: String - }, - peerClassLoadingEnabled: Boolean, - peerClassLoadingLocalClassPathExclude: [String], - peerClassLoadingMissedResourcesCacheSize: Number, - peerClassLoadingThreadPoolSize: Number, - publicThreadPoolSize: Number, - swapSpaceSpi: { - kind: {type: String, enum: ['FileSwapSpaceSpi']}, - FileSwapSpaceSpi: { - baseDirectory: String, - readStripesNumber: Number, - maximumSparsity: Number, - maxWriteQueueSize: Number, - writeBufferSize: Number - } - }, - systemThreadPoolSize: Number, - timeServerPortBase: Number, - timeServerPortRange: Number, - transactionConfiguration: { - defaultTxConcurrency: {type: String, enum: ['OPTIMISTIC', 'PESSIMISTIC']}, - defaultTxIsolation: {type: String, enum: ['READ_COMMITTED', 'REPEATABLE_READ', 'SERIALIZABLE']}, - defaultTxTimeout: Number, - pessimisticTxLogLinger: Number, - pessimisticTxLogSize: Number, - txSerializableEnabled: Boolean, - txManagerFactory: String - }, - sslEnabled: Boolean, - sslContextFactory: { - keyAlgorithm: String, - keyStoreFilePath: String, - keyStoreType: String, - protocol: String, - trustStoreFilePath: String, - trustStoreType: String, - trustManagers: [String] - }, - rebalanceThreadPoolSize: Number -}); - -// Install deep populate plugin. -ClusterSchema.plugin(deepPopulate, { - whitelist: [ - 'caches', - 'caches.domains', - 'igfss' - ] -}); - -// Define Cluster model. -exports.Cluster = mongoose.model('Cluster', ClusterSchema); - -exports.ClusterDefaultPopulate = ''; - -// Define Notebook schema. -var NotebookSchema = new Schema({ - space: {type: ObjectId, ref: 'Space'}, - name: String, - expandedParagraphs: [Number], - paragraphs: [{ - name: String, - query: String, - editor: Boolean, - result: {type: String, enum: ['none', 'table', 'bar', 'pie', 'line', 'area']}, - pageSize: Number, - timeLineSpan: String, - hideSystemColumns: Boolean, - cacheName: String, - chartsOptions: {barChart: {stacked: Boolean}, areaChart: {style: String}}, - rate: { - value: Number, - unit: Number - } - }] -}); - -// Define Notebook model. -exports.Notebook = mongoose.model('Notebook', NotebookSchema); - -exports.upsert = function (model, data, cb) { - if (data._id) { - var id = data._id; - - delete data._id; - - model.findOneAndUpdate({_id: id}, data, cb); - } - else - new model(data).save(cb); -}; - -exports.processed = function(err, res) { - if (err) { - res.status(500).send(err); - - return false; - } - - return true; -}; - -config.findIgniteModules() - .filter(function(path) { return path.match(/.+\/db\.js$/); }) - .forEach(function(db) { - var moduleExports = require(db)(mongoose, exports); - - for (var name in moduleExports) - exports[name] = moduleExports[name]; - }); - -exports.mongoose = mongoose; http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/helpers/configuration-loader.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/helpers/configuration-loader.js b/modules/control-center-web/src/main/js/helpers/configuration-loader.js deleted file mode 100644 index 5342cc3..0000000 --- a/modules/control-center-web/src/main/js/helpers/configuration-loader.js +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var config = require('nconf'); - -config.file({'file': 'config/default.json'}); - -/** - * Normalize a port into a number, string, or false. - */ -config.normalizePort = function (val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -}; - -config.findIgniteModules = function () { - var fs = require('fs'); - var path = require('path'); - - var igniteModules = process.env.IGNITE_MODULES || path.resolve(__dirname, 'ignite_modules'); - - function _find (root, filter, files, prefix) { - prefix = prefix || ''; - files = files || []; - - var dir = path.join(root, prefix); - - if (!fs.existsSync(dir)) - return files; - - if (fs.statSync(dir).isDirectory()) - fs.readdirSync(dir) - .filter(function (name) { return name[0] !== '.' }) - .forEach(function (name) { - _find(root, filter, files, path.join(prefix, name)) - }); - else - files.push(path.join(igniteModules, prefix).replace(/\\/g, '/')); // Replace backslashes to work under Windows - - return files; - } - - return _find(igniteModules); -}; - -config.address = function (username, email) { - return username ? '"' + username + '" <' + email + '>' : email; -}; - -module.exports = config; http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/keys/test.crt ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/keys/test.crt b/modules/control-center-web/src/main/js/keys/test.crt deleted file mode 100644 index 50c6d5c..0000000 --- a/modules/control-center-web/src/main/js/keys/test.crt +++ /dev/null @@ -1,13 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIB6zCCAVQCCQDcAphbU6UcLjANBgkqhkiG9w0BAQsFADA6MRIwEAYDVQQDDAls -b2NhbGhvc3QxJDAiBgkqhkiG9w0BCQEWFXNldmRva2ltb3ZAYXBhY2hlLm9yZzAe -Fw0xNTA3MTQxMzAyNTNaFw0xODA2MjMxMzAyNTNaMDoxEjAQBgNVBAMMCWxvY2Fs -aG9zdDEkMCIGCSqGSIb3DQEJARYVc2V2ZG9raW1vdkBhcGFjaGUub3JnMIGfMA0G -CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDP/zpJrdHqCj6lPpeFF6LQtzKef6UiyBBo -rbuOtCCgW8KMJJciluBWk2126qLt9smBN4jBpSNU3pq0r9gBMUTd/LSe7aY4D5ED -Pjp7XsypNVKeHaHbFi7KhfHy0LYxsWiNPmmHJv4dtYOp+pGK25rkXNfyJxxjgxN6 -wo34+MnZIQIDAQABMA0GCSqGSIb3DQEBCwUAA4GBAFk9XEjcdyihws+fVmdGGUFo -bVxI9YGH6agiNbU3WNF4B4VRzcPPW8z2mEo7eF9kgYmq/YzH4T8tgi/qkL/u8eZV -Wmi9bg6RThLN6/hj3wVoOFKykbDQ05FFdhIJXN5UOjPmxYM97EKqg6J0W2HAb8SG -+UekPnmAo/2HTKsLykH8 ------END CERTIFICATE----- http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/keys/test.key ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/keys/test.key b/modules/control-center-web/src/main/js/keys/test.key deleted file mode 100644 index 1b395c0..0000000 --- a/modules/control-center-web/src/main/js/keys/test.key +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,6798185330CE2EE2 - -sOwkmD8rvjx11l09V26dJhLhl+SyPIhyeZ3TqHXrYCATKoXlzidT+uPu1jVYtrwr -nBLA6TrIDYRrBNlEsqGZ0cSvWTIczzVW1xZKHEJo5q2vUT/W8u/Q1QQtS3P3GeKF -dEzx496rpZqwwVw59GNbuIwyYoVvQf3iEXzfhplGmLPELYIplDFOLgNuXQyXSGx6 -rwKsCxXMLsDyrA6DCz0Odf08p2HvWk/s5Ne3DFcQlqRNtIrBVGD2O0/Fp8ZZ2I4E -Yn2OIIWJff3HanOjLOWKdN8YAn5UleNmlEUdIHeS5qaQ68mabOxLkSef9qglV+sd -FHTtUq0cG6t6nhxZBziexha6v1yl/xABAHHhNPOfak+HthWxRD4N9f1yFYAeTmkn -4kwBWoSUe12XRf2pGNqhEUKN/KhDmWk85wI55i/Cu2XmNoiBFlS9BXrRYU8uVCJw -KlxjKTDWl1opCyvxTDxJnMkt44ZT445LRePKVueGIIKSUIXNQypOE+C1I0CL0N2W -Ts3m9nthquvLeMx92k7b8yW69BER5uac3SIlGCOJObQXsHgyk8wYiyd/zLKfjctG -PXieaW81UKjp+GqWpvWPz3VqnKwoyUWeVOOTviurli6kYOrHuySTMqMb6hxJctw9 -grAQTT0UPiAKWcM7InLzZnRjco+v9QLLEokjVngXPba16K/CItFY16xuGlaFLW7Y -XTc67AkL8b76HBZelMjmCsqjvSoULhuMFwTOvUMm/mSM8rMoi9asrJRLQHRMWCST -/6RENPLzPlOMnNLBujpBbn8V3/aYzEZsHMI+6S3d27WYlTJIqpabSA== ------END RSA PRIVATE KEY----- http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/routes/admin.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/routes/admin.js b/modules/control-center-web/src/main/js/routes/admin.js deleted file mode 100644 index 8c02507..0000000 --- a/modules/control-center-web/src/main/js/routes/admin.js +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var _ = require('lodash'); -var router = require('express').Router(); -var nodemailer = require('nodemailer'); - -var db = require('../db'); -var config = require('../helpers/configuration-loader.js'); - -/** - * Get list of user accounts. - */ -router.post('/list', function (req, res) { - db.Account.find({}).sort('username').exec(function (err, users) { - if (err) - return res.status(500).send(err.message); - - res.json(users); - }); -}); - -// Remove user. -router.post('/remove', function (req, res) { - var userId = req.body.userId; - - db.Account.findByIdAndRemove(userId, function (err, user) { - if (err) - return res.status(500).send(err.message); - - db.Space.find({owner: userId}, function(err, spaces) { - _.forEach(spaces, function (space) { - db.Cluster.remove({space: space._id}).exec(); - db.Cache.remove({space: space._id}).exec(); - db.DomainModel.remove({space: space._id}).exec(); - db.Notebook.remove({space: space._id}).exec(); - db.Space.remove({owner: space._id}).exec(); - }); - }); - - var transporter = { - service: config.get('smtp:service'), - auth: { - user:config.get('smtp:email'), - pass: config.get('smtp:password') - } - }; - - if (transporter.service != '' || transporter.auth.user != '' || transporter.auth.pass != '') { - var mailer = nodemailer.createTransport(transporter); - - var mailOptions = { - from: config.address(config.get('smtp:username'), config.get('smtp:email')), - to: config.address(user.username, user.email), - subject: 'Your account was deleted', - text: 'You are receiving this e-mail because admin remove your account.\n\n' + - '--------------\n' + - 'Apache Ignite Web Console http://' + req.headers.host + '\n' - }; - - mailer.sendMail(mailOptions, function(err){ - if (err) - return res.status(503).send('Account was removed, but failed to send e-mail notification to user!<br />' + err); - - res.sendStatus(200); - }); - } - else - res.sendStatus(200); - }); -}); - -// Save user. -router.post('/save', function (req, res) { - var userId = req.body.userId; - var adminFlag = req.body.adminFlag; - - db.Account.findByIdAndUpdate(userId, {admin: adminFlag}, function (err) { - if (err) - return res.status(500).send(err.message); - - res.sendStatus(200); - }); -}); - -// Become user. -router.get('/become', function (req, res) { - db.Account.findById(req.query.viewedUserId).exec(function (err, viewedUser) { - if (err) - return res.sendStatus(404); - - req.session.viewedUser = viewedUser; - - return res.sendStatus(200); - }) -}); - -// Become user. -router.get('/revert/identity', function (req, res) { - req.session.viewedUser = null; - - return res.sendStatus(200); -}); - -module.exports = router; http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/routes/agent.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/routes/agent.js b/modules/control-center-web/src/main/js/routes/agent.js deleted file mode 100644 index 8c2326c..0000000 --- a/modules/control-center-web/src/main/js/routes/agent.js +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var _ = require('lodash'); -var router = require('express').Router(); -var agentManager = require('../agents/agent-manager'); - -var apacheIgnite = require('apache-ignite'); -var SqlFieldsQuery = apacheIgnite.SqlFieldsQuery; -var ScanQuery = apacheIgnite.ScanQuery; - -function _client(userId) { - return new Promise(function(resolve, reject) { - var client = agentManager.getAgentManager().findClient(userId); - - if (client) - return resolve(client); - - reject({code: 503, message: 'Connection to Ignite Web Agent is not established'}); - }); -} - -function _compact(className) { - return className.replace('java.lang.', '').replace('java.util.', '').replace('java.sql.', ''); -} - -function _handleException(res) { - return function (error) { - if (_.isObject(error)) - return res.status(error.code).send(error.message); - - return res.status(500).send(error); - } -} - -/* Get grid topology. */ -router.get('/download/zip', function (req, res) { - var fs = require('fs'); - var JSZip = require('jszip'); - var config = require('../helpers/configuration-loader.js'); - - var agentFld = 'ignite-web-agent-1.5.0.final'; - var agentZip = agentFld + '.zip'; - var agentPathZip = 'public/agent/' + agentFld + '.zip'; - - fs.stat(agentPathZip, function(err, stats) { - if (err) - return res.download(agentPathZip, agentZip); - - // Read a zip file. - fs.readFile(agentPathZip, function(err, data) { - if (err) - return res.download(agentPathZip, agentZip); - - var zip = new JSZip(data); - - var prop = []; - - var host = req.hostname.match(/:/g) ? req.hostname.slice(0, req.hostname.indexOf(':')) : req.hostname; - - prop.push('token=' + req.user.token); - prop.push('server-uri=wss://' + host + ':' + config.get('agent-server:port')); - prop.push('#Uncomment following options if needed:'); - prop.push('#node-uri=http://localhost:8080'); - prop.push('#driver-folder=./jdbc-drivers'); - prop.push(''); - prop.push("#Note: Don't change this auto generated line"); - prop.push('rel-date=' + stats.birthtime.getTime()); - - zip.file(agentFld + '/default.properties', prop.join('\n')); - - var buffer = zip.generate({type: 'nodebuffer', platform: 'UNIX'}); - - // Set the archive name. - res.attachment(agentZip); - - res.send(buffer); - }); - }); -}); - -/* Get grid topology. */ -router.post('/topology', function (req, res) { - _client(req.currentUserId()) - .then((client) => client.ignite(req.body.demo).cluster(req.body.attr, req.body.mtr)) - .then((clusters) => res.json(clusters)) - .catch(_handleException(res)); -}); - -/* Execute query. */ -router.post('/query', function (req, res) { - _client(req.currentUserId()) - .then((client) => { - // Create sql query. - var qry = new SqlFieldsQuery(req.body.query); - - // Set page size for query. - qry.setPageSize(req.body.pageSize); - - return client.ignite(req.body.demo).cache(req.body.cacheName).query(qry).nextPage() - }) - .then((cursor) => res.json({meta: cursor.fieldsMetadata(), rows: cursor.page(), queryId: cursor.queryId()})) - .catch(_handleException(res)); -}); - -/* Execute query getAll. */ -router.post('/query/getAll', function (req, res) { - _client(req.currentUserId()) - .then((client) => { - // Create sql query. - const qry = req.body.query ? new SqlFieldsQuery(req.body.query) : new ScanQuery(); - - // Set page size for query. - qry.setPageSize(1024); - - // Get query cursor. - const cursor = client.ignite(req.body.demo).cache(req.body.cacheName).query(qry); - - return new Promise(function (resolve) { - cursor.getAll().then(rows => resolve({meta: cursor.fieldsMetadata(), rows})) - }); - }) - .then(response => res.json(response)) - .catch(_handleException(res)); -}); - -/* Execute query. */ -router.post('/scan', function (req, res) { - _client(req.currentUserId()) - .then((client) => { - // Create sql query. - var qry = new ScanQuery(); - - // Set page size for query. - qry.setPageSize(req.body.pageSize); - - // Get query cursor. - return client.ignite(req.body.demo).cache(req.body.cacheName).query(qry).nextPage() - }) - .then((cursor) => res.json({meta: cursor.fieldsMetadata(), rows: cursor.page(), queryId: cursor.queryId()})) - .catch(_handleException(res)); -}); - -/* Get next query page. */ -router.post('/query/fetch', function (req, res) { - _client(req.currentUserId()) - .then((client) => { - var cache = client.ignite(req.body.demo).cache(req.body.cacheName); - - var cmd = cache._createCommand('qryfetch') - .addParam('qryId', req.body.queryId) - .addParam('pageSize', req.body.pageSize); - - return cache.__createPromise(cmd); - }) - .then((page) => res.json({rows: page['items'], last: page === null || page['last']})) - .catch(_handleException(res)); -}); - -/* Close query cursor by id. */ -router.post('/query/close', function (req, res) { - _client(req.currentUserId()) - .then((client) => { - var cache = client.ignite(req.body.demo).cache(req.body.cacheName); - - return cache.__createPromise(cache._createCommand('qrycls').addParam('qryId', req.body.queryId)) - }) - .then(() => res.sendStatus(200)) - .catch(_handleException(res)); -}); - -/* Get metadata for cache. */ -router.post('/cache/metadata', function (req, res) { - _client(req.currentUserId()) - .then((client) => client.ignite(req.body.demo).cache(req.body.cacheName).metadata()) - .then((caches) => { - var types = []; - - for (var meta of caches) { - var cacheTypes = meta.types.map(function (typeName) { - var fields = meta.fields[typeName]; - - var columns = []; - - for (var fieldName in fields) { - var fieldClass = _compact(fields[fieldName]); - - columns.push({ - type: 'field', - name: fieldName, - clazz: fieldClass, - system: fieldName == "_KEY" || fieldName == "_VAL", - cacheName: meta.cacheName, - typeName: typeName - }); - } - - var indexes = []; - - for (var index of meta.indexes[typeName]) { - fields = []; - - for (var field of index.fields) { - fields.push({ - type: 'index-field', - name: field, - order: index.descendings.indexOf(field) < 0, - unique: index.unique, - cacheName: meta.cacheName, - typeName: typeName - }); - } - - if (fields.length > 0) - indexes.push({ - type: 'index', - name: index.name, - children: fields, - cacheName: meta.cacheName, - typeName: typeName - }); - } - - columns = _.sortBy(columns, 'name'); - - if (!_.isEmpty(indexes)) - columns = columns.concat({type: 'indexes', name: 'Indexes', cacheName: meta.cacheName, typeName: typeName, children: indexes }); - - return {type: 'type', cacheName: meta.cacheName || "", typeName: typeName, children: columns }; - }); - - if (!_.isEmpty(cacheTypes)) - types = types.concat(cacheTypes); - } - - res.json(types); - }) - .catch(_handleException(res)); -}); - -/* Ping client. */ -router.post('/ping', function (req, res) { - _client(req.currentUserId()) - .then(() => res.sendStatus(200)) - .catch(_handleException(res)); -}); - -/* Get JDBC drivers list. */ -router.post('/drivers', function (req, res) { - _client(req.currentUserId()) - .then((client) => client.availableDrivers()) - .then((arr) => res.json(arr)) - .catch(_handleException(res)); -}); - -/** Get database schemas. */ -router.post('/schemas', function (req, res) { - _client(req.currentUserId()) - .then((client) => { - var args = req.body; - - args.jdbcInfo = {user: args.user, password: args.password}; - - return client.metadataSchemas(args.jdbcDriverJar, args.jdbcDriverClass, args.jdbcUrl, args.jdbcInfo) - }) - .then((arr) => res.json(arr)) - .catch(_handleException(res)); -}); - -/** Get database tables. */ -router.post('/tables', function (req, res) { - _client(req.currentUserId()) - .then((client) => { - var args = req.body; - - args.jdbcInfo = {user: args.user, password: args.password}; - - return client.metadataTables(args.jdbcDriverJar, args.jdbcDriverClass, args.jdbcUrl, args.jdbcInfo, args.schemas, args.tablesOnly) - }) - .then((arr) => res.json(arr)) - .catch(_handleException(res)); -}); - -module.exports = router; http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/routes/caches.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/routes/caches.js b/modules/control-center-web/src/main/js/routes/caches.js deleted file mode 100644 index 0fda48e..0000000 --- a/modules/control-center-web/src/main/js/routes/caches.js +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var _ = require('lodash'); -var router = require('express').Router(); -var db = require('../db'); - -/** - * Get spaces and caches accessed for user account. - * - * @param req Request. - * @param res Response. - */ -router.post('/list', function (req, res) { - var user_id = req.currentUserId(); - - // Get owned space and all accessed space. - db.Space.find({$or: [{owner: user_id}, {usedBy: {$elemMatch: {account: user_id}}}]}, function (err, spaces) { - if (db.processed(err, res)) { - var space_ids = spaces.map(function (value) { - return value._id; - }); - - // Get all clusters for spaces. - db.Cluster.find({space: {$in: space_ids}}, '_id name caches').sort('name').exec(function (err, clusters) { - if (db.processed(err, res)) { - // Get all domain models for spaces. - db.DomainModel.find({space: {$in: space_ids}}).sort('name').exec(function (err, domains) { - if (db.processed(err, res)) { - // Get all caches for spaces. - db.Cache.find({space: {$in: space_ids}}).sort('name').exec(function (err, caches) { - if (db.processed(err, res)) { - _.forEach(clusters, function (cluster) { - cluster.caches = _.filter(cluster.caches, function (cacheId) { - return _.find(caches, {_id: cacheId}); - }); - }); - - _.forEach(domains, function (domain) { - domain.caches = _.filter(domain.caches, function (cacheId) { - return _.find(caches, {_id: cacheId}); - }); - }); - - _.forEach(caches, function (cache) { - // Remove deleted clusters. - cache.clusters = _.filter(cache.clusters, function (clusterId) { - return _.findIndex(clusters, function (cluster) { - return cluster._id.equals(clusterId); - }) >= 0; - }); - - // Remove deleted domain models. - cache.domains = _.filter(cache.domains, function (metaId) { - return _.findIndex(domains, function (domain) { - return domain._id.equals(metaId); - }) >= 0; - }); - }); - - res.json({ - spaces: spaces, - clusters: clusters.map(function (cluster) { - return {value: cluster._id, label: cluster.name, caches: cluster.caches}; - }), - domains: domains, - caches: caches - }); - } - }); - } - }); - } - }); - } - }); -}); - -/** - * Save cache. - */ -router.post('/save', function (req, res) { - var params = req.body; - var cacheId = params._id; - var clusters = params.clusters; - var domains = params.domains; - - if (params._id) { - db.Cache.update({_id: cacheId}, params, {upsert: true}, function (err) { - if (db.processed(err, res)) - db.Cluster.update({_id: {$in: clusters}}, {$addToSet: {caches: cacheId}}, {multi: true}, function (err) { - if (db.processed(err, res)) - db.Cluster.update({_id: {$nin: clusters}}, {$pull: {caches: cacheId}}, {multi: true}, function (err) { - if (db.processed(err, res)) - db.DomainModel.update({_id: {$in: domains}}, {$addToSet: {caches: cacheId}}, {multi: true}, function (err) { - if (db.processed(err, res)) - db.DomainModel.update({_id: {$nin: domains}}, {$pull: {caches: cacheId}}, {multi: true}, function (err) { - if (db.processed(err, res)) - res.send(params._id); - }); - }); - }); - }); - }) - } - else - db.Cache.findOne({space: params.space, name: params.name}, function (err, cache) { - if (db.processed(err, res)) { - if (cache) - return res.status(500).send('Cache with name: "' + cache.name + '" already exist.'); - - (new db.Cache(params)).save(function (err, cache) { - if (db.processed(err, res)) { - cacheId = cache._id; - - db.Cluster.update({_id: {$in: clusters}}, {$addToSet: {caches: cacheId}}, {multi: true}, function (err) { - if (db.processed(err, res)) - db.DomainModel.update({_id: {$in: domains}}, {$addToSet: {caches: cacheId}}, {multi: true}, function (err) { - if (db.processed(err, res)) - res.send(cacheId); - }); - }); - } - }); - } - }); -}); - -/** - * Remove cache by ._id. - */ -router.post('/remove', function (req, res) { - db.Cache.remove(req.body, function (err) { - if (db.processed(err, res)) - res.sendStatus(200); - }) -}); - -/** - * Remove all caches. - */ -router.post('/remove/all', function (req, res) { - var user_id = req.currentUserId(); - - // Get owned space and all accessed space. - db.Space.find({$or: [{owner: user_id}, {usedBy: {$elemMatch: {account: user_id}}}]}, function (err, spaces) { - if (db.processed(err, res)) { - var space_ids = spaces.map(function (value) { - return value._id; - }); - - db.Cache.remove({space: {$in: space_ids}}, function (err) { - if (err) - return res.status(500).send(err.message); - - db.Cluster.update({space: {$in: space_ids}}, {caches: []}, {multi: true}, function (err) { - if (db.processed(err, res)) - db.DomainModel.update({space: {$in: space_ids}}, {caches: []}, {multi: true}, function (err) { - if (db.processed(err, res)) - res.sendStatus(200); - }); - }); - }) - } - }); -}); - -module.exports = router; http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/routes/clusters.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/routes/clusters.js b/modules/control-center-web/src/main/js/routes/clusters.js deleted file mode 100644 index b29af37..0000000 --- a/modules/control-center-web/src/main/js/routes/clusters.js +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var _ = require('lodash'); -var router = require('express').Router(); -var db = require('../db'); - -/** - * Get spaces and clusters accessed for user account. - * - * @param req Request. - * @param res Response. - */ -router.post('/list', function (req, res) { - var user_id = req.currentUserId(); - - // Get owned space and all accessed space. - db.Space.find({$or: [{owner: user_id}, {usedBy: {$elemMatch: {account: user_id}}}]}, function (err, spaces) { - if (db.processed(err, res)) { - var space_ids = spaces.map(function (value) { - return value._id; - }); - - // Get all caches for spaces. - db.Cache.find({space: {$in: space_ids}}).sort('name').deepPopulate('domains').exec(function (err, caches) { - if (db.processed(err, res)) { - // Get all IGFSs for spaces. - db.Igfs.find({space: {$in: space_ids}}).sort('name').exec(function (err, igfss) { - if (db.processed(err, res)) - // Get all clusters for spaces. - db.Cluster.find({space: {$in: space_ids}}).sort('name').deepPopulate(db.ClusterDefaultPopulate).exec(function (err, clusters) { - if (db.processed(err, res)) { - _.forEach(caches, function (cache) { - // Remove deleted caches. - cache.clusters = _.filter(cache.clusters, function (clusterId) { - return _.find(clusters, {_id: clusterId}); - }); - }); - - _.forEach(igfss, function (igfs) { - // Remove deleted caches. - igfs.clusters = _.filter(igfs.clusters, function (clusterId) { - return _.find(clusters, {_id: clusterId}); - }); - }); - - _.forEach(clusters, function (cluster) { - // Remove deleted caches. - cluster.caches = _.filter(cluster.caches, function (cacheId) { - return _.find(caches, {_id: cacheId}); - }); - - // Remove deleted IGFS. - cluster.igfss = _.filter(cluster.igfss, function (igfsId) { - return _.findIndex(igfss, function (igfs) { - return igfs._id.equals(igfsId); - }) >= 0; - }); - }); - - res.json({spaces: spaces, caches: caches, igfss: igfss, clusters: clusters}); - } - }); - }); - } - }); - } - }); -}); - -/** - * Save cluster. - */ -router.post('/save', function (req, res) { - var params = req.body; - var clusterId = params._id; - var caches = params.caches; - - if (params._id) - db.Cluster.update({_id: params._id}, params, {upsert: true}, function (err) { - if (db.processed(err, res)) - db.Cache.update({_id: {$in: caches}}, {$addToSet: {clusters: clusterId}}, {multi: true}, function(err) { - if (db.processed(err, res)) { - db.Cache.update({_id: {$nin: caches}}, {$pull: {clusters: clusterId}}, {multi: true}, function(err) { - if (db.processed(err, res)) - res.send(params._id); - }); - } - }); - }); - else { - db.Cluster.findOne({space: params.space, name: params.name}, function (err, cluster) { - if (db.processed(err, res)) { - if (cluster) - return res.status(500).send('Cluster with name: "' + cluster.name + '" already exist.'); - - (new db.Cluster(params)).save(function (err, cluster) { - if (db.processed(err, res)) { - clusterId = cluster._id; - - db.Cache.update({_id: {$in: caches}}, {$addToSet: {clusters: clusterId}}, {multi: true}, function (err) { - if (db.processed(err, res)) - res.send(clusterId); - }); - } - }); - } - }); - } -}); - -/** - * Remove cluster by ._id. - */ -router.post('/remove', function (req, res) { - db.Cluster.remove(req.body, function (err) { - if (err) - return res.status(500).send(err.message); - - res.sendStatus(200); - }) -}); - -/** - * Remove all clusters. - */ -router.post('/remove/all', function (req, res) { - var user_id = req.currentUserId(); - - // Get owned space and all accessed space. - db.Space.find({$or: [{owner: user_id}, {usedBy: {$elemMatch: {account: user_id}}}]}, function (err, spaces) { - if (db.processed(err, res)) { - var space_ids = spaces.map(function (value) { - return value._id; - }); - - db.Cluster.remove({space: {$in: space_ids}}, function (err) { - if (err) - return res.status(500).send(err.message); - - db.Cache.update({space: {$in: space_ids}}, {clusters: []}, {multi: true}, function (err) { - if (db.processed(err, res)) - db.Igfs.update({space: {$in: space_ids}}, {clusters: []}, {multi: true}, function (err) { - if (db.processed(err, res)) - res.sendStatus(200); - }); - }); - }) - } - }); -}); - -module.exports = router; http://git-wip-us.apache.org/repos/asf/ignite/blob/721a1165/modules/control-center-web/src/main/js/routes/domains.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/routes/domains.js b/modules/control-center-web/src/main/js/routes/domains.js deleted file mode 100644 index 302cb59..0000000 --- a/modules/control-center-web/src/main/js/routes/domains.js +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var async = require('async'); -var _ = require('lodash'); -var router = require('express').Router(); -var db = require('../db'); - -/** - * Get spaces and domain models accessed for user account. - * - * @param req Request. - * @param res Response. - */ -router.post('/list', function (req, res) { - var user_id = req.currentUserId(); - - // Get owned space and all accessed space. - db.Space.find({$or: [{owner: user_id}, {usedBy: {$elemMatch: {account: user_id}}}]}, function (err, spaces) { - if (db.processed(err, res)) { - var space_ids = spaces.map(function (value) { - return value._id; - }); - - // Get all clusters for spaces. - db.Cluster.find({space: {$in: space_ids}}, '_id name').sort('name').exec(function (err, clusters) { - if (db.processed(err, res)) { - // Get all caches for spaces. - db.Cache.find({space: {$in: space_ids}}).sort('name').exec(function (err, caches) { - if (db.processed(err, res)) { - // Get all domain models for spaces. - db.DomainModel.find({space: {$in: space_ids}}).sort('valueType').exec(function (err, domains) { - if (db.processed(err, res)) { - _.forEach(caches, function (cache) { - cache.domains = _.filter(cache.domains, function (metaId) { - return _.find(domains, {_id: metaId}); - }); - }); - - // Remove deleted caches. - _.forEach(domains, function (domain) { - domain.caches = _.filter(domain.caches, function (cacheId) { - return _.find(caches, {_id: cacheId}); - }); - }); - - res.json({ - spaces: spaces, - clusters: clusters.map(function (cluster) { - return {value: cluster._id, label: cluster.name}; - }), - caches: caches, - domains: domains - }); - } - }); - } - }); - } - }); - } - }); -}); - -function _saveDomainModel(domain, savedDomains, callback) { - var domainId = domain._id; - var caches = domain.caches; - - var cacheStoreChanges = domain.cacheStoreChanges; - - if (domainId) - db.DomainModel.update({_id: domain._id}, domain, {upsert: true}, function (err) { - if (err) - callback(err); - else - db.Cache.update({_id: {$in: caches}}, {$addToSet: {domains: domainId}}, {multi: true}, function (err) { - if (err) - callback(err); - else - db.Cache.update({_id: {$nin: caches}}, {$pull: {domains: domainId}}, {multi: true}, function (err) { - if (err) - callback(err); - else { - savedDomains.push(domain); - - _updateCacheStore(cacheStoreChanges, callback); - } - }); - }); - }); - else - db.DomainModel.findOne({space: domain.space, valueType: domain.valueType}, function (err, found) { - if (err) - callback(err); - else if (found) - return callback('Domain model with value type: "' + found.valueType + '" already exist.'); - - (new db.DomainModel(domain)).save(function (err, domain) { - if (err) - callback(err); - else { - domainId = domain._id; - - db.Cache.update({_id: {$in: caches}}, {$addToSet: {domains: domainId}}, {multi: true}, function (err) { - if (err) - callback(err); - else { - savedDomains.push(domain); - - _updateCacheStore(cacheStoreChanges, callback); - } - }); - } - }); - }); -} - -function _updateCacheStore(cacheStoreChanges, callback) { - if (cacheStoreChanges && cacheStoreChanges.length > 0) { - async.forEachOf(cacheStoreChanges, function (change, idx, callback) { - db.Cache.update({_id: {$eq: change.cacheId}}, change.change, {}, function (err) { - if (err) - callback(err); - else - callback(); - }); - }, callback); - } - else - callback(); -} - -function _save(domains, res) { - var savedDomains = []; - var generatedCaches = []; - - if (domains && domains.length > 0) - async.forEachOf(domains, function(domain, idx, callback) { - if (domain.newCache) { - db.Cache.findOne({space: domain.space, name: domain.newCache.name}, function (err, cache) { - if (db.processed(err, res)) - if (cache) { - // Cache already exists, just save domain model. - domain.caches = [cache._id]; - - _saveDomainModel(domain, savedDomains, callback); - } - else { - // If cache not found, then create it and associate with domain model. - var newCache = domain.newCache; - newCache.space = domain.space; - - (new db.Cache(newCache)).save(function (err, cache) { - var cacheId = cache._id; - - if (db.processed(err, res)) { - db.Cluster.update({_id: {$in: cache.clusters}}, {$addToSet: {caches: cacheId}}, {multi: true}, function (err) { - if (db.processed(err, res)) { - domain.caches = [cacheId]; - generatedCaches.push(cache); - - _saveDomainModel(domain, savedDomains, callback); - } - }); - } - }); - } - }); - } - else - _saveDomainModel(domain, savedDomains, callback); - }, function (err) { - if (err) - res.status(500).send(err.message); - else - res.send({ savedDomains: savedDomains, generatedCaches: generatedCaches }); - }); - else - res.status(500).send('Nothing to save!'); -} - -/** - * Save domain model. - */ -router.post('/save', function (req, res) { - _save([req.body], res); -}); - -/** - * Batch save domain models. - */ -router.post('/save/batch', function (req, res) { - _save(req.body, res); -}); - -/** - * Remove domain model by ._id. - */ -router.post('/remove', function (req, res) { - db.DomainModel.remove(req.body, function (err) { - if (db.processed(err, res)) - res.sendStatus(200); - }) -}); - -/** - * Remove all domain models. - */ -router.post('/remove/all', function (req, res) { - var user_id = req.currentUserId(); - - // Get owned space and all accessed space. - db.Space.find({$or: [{owner: user_id}, {usedBy: {$elemMatch: {account: user_id}}}]}, function (err, spaces) { - if (db.processed(err, res)) { - var space_ids = spaces.map(function (value) { - return value._id; - }); - - db.DomainModel.remove({space: {$in: space_ids}}, function (err) { - if (err) - return res.status(500).send(err.message); - - db.Cache.update({space: {$in: space_ids}}, {domains: []}, {multi: true}, function (err) { - if (db.processed(err, res)) - res.sendStatus(200); - }); - }) - } - }); -}); - -/** - * Remove all generated demo domain models and caches. - */ -router.post('/remove/demo', function (req, res) { - var user_id = req.currentUserId(); - - // Get owned space and all accessed space. - db.Space.find({$or: [{owner: user_id}, {usedBy: {$elemMatch: {account: user_id}}}]}, function (err, spaces) { - if (db.processed(err, res)) { - var space_ids = spaces.map(function (value) { - return value._id; - }); - - // Remove all demo domain models. - db.DomainModel.remove({$and: [{space: {$in: space_ids}}, {demo: true}]}, function (err) { - if (err) - return res.status(500).send(err.message); - - // Remove all demo caches. - db.Cache.remove({$and: [{space: {$in: space_ids}}, {demo: true}]}, function (err) { - if (err) - return res.status(500).send(err.message); - - res.sendStatus(200); - }); - }); - } - }); -}); - - -module.exports = router;
