More rest methods

This commit is contained in:
vjrj 2018-06-12 08:05:44 +02:00
parent 5e5ecb69b8
commit ec0edf4475

View file

@ -8,6 +8,9 @@ import { check } from 'meteor/check';
import SiteSettings from '/imports/api/SiteSettings/SiteSettings'; import SiteSettings from '/imports/api/SiteSettings/SiteSettings';
import ActiveFiresCollection from '/imports/api/ActiveFires/ActiveFires'; import ActiveFiresCollection from '/imports/api/ActiveFires/ActiveFires';
import { countRealFires } from '/imports/api/ActiveFires/server/countFires'; 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(() => { Meteor.startup(() => {
const uptime = new Date(); 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 // Maps to: /api/v1/fires-in/:lat/:lng/:km
// 100 km max // 100 km max
// Ex: http://127.0.0.1:3000/api/v1/fires-in/token/38.736946/-9.142685/100 // 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 }, { apiV1.addRoute('fires-in/:token/:lat/:lng/:km', { authRequired: false }, {
get: function get() { get: function get() {
const lat = Number(this.urlParams.lat); return getFires(this, false);
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);
if (token !== Meteor.settings.private.internalApiToken) { apiV1.addRoute('fires-in-full/:token/:lat/:lng/:km', { authRequired: false }, {
console.warn(`WARNING: Query for fires in ${lat}, ${lng} in ${km} km radius with wrong token`); get: function get() {
return { error: 'Unauthorized' }; return getFires(this, true);
}
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) };
} }
}); });
}); });