UNPKG

3.23 kBJavaScriptView Raw
1var config = require('../lib/config')();
2var Note = require('./Note');
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');
9var notes = {};
10
11module.exports = notes;
12
13var pgURL = config.PostgresURL;
14
15notes.search = function(params, callback) {
16 var parseError = validateParams(params);
17 if (parseError) {
18 return callback(new errors.ParseError(parseError));
19 }
20 var searchQuery = queries.getSearchQuery(params);
21 var countQuery = queries.getCountQuery(params);
22 var q = queue(5);
23 pg.connect(pgURL, function(err, client, done) {
24 if (err) {
25 return callback(err, null);
26 }
27 q.defer(client.query.bind(client), searchQuery.text, searchQuery.values);
28 q.defer(client.query.bind(client), countQuery.text, countQuery.values);
29 q.awaitAll(function(err, results) {
30 done();
31 if (err) {
32 return callback(err, null);
33 }
34 var searchResult = results[0];
35 var countResult = results[1];
36 var notesArray = searchResult.rows.map(function(row) {
37 var note = new Note(row);
38 return note.getGeoJSON();
39 });
40 var count = countResult.rows[0].count;
41 var featureCollection = {
42 'type': 'FeatureCollection',
43 'features': notesArray,
44 'total': count
45 };
46 callback(null, featureCollection);
47 });
48 });
49};
50
51notes.get = function(id, callback) {
52 if (!validate.isNumber(parseInt(id, 10))) {
53 return callback(new errors.ParseError('Note id must be a number'));
54 }
55 var noteQuery = queries.getNoteQuery(id);
56 var noteCommentsQuery = queries.getNoteCommentsQuery(id);
57 var q = queue(2);
58 pg.connect(pgURL, function(err, client, done) {
59 if (err) {
60 return callback(err, null);
61 }
62 q.defer(client.query.bind(client), noteQuery.text, noteQuery.values);
63 q.defer(client.query.bind(client), noteCommentsQuery.text, noteCommentsQuery.values);
64 q.awaitAll(function(err, results) {
65 done();
66 if (err) {
67 return callback(err, null);
68 }
69 var noteResult = results[0];
70 if (noteResult.rows.length === 0) {
71 return callback(new errors.NotFoundError('Note not found'));
72 }
73 var note = new Note(results[0].rows[0], results[1].rows);
74 callback(null, note.getGeoJSON());
75 });
76 });
77};
78
79function validateParams(params) {
80 var constraints = {
81 'from': {
82 'presence': false,
83 'datetime': true
84 },
85 'to': {
86 'presence': false,
87 'datetime': true
88 },
89 'bbox': {
90 'presence': false,
91 'bbox': true
92 }
93 };
94 var errs = validate(params, constraints);
95 if (errs) {
96 var errMsg = Object.keys(errs).map(function(key) {
97 return errs[key][0];
98 }).join(', ');
99 return errMsg;
100 }
101 return null;
102}