UNPKG

aviation-api

Version:

[![Build Status](https://travis-ci.org/cristobal-io/aviation-api.svg?branch=master)](https://travis-ci.org/cristobal-io/aviation-api)

666 lines (613 loc) 21.1 kB
"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°2230″W", * "airport_id":"San_Francisco_International_Airport", * "latitude":"37°37′08″N", * "longitude":"122°2230″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°2230″W","distance":0}, * {"airport_id":"Half_Moon_Bay_Airport","name":"Eddie Andreini Sr. Airfield\nHalf Moon Bay Airport","latitude":"37°3048″N","longitude":"122°3004″W","distance":16183.33}, * {"airport_id":"San_Carlos_Airport_(California)","name":"San Carlos Airport","latitude":"37°3043″N","longitude":"122°1458″W","distance":16262.58}, * {"airport_id":"Oakland_International_Airport","name":"Oakland International Airport","latitude":"37°4317″N","longitude":"122°1315″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°2230″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°2230″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°5923″N","longitude":"122°0325″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°3048″N","longitude":"122°3004″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°3932″N","longitude":"122°0718″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°2454″N","longitude":"122°0254″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°4317″N","longitude":"122°1315″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°2740″N","longitude":"122°0654″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°2230″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°3043″N","longitude":"122°1458″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°4735″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°4920″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°3005″N", * "longitude":"70°0055″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);