diff --git a/NEWS.md b/NEWS.md index 24366d53..78c528c5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,21 +1,13 @@ -1.2.1 +1.1.9 ----- -1.2.0 ------ - -WARNING: starting from this commit the multilayer grid fetching - route changed to NOT include layer name nor interactivity - (now specified solely as part of layergroup configuration) - * Handle SQL API errors by requesting no Varnish cache * Fix X-Cache-Channel for multilayer (by token) responses -* Add last_modified field to POST layergroup response (#72) +* Add last_modified field to layergroup creation response (#72) * Deprecate signal handler for USR1, add handler for USR2 (#71) * Fix support for ampersend characters in CartoCSS * Add support for LZMA compressed GET parameters -* Remove interactivity config from multilayer grid fetching route -* Require interactivity param in single-layer grid fetching request (#69) +* Add support for creating layergroups via GET 1.1.8 ----- diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index a86e7d66..b4e47c43 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -216,9 +216,8 @@ module.exports = function(){ }); }; - me.afterLayergroupCreate = function(req, response, callback) { + me.afterLayergroupCreate = function(req, mapconfig, response, callback) { var token = response.layergroupid; - var mapconfig = req.body; var sql = []; _.each(mapconfig.layers, function(lyr) { diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index e63efc57..49c8c01f 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -32,7 +32,7 @@ "version": "0.8.3" }, "npm": { - "version": "1.2.15", + "version": "1.2.16", "dependencies": { "semver": { "version": "1.1.4" @@ -98,7 +98,7 @@ "version": "2.3.0" }, "node-gyp": { - "version": "0.9.3" + "version": "0.9.5" }, "fstream-npm": { "version": "0.1.4", @@ -190,7 +190,7 @@ "version": "1.3.3" }, "windshaft": { - "version": "0.10.0", + "version": "0.11.0", "dependencies": { "grainstore": { "version": "0.12.0", diff --git a/package.json b/package.json index b25456af..5da7c9dd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "windshaft-cartodb", - "version": "1.2.1", + "version": "1.1.9", "description": "A map tile server for CartoDB", "url": "https://github.com/Vizzuality/Windshaft-cartodb", "licenses": [{ @@ -21,7 +21,7 @@ "cluster2": "git://github.com/CartoDB/cluster2.git#cdb_production", "node-varnish": "0.1.1", "underscore" : "~1.3.3", - "windshaft" : "~0.10.0", + "windshaft" : "~0.11.0", "step": "0.0.x", "generic-pool": "~1.0.12", "redis": "0.7.2", diff --git a/test/acceptance/multilayer.js b/test/acceptance/multilayer.js index a08877c3..259c0c6e 100644 --- a/test/acceptance/multilayer.js +++ b/test/acceptance/multilayer.js @@ -26,7 +26,7 @@ suite('multilayer', function() { sqlapi_server = new SQLAPIEmu(global.environment.sqlapi.port, done); }); - test("layergroup with 2 layers, each with its style, grid in layer 0", function(done) { + test("layergroup with 2 layers, each with its style", function(done) { var layergroup = { version: '1.0.0', @@ -34,8 +34,7 @@ suite('multilayer', function() { { options: { sql: 'select cartodb_id, ST_Translate(the_geom_webmercator, 5e6, 0) as the_geom_webmercator from test_table limit 2', cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', - cartocss_version: '2.0.1', - interactivity: [ 'cartodb_id' ] + cartocss_version: '2.0.1' } }, { options: { sql: 'select cartodb_id, ST_Translate(the_geom_webmercator, -5e6, 0) as the_geom_webmercator from test_table limit 2 offset 2', @@ -45,7 +44,7 @@ suite('multilayer', function() { ] }; - var expected_token = "9b8b9742efba192ce6c534c83cba0186"; + var expected_token = "d55208dccb30b5ff972562f563db0d22"; Step( function do_post() { @@ -117,7 +116,7 @@ suite('multilayer', function() { var next = this; assert.response(server, { url: '/tiles/layergroup/' + expected_token - + '/0/0/0.grid.json', + + '/layer0/0/0/0.grid.json?interactivity=cartodb_id', headers: {host: 'localhost' }, method: 'GET' }, {}, function(res) { @@ -129,118 +128,13 @@ suite('multilayer', function() { }); }); }, - function finish(err) { - var errors = []; - if ( err ) { - errors.push(err.message); - console.log("Error: " + err); - } - redis_client.keys("map_style|cartodb_test_user_1_db|~" + expected_token, function(err, matches) { - if ( err ) errors.push(err.message); - assert.equal(matches.length, 1, "Missing expected token " + expected_token + " from redis: " + matches); - redis_client.del(matches, function(err) { - if ( err ) errors.push(err.message); - if ( errors.length ) done(new Error(errors)); - else done(null); - }); - }); - } - ); - }); - - test("layergroup with 2 layers, each with its style, grid in layer 1", function(done) { - - var layergroup = { - version: '1.0.0', - layers: [ - { options: { - sql: 'select cartodb_id, ST_Translate(the_geom_webmercator, 5e6, 0) as the_geom_webmercator from test_table limit 2', - cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', - cartocss_version: '2.0.1', - interactivity: [ 'fake' ] // unused, not being the topmost - } }, - { options: { - sql: 'select cartodb_id, ST_Translate(the_geom_webmercator, -5e6, 0) as the_geom_webmercator from test_table limit 2 offset 2', - cartocss: '#layer { marker-fill:blue; marker-allow-overlap:true; }', - cartocss_version: '2.0.2', - interactivity: [ 'cartodb_id' ] - } } - ] - }; - - var expected_token = "20c5377296dee4124e6fd2f72309c6eb"; - Step( - function do_post() - { - var next = this; - assert.response(server, { - url: '/tiles/layergroup', - method: 'POST', - headers: {host: 'localhost', 'Content-Type': 'application/json' }, - data: JSON.stringify(layergroup) - }, {}, function(res) { - assert.equal(res.statusCode, 200, res.body); - var parsedBody = JSON.parse(res.body); - var expectedBody = { layergroupid: expected_token }; - // check last modified - var qTables = JSON.stringify({ - 'q': 'SELECT CDB_QueryTables($windshaft$' - + layergroup.layers[0].options.sql + ';' - + layergroup.layers[1].options.sql - + '$windshaft$)' - }); - expectedBody.last_updated = JSON.stringify({ - 'q': 'SELECT EXTRACT(EPOCH FROM max(updated_at)) as max ' - + 'FROM CDB_TableMetadata m WHERE m.tabname::name = any (\'{' - + qTables + '}\')' - }); - if ( expected_token ) { - //assert.equal(parsedBody.layergroupid, expectedBody.layergroupid); - //assert.equal(parsedBody.last_updated, expectedBody.last_updated); - assert.deepEqual(parsedBody, expectedBody); - } - else expected_token = parsedBody.layergroupid; - next(null, res); - }); - }, - function do_get_tile(err) - { - if ( err ) throw err; - var next = this; - assert.response(server, { - url: '/tiles/layergroup/' + expected_token + '/0/0/0.png', - method: 'GET', - headers: {host: 'localhost' }, - encoding: 'binary' - }, {}, function(res) { - assert.equal(res.statusCode, 200, res.body); - assert.equal(res.headers['content-type'], "image/png"); - - // Check X-Cache-Channel - var cc = res.headers['x-cache-channel']; - assert.ok(cc); - var dbname = 'cartodb_test_user_1_db' - assert.equal(cc.substring(0, dbname.length), dbname); - var jsonquery = cc.substring(dbname.length+1); - var sentquery = JSON.parse(jsonquery); - assert.equal(sentquery.q, 'SELECT CDB_QueryTables($windshaft$' - + layergroup.layers[0].options.sql + ';' - + layergroup.layers[1].options.sql - + '$windshaft$)'); - - assert.imageEqualsFile(res.body, 'test/fixtures/test_table_0_0_0_multilayer1.png', 2, - function(err, similarity) { - next(err); - }); - }); - }, function do_get_grid_layer1(err) { if ( err ) throw err; var next = this; assert.response(server, { url: '/tiles/layergroup/' + expected_token - + '/0/0/0.grid.json', + + '/layer1/0/0/0.grid.json?interactivity=cartodb_id', headers: {host: 'localhost' }, method: 'GET' }, {}, function(res) { @@ -271,6 +165,7 @@ suite('multilayer', function() { ); }); + test("layergroup can hold substitution tokens", function(done) { var layergroup = { @@ -280,13 +175,12 @@ suite('multilayer', function() { sql: 'select 1 as cartodb_id, ' + 'ST_Buffer(!bbox!, -32*greatest(!pixel_width!,!pixel_height!)) as the_geom_webmercator', cartocss: '#layer { polygon-fill:red; }', - cartocss_version: '2.0.1', - interactivity: ['cartodb_id'] + cartocss_version: '2.0.1' } } ] }; - var expected_token = "71c795a09d5e351c937a0b4bcbd867e5"; + var expected_token = "20f5710c00e3a1b0b4950de65ef0d875"; Step( function do_post() { @@ -386,7 +280,7 @@ suite('multilayer', function() { var next = this; assert.response(server, { url: '/tiles/layergroup/' + expected_token - + '/1/0/0.grid.json', + + '/layer0/1/0/0.grid.json?interactivity=cartodb_id', headers: {host: 'localhost' }, method: 'GET' }, {}, function(res) { @@ -404,7 +298,7 @@ suite('multilayer', function() { var next = this; assert.response(server, { url: '/tiles/layergroup/' + expected_token - + '/4/0/0.grid.json', + + '/layer0/4/0/0.grid.json?interactivity=cartodb_id', headers: {host: 'localhost' }, method: 'GET' }, {}, function(res) {