UNPKG

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