aviation-api
Version:
[](https://travis-ci.org/cristobal-io/aviation-api)
666 lines (613 loc) • 21.1 kB
JavaScript
"use strict";
require("./env");
var express = require("express");
var app = express();
var debug = require("debug")("aviation:api");
var request = require("superagent");
var aviationModel = require("aviation-model");
app.use(function (req, res, done) {
if (process.env.AVIATION_CORS_ORIGIN) {
res.setHeader("Access-Control-Allow-Origin",
process.env.AVIATION_CORS_ORIGIN);
res.setHeader("Access-Control-Allow-Credentials", true);
}
res.setHeader("Content-Type", "application/json; charset=utf-8");
done();
});
/*
Airports.
*/
/**
* @api {get} /airport/iata/:iata Airport data with the IATA code.
* @apiVersion 0.0.1
* @apiName GetAirportByIata
* @apiGroup Airports
*
* @apiParam (airports) {String{3}} iata IATA code identification of the airport.
* @apiExample Example usage:
* curl -i http://localhost:8081/airport/iata/SFO
*
* @apiSuccessExample {json} SFO
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 247
* {
* "location":"37°37′08″N 122°22′30″W",
* "airport_id":"San_Francisco_International_Airport",
* "latitude":"37°37′08″N",
* "longitude":"122°22′30″W",
* "name":"San Francisco International Airport",
* "nickname":"SFO",
* "iata":"SFO",
* "icao":"KSFO"}
*/
app.get("/airport/iata/:iata", function (req, res, next) {
aviationModel.getAirportJson({
iata: req.params.iata
}, function (err, airport) {
if (err) {
next(err);
}
res.end(JSON.stringify(
airport
));
});
});
/**
* @api {get} /airport/icao/:icao Airport data with the ICAO code.
* @apiVersion 0.0.1
* @apiName GetAirportByIcao
* @apiGroup Airports
*
* @apiParam (airports) {String{4}} icao ICAO code identification of the airport.
* @apiExample Example usage:
* curl -i http://localhost:8081/airport/icao/KSFO
*
* @apiSuccessExample {json} KSFO
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 247
* {
* "location":"37°37′08″N 122°22′30″W",
* "airport_id":"San_Francisco_International_Airport",
* "latitude":"37°37′08″N",
* "longitude":"122°22′30″W",
* "name":"San Francisco International Airport",
* "nickname":"SFO",
* "iata":"SFO",
* "icao":"KSFO"}
*/
app.get("/airport/icao/:icao", function (req, res, next) {
aviationModel.getAirportJson({
icao: req.params.icao.toUpperCase()
}, function (err, airport) {
if (err) {
next(err);
}
res.end(JSON.stringify(airport));
});
});
/**
* @api {get} /airports/radius/?airport_id=:airport_id&radius=:radius Airports in a radius.
* @apiVersion 0.0.1
* @apiName GetRadiusAirports
* @apiGroup Airports
*
* @apiParam (airports) {String} airport_id of the origin.
* @apiParam (airports) {Number} radius in km
* @apiExample Example usage:
* curl -i 'http://localhost:8081/airports/radius/?airport_id=San_Francisco_International_Airport&radius=100'
*
* @apiSuccessExample {json} 100 km radius from SFO
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 4125
* [
* {"airport_id":"San_Francisco_International_Airport","name":"San Francisco International Airport","latitude":"37°37′08″N","longitude":"122°22′30″W","distance":0},
* {"airport_id":"Half_Moon_Bay_Airport","name":"Eddie Andreini Sr. Airfield\nHalf Moon Bay Airport","latitude":"37°30′48″N","longitude":"122°30′04″W","distance":16183.33},
* {"airport_id":"San_Carlos_Airport_(California)","name":"San Carlos Airport","latitude":"37°30′43″N","longitude":"122°14′58″W","distance":16262.58},
* {"airport_id":"Oakland_International_Airport","name":"Oakland International Airport","latitude":"37°43′17″N","longitude":"122°13′15″W","distance":17740.59}
* // until complete all the airports.
* ]
*/
app.get("/airports/radius/", function (req, res, next) {
if (!req.query.airport_id) {
return next();
}
aviationModel.queryData({
searchString: req.query.airport_id + "%",
distance: +req.query.radius * 1000
}, "radiusAirports", function (err, radiusAirports) {
if (err) {
return next(err);
}
res.end(JSON.stringify(radiusAirports));
});
});
/**
* @api {get} /airports/data/?name=:name Airport data from name.
* @apiVersion 0.0.1
* @apiName QueryAirportData
* @apiGroup Airports
*
* @apiParam (airports) {String} name of the origin.
* @apiExample Example usage:
* curl -i 'http://localhost:8081/airports/data/?name=San%Francisco%'
*
* @apiSuccessExample {json} 100 km radius from SFO
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 259
* [{"airport_id":"San_Francisco_International_Airport",
* "latitude":"37°37′08″N",
* "longitude":"122°22′30″W",
* "name":"San Francisco International Airport",
* "nickname":"SFO",
* "iata":"SFO",
* "icao":"KSFO",
* "dd_latitude":37.61888888888889,
* "dd_longitude":-122.375}]
*/
app.get("/airports/data/", function (req, res, next) {
if (!req.query.name) {
return next();
}
aviationModel.queryData({
searchString: req.query.name
}, "airportData", function (err, airportsData) {
if (err) {
next(err);
}
res.end(JSON.stringify(airportsData));
});
});
/**
* @api {get} /airports/runways/?name=:name Airport runways from name.
* @apiVersion 0.0.1
* @apiName GetAirportRunways
* @apiGroup Airports
*
* @apiParam (airports) {String} name of the origin.
* @apiExample Example usage:
* curl -i 'http://localhost:8081/airports/runways/?name=San%Francisco%'
*
* @apiSuccessExample {json} 100 km radius from SFO
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 457
* [{"name":"San Francisco International Airport","direction":"10L/28R","ft":"11,870","m":"3,618","surface":"Asphalt"},
* {"name":"San Francisco International Airport","direction":"10R/28L","ft":"11,381","m":"3,469","surface":"Asphalt"},
* {"name":"San Francisco International Airport","direction":"1R/19L","ft":"8,650","m":"2,637","surface":"Asphalt"},
* {"name":"San Francisco International Airport","direction":"1L/19R","ft":"7,650","m":"2,332","surface":"Asphalt"}]
*/
app.get("/airports/runways/", function (req, res, next) {
if (!req.query.name) {
return next();
}
aviationModel.queryData({
searchString: req.query.name
}, "airportRunways", function (err, runways) {
if (err) {
next(err);
}
res.end(JSON.stringify(runways));
});
});
/**
* @api {get} /airport/data/:type/:value/:method Airport data.
* @apiVersion 0.0.1
* @apiName GetAirportData
* @apiGroup Airports
*
* @apiParam (airports) {String} type airport_id | name | latitude | longitude | nickname | iata | icao.
* @apiParam (airports) {String} value the value according to the type specified.
* @apiParam (airports) {String} [method] airport_id | name | location | latitude | longitude | nickname | iata | icao
*
* if we leave the method empty, the full airport data will be returned.
*
* @apiExample Example usage:
* curl -i http://localhost:8081/airport/data/iata/SFO/location
*
* @apiSuccessExample {json} SFO location
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 34
*
* "37°37′08″N 122°22′30″W"
*/
app.get("/airport/data/:type/:value/:method?", function (req, res, next) {
aviationModel.getAirportData({
type: req.params.type,
value: req.params.value,
method: req.params.method
} , function (err, airportData) {
if (err) {
next(err);
}
res.end(JSON.stringify(airportData));
});
});
/**
* @api {get} /airport/city/:airport_id City from airport_id.
* @apiVersion 0.0.1
* @apiName GetCity
* @apiGroup Airports
*
* @apiParam (airports) {String} airport_id exact airport_id.
*
* @apiExample Example usage:
* curl -i http://localhost:8081/airport/city/San_Jose_International_Airport
*
* @apiSuccessExample {json} SFO location
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Date: Sat, 18 Jun 2016 14:13:15 GMT
* Connection: keep-alive
* Content-Length: 20
*
* San_Jose,_California
*/
app.get("/airport/city/:airport_id", function (req, res, next) {
aviationModel.getCity(
req.params.airport_id,
function (err, city) {
if (err) {
next(err);
}
res.end(JSON.stringify(city));
});
});
/**
* @api {get} /airports/box/?lat1=:lat1&long1=:long1&lat2=lat2&long2=long2 Airports in a bounding box within two coordinates.
* @apiVersion 0.0.1
* @apiName airportsBounds
* @apiGroup Airports
*
* @apiParam (airports) {String} lat1 latitude of first poing.
* @apiParam (airports) {String} long1 longitude of first poing.
* @apiParam (airports) {String} lat2 latitude of second poing.
* @apiParam (airports) {String} long2 longitude of second poing.
*
* @apiExample Example usage:
* curl -i 'http://localhost:8081/airports/box/?lat1=38&long1=-123.5&lat2=37&long2=-122'
*
* @apiSuccessExample {json} SFO area box
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 2038
* [
*
* {"airport_id":"Buchanan_Field_Airport","latitude":"37°59′23″N","longitude":"122°03′25″W","name":"Buchanan International\nConcord Army Air Base","nickname":"CCR","iata":"CCR","icao":"KCCR","dd_latitude":37.98972222222222,"dd_longitude":-122.05694444444444,"airlines_flying":0},
* {"airport_id":"Half_Moon_Bay_Airport","latitude":"37°30′48″N","longitude":"122°30′04″W","name":"Eddie Andreini Sr. Airfield\nHalf Moon Bay Airport","nickname":"HAF","iata":"HAF","icao":"KHAF","dd_latitude":37.513333333333335,"dd_longitude":-122.50111111111111,"airlines_flying":0},
* {"airport_id":"Hayward_Executive_Airport","latitude":"37°39′32″N","longitude":"122°07′18″W","name":"Hayward Executive Airport","nickname":"(former Hayward Army Air Field)","iata":"HWD","icao":"KHWD","dd_latitude":37.65888888888889,"dd_longitude":-122.12166666666666,"airlines_flying":0},
* {"airport_id":"Moffett_Federal_Airfield","latitude":"37°24′54″N","longitude":"122°02′54″W","name":"Moffett Federal Airfield","nickname":"NUQ","iata":"NUQ","icao":"KNUQ","dd_latitude":37.415,"dd_longitude":-122.04833333333333,"airlines_flying":0},
* {"airport_id":"Oakland_International_Airport","latitude":"37°43′17″N","longitude":"122°13′15″W","name":"Oakland International Airport","nickname":"OAK","iata":"OAK","icao":"KOAK","dd_latitude":37.72138888888889,"dd_longitude":-122.22083333333333,"airlines_flying":23},
* {"airport_id":"Palo_Alto_Airport","latitude":"37°27′40″N","longitude":"122°06′54″W","name":"Palo Alto Airport","nickname":"PAO","iata":"PAO","icao":"KPAO","dd_latitude":37.461111111111116,"dd_longitude":-122.115,"airlines_flying":0},
* {"airport_id":"San_Francisco_International_Airport","latitude":"37°37′08″N","longitude":"122°22′30″W","name":"San Francisco International Airport","nickname":"SFO","iata":"SFO","icao":"KSFO","dd_latitude":37.61888888888889,"dd_longitude":-122.375,"airlines_flying":71},
* {"airport_id":"San_Carlos_Airport_(California)","latitude":"37°30′43″N","longitude":"122°14′58″W","name":"San Carlos Airport","nickname":"SQL","iata":"SQL","icao":"KSQL","dd_latitude":37.511944444444445,"dd_longitude":-122.24944444444445,"airlines_flying":0}]
*
*/
app.get("/airports/box/", function (req, res, next) {
aviationModel.airportsBounds({
latitude1: req.query.lat1,
longitude1: req.query.long1,
latitude2: req.query.lat2,
longitude2: req.query.long2
},
function (err, airports) {
if (err) {
next(err);
}
res.end(JSON.stringify(airports));
});
});
/**
* @api {get} /airport/airlines/:airport_id airlines from airport_id.
* @apiVersion 0.0.1
* @apiName GetCity
* @apiGroup Airports
*
* @apiParam (airports) {String} airport_id (accepts wildcard) airport_id.
*
* @apiExample Example usage:
* curl -i http://localhost:8081/airport/airlines/San_Jose_International_Airport
*
* @apiSuccessExample {json} SFO airlines
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 880
*
* [
* {
* "airline_id": "Air_Canada",
* "name": "Air Canada",
* "logo_url": "//upload.wikimedia.org/wikipedia/commons/thumb/2/24/Air_Canada_Logo.svg/250px-Air_Canada_Logo.svg.png",
* "iata": "AC",
* "icao": "ACA",
* "callsign": "AIR CANADA",
* "website": "http://aircanada.com"
* },
* {
* "airline_id": "Air_China",
* "name": "Air China\n中国国际航空公司\nZhōngguó Guójì Hángkōng Gōngsī",
* "logo_url": "//upload.wikimedia.org/wikipedia/en/thumb/9/97/Air_China_Logo.svg/250px-Air_China_Logo.svg.png",
* "iata": "CA",
* "icao": "CCA",
* "callsign": "AIR CHINA",
* "website": "http://www.airchina.com"
* },
* {
* "airline_id": "Alaska_Airlines",
* "name": "Alaska Airlines",
* "logo_url": "//upload.wikimedia.org/wikipedia/en/thumb/b/b3/Alaska_Airlines_Logo.png/300px-Alaska_Airlines_Logo.png",
* "iata": "AS",
* "icao": "ASA",
* "callsign": "ALASKA",
* "website": "https://www.alaskaair.com"
* },
* ....
* ]
*/
app.get("/airport/airlines/:airport_id", function (req, res, next) {
aviationModel.queryData({
searchString: req.params.airport_id
}, "airlinesByAirport", function (err, airlines) {
if (err) {
next(err);
}
res.end(JSON.stringify(airlines));
});
});
/*
Airlines.
*/
/**
* @api {get} /airlines/?airline_id=:airline_id Get airlines from airline_id.
* @apiVersion 0.0.1
* @apiName GetAirlines
* @apiDescription Your retrieve the information of an airline, as a param
* you can use the wildcard '%'
* @apiGroup Airlines
*
* @apiParam (airlines) {String} airline_id airline_id of the airline.
* @apiExample Example usage:
* curl -i 'http://localhost:8081/airlines/?airline_id=American_Airlines'
*
* @apiSuccessExample {json} American Airlines
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 280
* [{"airline_id":"American_Airlines",
* "name":"American Airlines, Inc.",
* "logo_url":"//upload.wikimedia.org/wikipedia/en/thumb/2/23/American_Airlines_logo_2013.svg/300px-American_Airlines_logo_2013.svg.png",
* "iata":"AA",
* "icao":"AAL",
* "callsign":"AMERICAN",
* "website":"http://www.aa.com"}]
*/
app.get("/airlines/", function (req, res, next) {
if (!req.query.airline_id) {
return next();
}
aviationModel.queryData({
searchString: req.query.airline_id
}, "airlines", function (err, airlines) {
if (err) {
next(err);
}
res.end(JSON.stringify(airlines));
});
});
/**
* @api {get} /airlines/destinations/:airline_id Get destinations from airline_id.
* @apiVersion 0.0.1
* @apiName GetAirlineDestinations
* @apiGroup Airlines
*
* @apiParam (airlines) {String} id of the airline.
* @apiExample Example usage:
* curl -i 'http://localhost:8081/airlines/destinations/American_Airlines'
*
* @apiSuccessExample {json} American Airlines Destinations
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 49841
* [
*
* {"airline_id":"American_Airlines",
* "airport_id":"V._C._Bird_International_Airport",
* "latitude":"17°08′12″N",
* "longitude":"061°47′35″W",
* "name":"V. C. Bird International Airport",
* "nickname":"ANU",
* "iata":"ANU",
* "icao":"TAPA",
* "dd_latitude":17.136666666666667,
* "dd_longitude":-61.793055555555554,
* "airlines_flying":14},
*
* {"airline_id":"American_Airlines",
* "airport_id":"Ministro_Pistarini_International_Airport",
* "latitude":"34°49′20″S",
* "longitude":"58°32′09″W",
* "name":"Ministro Pistarini International Airport",
* "nickname":"Aeropuerto Internacional Ministro Pistarini",
* "iata":"EZE",
* "icao":"SAEZ",
* "dd_latitude":-34.82222222222222,
* "dd_longitude":-58.53583333333333,
* "airlines_flying":47},
*
* {"airline_id":"American_Airlines",
* "airport_id":"Queen_Beatrix_International_Airport",
* "latitude":"12°30′05″N",
* "longitude":"70°00′55″W",
* "name":"Queen Beatrix International Airport",
* "nickname":"Internationale luchthaven Koningin Beatrix\nAeropuerto Internacional Reina Beatrix",
* "iata":"AUA",
* "icao":"TNCA",
* "dd_latitude":12.501388888888888,
* "dd_longitude":-70.01527777777778,
* "airlines_flying":28}
* // until complete all the destinations.
* ]
*/
app.get("/airlines/destinations/:airport_id", function (req, res, next) {
if (!req.params.airport_id) {
return next();
}
aviationModel.queryData({
searchString: req.params.airport_id
}, "airlineDestinations", function (err, airportsData) {
if (err) {
next(err);
}
res.end(JSON.stringify(airportsData));
});
});
/**
* @api {get} /airlines/data/?name=:name Get cities from name.
* @apiVersion 0.0.1
* @apiName QueryAirlineCities
* @apiGroup Airlines
*
* @apiParam (airlines) {String} name of the airline.
* @apiExample Example usage:
* curl -i 'http://localhost:8081/airlines/cities/?name=American%Airlines%'
*
* @apiSuccessExample {json} American Airlines cities
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 17685
* [{"airport_id":"V._C._Bird_International_Airport","name":"American Airlines, Inc.","city_id":"St._John%27s,_Antigua_and_Barbuda"},
* {"airport_id":"Ministro_Pistarini_International_Airport","name":"American Airlines, Inc.","city_id":"Buenos_Aires"},
* {"airport_id":"Queen_Beatrix_International_Airport","name":"American Airlines, Inc.","city_id":"Oranjestad,_Aruba"},
* {"airport_id":"Sydney_Airport","name":"American Airlines, Inc.","city_id":"Sydney"},
* {"airport_id":"Lynden_Pindling_International_Airport","name":"American Airlines, Inc.","city_id":"Nassau,_Bahamas"},
* {"airport_id":"Grantley_Adams_International_Airport","name":"American Airlines, Inc.","city_id":"Bridgetown,_Barbados"},
*
* // until complete all the cities.
* ]
*/
app.get("/airlines/cities/", function (req, res, next) {
if (!req.query.name) {
return next();
}
aviationModel.queryData({
searchString: req.query.name
}, "citiesByAirline", function (err, airportsData) {
if (err) {
next(err);
}
res.end(JSON.stringify(airportsData));
});
});
/**
* @api {get} /airlines/:type/:value/:method Get specific airline data.
* @apiVersion 0.0.1
* @apiName GetAirlineData
* @apiGroup Airlines
*
* @apiParam (airlines) {String} type name | logoLink | iata | icao | callsign | website.
* @apiParam (airlines) {String} value the value according to the type specified.
* @apiParam (airlines) {String} method name | logoLink | iata | icao | callsign | website
*
* @apiExample Example usage:
* curl -i http://localhost:8081/airlines/airline_id/American_Airlines/website
*
* @apiSuccessExample {json} American Airlines website
* HTTP/1.1 200 OK
* X-Powered-By: Express
* Content-Type: application/json
* Connection: keep-alive
* Content-Length: 19
*
* "http://www.aa.com"
*/
app.get("/airlines/:type/:value/:method", function (req, res, next) {
// if (!req.query.name) {
// return next();
// }
aviationModel.getAirlineData({
type: req.params.type,
value: req.params.value,
method: req.params.method
}, function (err, airlineData) {
if (err) {
next(err);
}
res.end(JSON.stringify(airlineData));
});
});
/**
* @api {get} /geoip/ Retrieves information about the user IP.
* @apiVersion 0.1.3
* @apiName User
* @apiGroup GeoIp
*
* @apiExample Example usage:
* curl -i http://localhost:8081/geoip/
*/
app.get("/geoip/", function (req, res, next) {
var ip = req.headers["x-forwarded-for"] || req.ip;
var service = process.env.AVIATION_GEO_IP_SERVICE;
if (!ip || !service) {
return res.send(404, {});
}
request
.get(service + ip)
.end(function(err, ipRes) {
if (err) {
return next(err);
}
res.send(ipRes.body);
});
});
// By default the root will redirect to the docs. Making this a
// 302 in case we want to move the docs to /docs in the future
app.get("/", function (req, res) {
res.redirect(302, "https://cristobal-io.github.io/aviation-api/");
});
var port = process.env.PORT || 8081;
var server = app.listen(port, function (err) {
if (err) {
throw err;
}
debug("Listening on http://localhost:" + port);
});
app.use(errorHandler);
function errorHandler(err, req, res, next) {
if (res.headersSent) {
return next(err);
}
res.status(500);
debug("error", {
error: err
});
res.end();
}
module.exports.server = server;
process.on("SIGTERM", server.close);