forked from monsooncollective/yatayat
-
Notifications
You must be signed in to change notification settings - Fork 3
/
api.node.js
88 lines (78 loc) · 3.18 KB
/
api.node.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
var http = require('http');
var url = require('url');
var yy = require('./yatayat.js')
var conf = require('./config.js')
var _ = require('underscore');
// fetch overpass API data
var system = {};
// split API url into host and path
var options = url.parse(conf.API_URL);
options.method='POST';
var req = http.request(options, function(res) {
res.content = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
//console.log('CHUNK', chunk);
res.content += chunk;
});
res.on('end', function() {
system = yy(res.content);
console.log('got', system.routes.length, 'routes from overpass');
});
});
req.write(conf.QUERY_STRING);
req.end();
function serializeStop(stop) {
return {id: stop.id,
lat: stop.lat,
lng: stop.lng,
name: stop.name};
}
function serializeRoute(route, isPartialRoute) {
// returns a JSON object for a route
var fullRouteBool = !isPartialRoute; // ie. isPartialRoute is falsy
return {id: route.id,
name: route.name,
ref: route.ref,
transport: route.transport,
fullroute: fullRouteBool,
stops: route.stops.map(function(s) { return serializeStop(s); })};
}
function serializeSystem(system) {
return {routes: system.routes.map(function(r) { return serializeRoute(r); })};
}
http.createServer(function (req, res) {
console.log('REQUEST',req.url)
// ALWAYS A JSON RESPONSE
res.writeHead(200, {'Content-Type': 'application/json'});
var reqObj = url.parse(req.url, true);
var path = reqObj.path;
if(! _.keys(system).length) {
res.end("Nothing loaded yet");
} else if (path.indexOf('routes') === 1) {
res.end(JSON.stringify(serializeSystem(system), null, 4));
} else if (path.indexOf('nearestStops') === 1) {
var ll = [reqObj.query.lat, reqObj.query.lng];
var stopArray = system.nearestStops(ll, 2);
res.end(JSON.stringify(stopArray.map(serializeStop),
null, 4));
} else if (path.indexOf('takeMeThere') === 1) {
var routeArray = system.takeMeThere(reqObj.query.startStopID,
reqObj.query.goalStopID);
if (!routeArray.map) { res.end("No route found"); return; }
var ret = routeArray.map(function(r) { return serializeRoute(r,true); });
res.end(JSON.stringify(ret, null, 4));
} else if (path.indexOf('getAllStops') === 1) {
res.end(JSON.stringify(_.map(system.allStops(), serializeStop), null, 4));
} else {
var jsonmessage = {"Access points" : [
{ path: "/routes", description: "returns all routes"},
{ path: "/nearestStops", params: ["lat", "lng"],
description: "nearest stops to lat/lng position"},
{ path: "/takeMeThere", params: ["startStopID", "goalStopID"],
description: "return a list of partial routes to take when going from start to goal"},
{ path: "/getAllStops", description: "returns all stops"}]};
res.end(JSON.stringify(jsonmessage, null, 4));
}
}).listen(8020, "127.0.0.1");
console.log('yatayat api running at http://127.0.0.1:8020/');