UNPKG

3.63 kBJavaScriptView Raw
1var config = require('../lib/config')();
2var Changeset = require('./Changeset');
3var queries = require('./queries');
4var queue = require('d3-queue').queue;
5var pg = require('pg');
6require('../validators');
7var validate = require('validate.js');
8var errors = require('../errors');
9
10var changesets = {};
11
12module.exports = changesets;
13
14var pgURL = config.PostgresURL;
15
16changesets.search = function(params, callback) {
17 var parseError = validateParams(params);
18 if (parseError) {
19 return callback(new errors.ParseError(parseError));
20 }
21 var searchQuery = queries.getSearchQuery(params);
22 var countQuery = queries.getCountQuery(params);
23 console.log('searchQ', searchQuery);
24 console.log('countQ', countQuery);
25 var q = queue(2);
26 pg.connect(pgURL, function(err, client, done) {
27 if (err) {
28 callback(err, null);
29 return;
30 }
31 q.defer(client.query.bind(client), searchQuery.text, searchQuery.values);
32 q.defer(client.query.bind(client), countQuery.text, countQuery.values);
33 q.awaitAll(function(err, results) {
34 done();
35 if (err) {
36 callback(err, null);
37 return;
38 }
39 var searchResult = results[0];
40 var countResult = results[1];
41 var changesetsArray = searchResult.rows.map(function(row) {
42 var changeset = new Changeset(row);
43 return changeset.getGeoJSON();
44 });
45 var count;
46 if (countResult.rows.length > 0) {
47 count = countResult.rows[0].count;
48 } else {
49 count = 0;
50 }
51 var featureCollection = {
52 'type': 'FeatureCollection',
53 'features': changesetsArray,
54 'total': count
55 };
56 callback(null, featureCollection);
57 });
58 });
59};
60
61changesets.get = function(id, callback) {
62 if (!validate.isNumber(parseInt(id, 10))) {
63 return callback(new errors.ParseError('Changeset id must be a number'));
64 }
65 var changesetQuery = queries.getChangesetQuery(id);
66 var changesetCommentsQuery = queries.getChangesetCommentsQuery(id);
67 var q = queue(2);
68 pg.connect(pgURL, function(err, client, done) {
69 if (err) {
70 callback(err, null);
71 return;
72 }
73 q.defer(client.query.bind(client), changesetQuery.text, changesetQuery.values);
74 q.defer(client.query.bind(client), changesetCommentsQuery.text, changesetCommentsQuery.values);
75 q.awaitAll(function(err, results) {
76 done();
77 if (err) {
78 callback(err, null);
79 return;
80 }
81 var changesetResult = results[0];
82 if (changesetResult.rows.length === 0) {
83 return callback(new errors.NotFoundError('Changeset not found'));
84 }
85 var changeset = new Changeset(results[0].rows[0], results[1].rows);
86 callback(null, changeset.getGeoJSON());
87 });
88 });
89};
90
91function validateParams(params) {
92 var constraints = {
93 'from': {
94 'presence': false,
95 'datetime': true
96 },
97 'to': {
98 'presence': false,
99 'datetime': true
100 },
101 'bbox': {
102 'presence': false,
103 'bbox': true
104 }
105 };
106 var errs = validate(params, constraints);
107 if (errs) {
108 var errMsg = Object.keys(errs).map(function(key) {
109 return errs[key][0];
110 }).join(', ');
111 return errMsg;
112 }
113 return null;
114}
\No newline at end of file