From 09687b3811b0da498b2c6644f46e8ffec71f2008 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 14 Apr 2016 10:59:51 +0200 Subject: [PATCH] Proper endpoint to check node status from analysis --- lib/cartodb/backends/analysis.js | 49 +++++++++++++++++++++++++++ lib/cartodb/controllers/layergroup.js | 26 +++++++++++--- 2 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 lib/cartodb/backends/analysis.js diff --git a/lib/cartodb/backends/analysis.js b/lib/cartodb/backends/analysis.js new file mode 100644 index 00000000..67a80ed3 --- /dev/null +++ b/lib/cartodb/backends/analysis.js @@ -0,0 +1,49 @@ +var PSQL = require('cartodb-psql'); + +function AnalysisBackend() { +} + +module.exports = AnalysisBackend; + + +AnalysisBackend.prototype.getNodeStatus = function (params, callback) { + var nodeId = params.nodeId; + + var statusQuery = 'SELECT node_id, status, updated_at FROM cdb_analysis_catalog where node_id = \'' + nodeId + '\''; + + var pg = new PSQL(dbParamsFromReqParams(params)); + pg.query(statusQuery, function(err, result) { + if (err) { + return callback(err, result); + } + + result = result || {}; + + var rows = result.rows || []; + + return callback(null, rows[0] || { + node_id: nodeId, + status: 'unknown' + }); + }, true); // use read-only transaction +}; + +function dbParamsFromReqParams(params) { + var dbParams = {}; + if ( params.dbuser ) { + dbParams.user = params.dbuser; + } + if ( params.dbpassword ) { + dbParams.pass = params.dbpassword; + } + if ( params.dbhost ) { + dbParams.host = params.dbhost; + } + if ( params.dbport ) { + dbParams.port = params.dbport; + } + if ( params.dbname ) { + dbParams.dbname = params.dbname; + } + return dbParams; +} \ No newline at end of file diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index fc2ba0e1..b6289619 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -8,6 +8,7 @@ var cors = require('../middleware/cors'); var userMiddleware = require('../middleware/user'); var DataviewBackend = require('../backends/dataview'); +var AnalysisBackend = require('../backends/analysis'); var MapStoreMapConfigProvider = require('../models/mapconfig/map_store_provider'); @@ -41,6 +42,7 @@ function LayergroupController(authApi, pgConnection, mapStore, tileBackend, prev this.layergroupAffectedTables = layergroupAffectedTables; this.dataviewBackend = new DataviewBackend(); + this.analysisBackend = new AnalysisBackend(); } util.inherits(LayergroupController, BaseController); @@ -97,10 +99,26 @@ LayergroupController.prototype.register = function(app) { }; LayergroupController.prototype.analysisNodeStatus = function(req, res) { - this.sendResponse(req, res, { - node_id: req.params.nodeId, - status: 'ready' - }, 200); + var self = this; + + step( + function setupParams() { + self.req2params(req, this); + }, + function retrieveNodeStatus(err) { + assert.ifError(err); + self.analysisBackend.getNodeStatus(req.params, this); + }, + function finish(err, nodeStatus, stats) { + req.profiler.add(stats || {}); + + if (err) { + self.sendError(req, res, err, 'GET NODE STATUS'); + } else { + self.sendResponse(req, res, nodeStatus, 200); + } + } + ); }; LayergroupController.prototype.dataview = function(req, res) {