diff --git a/imports/startup/server/rest.js b/imports/startup/server/rest.js index 3e919d5..4c8fd86 100644 --- a/imports/startup/server/rest.js +++ b/imports/startup/server/rest.js @@ -8,6 +8,9 @@ import { check } from 'meteor/check'; import SiteSettings from '/imports/api/SiteSettings/SiteSettings'; import ActiveFiresCollection from '/imports/api/ActiveFires/ActiveFires'; import { countRealFires } from '/imports/api/ActiveFires/server/countFires'; +import { whichAreFalsePositives, firesUnion } from '/imports/api/FalsePositives/server/publications'; +import FalsePositives from '/imports/api/FalsePositives/FalsePositives'; +import Industries from '/imports/api/Industries/Industries'; Meteor.startup(() => { const uptime = new Date(); @@ -79,41 +82,71 @@ Meteor.startup(() => { } }); + function getFires(route, full) { + const lat = Number(route.urlParams.lat); + const lng = Number(route.urlParams.lng); + const km = Number(route.urlParams.km); + const { token } = route.urlParams; + check(lng, NumberBetween(-180, 180)); + check(lat, NumberBetween(-90, 90)); + check(km, NumberBetween(0, Meteor.isDevelopment ? 1000 : 100)); + check(token, String); + + if (token !== Meteor.settings.private.internalApiToken) { + console.warn(`WARNING: Query for fires in ${lat}, ${lng} in ${km} km radius with wrong token`); + return { error: 'Unauthorized' }; + } + + console.log(`Query for fires in ${lat}, ${lng} in ${km} km radius`); + + const fires = ActiveFiresCollection.find({ + ourid: { + $near: { + $geometry: { + type: 'Point', + coordinates: [lng, lat] + }, + $maxDistance: km * 1000, + $minDistance: 0 + } + } + }, { + fields: { + lat: 1, + lon: 1, + when: 1, + scan: 1 + } + }); + + if (!full) { + return { total: fires.count(), real: countRealFires(fires) }; + } + + // TODO only get real + const firesA = fires.fetch(); + if (firesA.length > 0) { + const union = firesUnion(fires); + const falsePos = whichAreFalsePositives(FalsePositives, union); + const industries = whichAreFalsePositives(Industries, union); + return { fires: firesA, falsePos: falsePos.fetch(), industries: industries.fetch() }; + } + return { fires: [] }; + } + + // Maps to: /api/v1/fires-in/:lat/:lng/:km // 100 km max // Ex: http://127.0.0.1:3000/api/v1/fires-in/token/38.736946/-9.142685/100 apiV1.addRoute('fires-in/:token/:lat/:lng/:km', { authRequired: false }, { get: function get() { - const lat = Number(this.urlParams.lat); - const lng = Number(this.urlParams.lng); - const km = Number(this.urlParams.km); - const { token } = this.urlParams; - check(lng, NumberBetween(-180, 180)); - check(lat, NumberBetween(-90, 90)); - check(km, NumberBetween(0, 100)); - check(token, String); + return getFires(this, false); + } + }); - if (token !== Meteor.settings.private.internalApiToken) { - console.warn(`WARNING: Query for fires in ${lat}, ${lng} in ${km} km radius with wrong token`); - return { error: 'Unauthorized' }; - } - - console.log(`Query for fires in ${lat}, ${lng} in ${km} km radius`); - - const fires = ActiveFiresCollection.find({ - ourid: { - $near: { - $geometry: { - type: 'Point', - coordinates: [lng, lat] - }, - $maxDistance: km * 1000, - $minDistance: 0 - } - } - }); - - return { total: fires.count(), real: countRealFires(fires) }; + apiV1.addRoute('fires-in-full/:token/:lat/:lng/:km', { authRequired: false }, { + get: function get() { + return getFires(this, true); } }); });