From 798e81ded2d41f6a30198c27e9424197559b0813 Mon Sep 17 00:00:00 2001 From: Kristofor Carle Date: Wed, 22 Jul 2015 11:13:07 -0400 Subject: [PATCH 1/2] include actual user names and UIDs in the data --- routes/nodes.js | 117 +++++++++++++++++++++-------------------- services/query-ways.js | 34 +++++++++--- services/xml.js | 8 +-- 3 files changed, 92 insertions(+), 67 deletions(-) diff --git a/routes/nodes.js b/routes/nodes.js index 9b0b6ed..d336a24 100644 --- a/routes/nodes.js +++ b/routes/nodes.js @@ -1,66 +1,71 @@ 'use strict'; var Boom = require('boom'); var Promise = require('bluebird'); +var _ = require('lodash'); var knex = require('../connection.js'); var XML = require('../services/xml.js'); var Node = require('../models/node-model.js'); module.exports = { - /** - * @api {get} /xml/node/:id Get node by Id - * @apiGroup Features - * @apiName XmlNode - * @apiDescription Returns OSM XML of requested Node. - * @apiVersion 0.1.0 - * - * @apiParam {Number} nodeId Node ID. - * - * @apiSuccess {XML} node Node - * @apiSuccess {String} node.id Entity ID - * @apiSuccess {String} node.visible Whether entity can be rendered - * @apiSuccess {String} node.version Number of edits made to this entity - * @apiSuccess {String} node.changeset Most recent changeset - * @apiSuccess {String} node.timestamp Most recent edit - * @apiSuccess {String} node.user User that created entity - * @apiSuccess {String} node.uid User ID that created entity - * @apiSuccess {String} node.lat Entity latitude - * @apiSuccess {String} node.lon Entity longitude - * - * @apiExample {curl} Example Usage: - * curl http://localhost:4000/xml/node/74038 - * - * @apiSuccessExample {xml} Success-Response: - * - * - * - */ - method: 'GET', - path: '/xml/node/{nodeId}', - handler: function (req, res) { - var nodeId = parseInt(req.params.nodeId || '', 10); - if (!nodeId || isNaN(nodeId)) { - return res(Boom.badRequest('Node ID must be a non-zero number')); - } + /** + * @api {get} /xml/node/:id Get node by Id + * @apiGroup Features + * @apiName XmlNode + * @apiDescription Returns OSM XML of requested Node. + * @apiVersion 0.1.0 + * + * @apiParam {Number} nodeId Node ID. + * + * @apiSuccess {XML} node Node + * @apiSuccess {String} node.id Entity ID + * @apiSuccess {String} node.visible Whether entity can be rendered + * @apiSuccess {String} node.version Number of edits made to this entity + * @apiSuccess {String} node.changeset Most recent changeset + * @apiSuccess {String} node.timestamp Most recent edit + * @apiSuccess {String} node.user User that created entity + * @apiSuccess {String} node.uid User ID that created entity + * @apiSuccess {String} node.lat Entity latitude + * @apiSuccess {String} node.lon Entity longitude + * + * @apiExample {curl} Example Usage: + * curl http://localhost:4000/xml/node/74038 + * + * @apiSuccessExample {xml} Success-Response: + * + * + * + */ + method: 'GET', + path: '/xml/node/{nodeId}', + handler: function (req, res) { + var nodeId = parseInt(req.params.nodeId || '', 10); + if (!nodeId || isNaN(nodeId)) { + return res(Boom.badRequest('Node ID must be a non-zero number')); + } - Promise.all([ - knex('current_nodes').where('id', nodeId), - knex('current_node_tags').where('node_id', nodeId) - ]) - .then(function (result) { - var xmlDoc = XML.write({ - nodes: Node.withTags(result[0], result[1], 'node_id'), - }); - var response = res(xmlDoc.toString()); - response.type('text/xml'); - }) - .catch(function (err) { - console.log(err); - res(Boom.wrap(err)); - }); - } -}; + Promise.all([ + knex.select('current_nodes.*', 'users.display_name as user', 'users.id as uid') + .from('current_nodes') + .leftJoin('changesets', 'current_nodes.changeset_id', 'changesets.id') + .leftJoin('users', 'changesets.user_id', 'users.id') + .where('current_nodes.id', nodeId), + knex('current_node_tags').where('node_id', nodeId) + ]) + .then(function (result) { + var xmlDoc = XML.write({ + nodes: Node.withTags(result[0], result[1], 'node_id'), + }); + var response = res(xmlDoc.toString()); + response.type('text/xml'); + }) + .catch(function (err) { + console.log(err); + res(Boom.wrap(err)); + }); + } + }; diff --git a/services/query-ways.js b/services/query-ways.js index 5279b91..54a30e2 100644 --- a/services/query-ways.js +++ b/services/query-ways.js @@ -6,16 +6,28 @@ module.exports = function queryWays(knex, wayIds) { // helper to make raw queries, because knex version of these // simple selects was MUCH slower - function select(table, key, ids) { + function selectWithUserInfo(table, key, ids) { if(ids.length === 0) return Promise.resolve([]); - return knex.raw('select * from '+table + - ' where '+key+' in ('+ ids.join(',') + ')') + return knex.raw('select a.*, c.display_name as user, c.id as uid from '+table + + ' a left join changesets b on a.changeset_id = b.id' + + ' left join users c on b.user_id = c.id ' + + ' where a.'+key+' in ('+ ids.join(',') + ')') .then(function (resp) { return resp.rows; }); } + function select(table, key, ids) { + if(ids.length === 0) + return Promise.resolve([]); + return knex.raw('select * from '+table + + ' where '+key+' in ('+ ids.join(',') + ')') + .then(function (resp) { + return resp.rows; + }); + } + // Query the desired ways and any way_nodes that are in those ways // Also query any relations that those ways are a part of. @@ -23,7 +35,11 @@ module.exports = function queryWays(knex, wayIds) { // or other relations that are part of relations. return Promise.all([ - knex('current_ways').whereIn('id', wayIds), + knex.select('current_ways.*', 'users.display_name as user', 'users.id as uid') + .from('current_ways') + .leftJoin('changesets', 'current_ways.changeset_id', 'changesets.id') + .leftJoin('users', 'changesets.user_id', 'users.id') + .whereIn('current_ways.id', wayIds), knex('current_way_nodes') .orderBy('sequence_id', 'asc') .whereIn('way_id', wayIds), @@ -44,10 +60,10 @@ module.exports = function queryWays(knex, wayIds) { var relationIds = _.pluck(result[2], 'relation_id'); return Promise.all(result.concat([ - select('current_nodes', 'id', nodeIds), + selectWithUserInfo('current_nodes', 'id', nodeIds), select('current_way_tags', 'way_id', wayIds), select('current_node_tags', 'node_id', nodeIds), - select('current_relations', 'id', relationIds), + selectWithUserInfo('current_relations', 'id', relationIds), select('current_relation_tags', 'relation_id', relationIds) ])); }) @@ -84,7 +100,11 @@ module.exports = function queryWays(knex, wayIds) { return result; - }); + }) + .catch(function (err) { + console.log(err); + res(Boom.wrap(err)); + }); }; diff --git a/services/xml.js b/services/xml.js index 4eb788b..ae6598f 100644 --- a/services/xml.js +++ b/services/xml.js @@ -114,8 +114,8 @@ var xml = { version: node.version, changeset: node.changeset_id, timestamp: node.timestamp, - user: 'DevelopmentSeed', - uid: 1, + user: node.user, + uid: node.uid, lat: node.latitude / RATIO, lon: node.longitude / RATIO }); @@ -140,8 +140,8 @@ var xml = { version: way.version, changeset: way.changeset_id, timestamp: way.timestamp, - user: 'DevelopmentSeed', - uid: 1 + user: way.user, + uid: way.uid }); // Use the sequence ID to make sure nodes are ordered correctly. From 92e7cd97146ee425fbc4b7e991421a86a6d178a4 Mon Sep 17 00:00:00 2001 From: Kristofor Carle Date: Wed, 22 Jul 2015 11:43:39 -0400 Subject: [PATCH 2/2] fix indent spacing --- routes/nodes.js | 121 ++++++++++++++++++++++++------------------------ 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/routes/nodes.js b/routes/nodes.js index d336a24..e1befe5 100644 --- a/routes/nodes.js +++ b/routes/nodes.js @@ -1,71 +1,70 @@ 'use strict'; var Boom = require('boom'); var Promise = require('bluebird'); -var _ = require('lodash'); var knex = require('../connection.js'); var XML = require('../services/xml.js'); var Node = require('../models/node-model.js'); module.exports = { - /** - * @api {get} /xml/node/:id Get node by Id - * @apiGroup Features - * @apiName XmlNode - * @apiDescription Returns OSM XML of requested Node. - * @apiVersion 0.1.0 - * - * @apiParam {Number} nodeId Node ID. - * - * @apiSuccess {XML} node Node - * @apiSuccess {String} node.id Entity ID - * @apiSuccess {String} node.visible Whether entity can be rendered - * @apiSuccess {String} node.version Number of edits made to this entity - * @apiSuccess {String} node.changeset Most recent changeset - * @apiSuccess {String} node.timestamp Most recent edit - * @apiSuccess {String} node.user User that created entity - * @apiSuccess {String} node.uid User ID that created entity - * @apiSuccess {String} node.lat Entity latitude - * @apiSuccess {String} node.lon Entity longitude - * - * @apiExample {curl} Example Usage: - * curl http://localhost:4000/xml/node/74038 - * - * @apiSuccessExample {xml} Success-Response: - * - * - * - */ - method: 'GET', - path: '/xml/node/{nodeId}', - handler: function (req, res) { - var nodeId = parseInt(req.params.nodeId || '', 10); - if (!nodeId || isNaN(nodeId)) { - return res(Boom.badRequest('Node ID must be a non-zero number')); - } - - Promise.all([ - knex.select('current_nodes.*', 'users.display_name as user', 'users.id as uid') - .from('current_nodes') - .leftJoin('changesets', 'current_nodes.changeset_id', 'changesets.id') - .leftJoin('users', 'changesets.user_id', 'users.id') - .where('current_nodes.id', nodeId), - knex('current_node_tags').where('node_id', nodeId) - ]) - .then(function (result) { - var xmlDoc = XML.write({ - nodes: Node.withTags(result[0], result[1], 'node_id'), - }); - var response = res(xmlDoc.toString()); - response.type('text/xml'); - }) - .catch(function (err) { - console.log(err); - res(Boom.wrap(err)); - }); + /** + * @api {get} /xml/node/:id Get node by Id + * @apiGroup Features + * @apiName XmlNode + * @apiDescription Returns OSM XML of requested Node. + * @apiVersion 0.1.0 + * + * @apiParam {Number} nodeId Node ID. + * + * @apiSuccess {XML} node Node + * @apiSuccess {String} node.id Entity ID + * @apiSuccess {String} node.visible Whether entity can be rendered + * @apiSuccess {String} node.version Number of edits made to this entity + * @apiSuccess {String} node.changeset Most recent changeset + * @apiSuccess {String} node.timestamp Most recent edit + * @apiSuccess {String} node.user User that created entity + * @apiSuccess {String} node.uid User ID that created entity + * @apiSuccess {String} node.lat Entity latitude + * @apiSuccess {String} node.lon Entity longitude + * + * @apiExample {curl} Example Usage: + * curl http://localhost:4000/xml/node/74038 + * + * @apiSuccessExample {xml} Success-Response: + * + * + * + */ + method: 'GET', + path: '/xml/node/{nodeId}', + handler: function (req, res) { + var nodeId = parseInt(req.params.nodeId || '', 10); + if (!nodeId || isNaN(nodeId)) { + return res(Boom.badRequest('Node ID must be a non-zero number')); } - }; + + Promise.all([ + knex.select('current_nodes.*', 'users.display_name as user', 'users.id as uid') + .from('current_nodes') + .leftJoin('changesets', 'current_nodes.changeset_id', 'changesets.id') + .leftJoin('users', 'changesets.user_id', 'users.id') + .where('current_nodes.id', nodeId), + knex('current_node_tags').where('node_id', nodeId) + ]) + .then(function (result) { + var xmlDoc = XML.write({ + nodes: Node.withTags(result[0], result[1], 'node_id'), + }); + var response = res(xmlDoc.toString()); + response.type('text/xml'); + }) + .catch(function (err) { + console.log(err); + res(Boom.wrap(err)); + }); + } +};